不使用物理引擎,自己动手做真实物理的模拟投篮游戏

   最近打算做一个2D投篮游戏,由于对于BOX2D等物理引擎并不熟悉,加之一开始低估了游戏所需要的碰撞检测复杂度,认为仅仅涉及4面墙,篮球,篮板,篮筐,篮网的碰撞检测并不复杂。因此决定自己实现所需要的碰撞检测。结果实际开始做时磕磕碰碰遇到了许多问题。

    1、如何实现像素级碰撞检测。

   as3原生的hitTestObject只能检测矩形,对于圆形等其他形状就不适用了;打算用hitTestPoint来检测篮球与篮板四个边角,篮筐前后框点,在实践尝试中发现是有问题的,在涉及物体旋转的情况下检测就不精确了。因此只能自己实现像素级碰撞检测。在网上查找了许多资料,终于找到比较好的解决思路:利用叠加模式检测两物体不透明像素部分。

   分享一位国外大牛写的不规则物体像素级碰撞检测算法及详解

 2、计算碰撞物体的反弹速度及方向。

   我们可以常见的使用BOX2D等物理引擎实现的游戏,如桌球游戏,球与球相撞、球与桌的相撞,根据碰撞角度不同,反弹速度和方向也是不同的。把事情交给物理引擎解决,当然是高枕无忧,如果想自己计算出反弹速度及方向。那就不仅是写写代码的问题,而是要通过数学、物理来解决。基本该问题分为两部分解决:

  a)恢复现场:由于物体的移动是按帧改变的,所以物体位置变化不是连续的,而是离散的。当碰撞发生时,两物体已经相交重叠了,而实际计算反弹速度和方向,需要在物体刚刚相碰撞一刻的情况下进行。因此需要将两物体合理地恢复到刚刚碰撞的位置。实际物理引擎的处理非常复杂,而本游戏则是采用简单方法处理。将球按反速度一点点回退,直到球与碰撞点的距离刚好为球的半径。

  b)利用向量原理计算反弹速度及方向。实话说,自己凭空想的话怎么也想不到是通过向量的思路得出答案。刚开始做时琢磨了很久,查了一些资料,终于在一个帖子找到答案,这不就是高中学的空间向量嘛?赤果果的数学题啊~~

  向量几何在游戏编程中的使用

 

  

我们现在的任务是:已知物体的速度向量S和边界向量b,求它的反射向量F。我们先来看一下在碰撞过程中都有哪些向量关系:

设b是障碍向量,S是入射速度向量,F是反射速度向量,也就是我们要计算的向量。A是入射角度,A'是反射角度,A=A'。N是b的法向量,即N垂直于b。n是与N共线的向量,n'是N方向的单位向量。T是垂直于N的向量。根据向量加法,现在有关系:

(1) S + n = T
(2) n + T = F

合并,得
F = 2*T - S 

又已知T = S + n,

最终得 F = 2(S + n) - S = S - 2n

 

实际写代码是,Sx,Sy,nx,ny都是可以计算出来的,通过公式最终求出Fx,Fy。

 

3、画出瞄准线。

  许多主流投篮类游戏都能在篮球投出前画出瞄准线。说下实现思路。根据鼠标按下时的位置和当前位置可计算出初始速度和方向。既然知道了速度,就可根据时间计算距离。因此可计算投出后每隔一段时间后(如每隔0.1s),小球的舞台坐标,并依次draw出一个个点,看起来就是一条瞄准线。有个必须要注意的细节。画点的时候,要考虑重力对于垂直速度的改变。并且改变值要与实际小球渲染时的速度改变相同。如渲染时每隔0.1s计算一次重力因素对垂直速度的改变。在瞄准画线时也需要每隔0.1s改变一次垂直速度。只有这样,瞄准线才是正确的。

 

实现过程折腾了很久,解决了以上问题后终于使投篮过程显得比较真实。尽管如此,这样一个自己现实的简单碰撞检测,使用很局限,游戏玩法稍微深挖,像要在场景加入新的物体,就无法胜任了。最终学习了下BOX2D发现也不复杂,还是改成用Box2d物理引擎来做,通过笔者一番蛋疼的折腾后也证实,如果想要认认真真做一个物理游戏,用物理引擎才是正确的做法,把专业任务讲给专业的系统去处理。

这里分享自己做这个小游戏的经验,存当抛砖引玉,希望有人碰到某些特定需求,可以用上这些技巧。

游戏源码下载地址:

不使用物理引擎,自己动手做真实物理的模拟投篮游戏

 

转载于:https://www.cnblogs.com/leoin2012/p/3920712.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376733.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nyist 488 素数环

有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。 为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。 这题在进行判断…

.Net入门-部署问题

学习一门新的语言难免会遇到各种各样的问题,总结一下。 测试环境:windows2008serverIIS7 开发环境: vs2010 问题1:"Unrecognized attribute targetFramework. Note that attribute names are case-sensitive. " 分析: 开…

WINDOWS系统Eclipse+NDK+Android + OpenCv

WINDOWS系统EclipseNDKAndroid OpenCv 参考文档博客 1 NDK环境搭建 http://jingyan.baidu.com/article/5d6edee22d908799eadeec9f.html 2 官方文档 Android.mk与Application.mk如何编写,OpenCV库如何调用 http://docs.opencv.org/trunk/doc/tutorials/introduction…

正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象,有太多程序员将那些他们只是有过非常浅显的了解, 但其实根本就不懂的技术写到他们的简历中,这个现象几乎每种语言都有,但这其中最严重的就要数javascript了。 你不知道你不懂 出现这种状况…

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施,企业主营业务之一为医疗软件,涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中,需要实现各地区分院与总院间的数据库互相访问、视频数…

JAVA_Collection容器

因为项目的需要,今天抽时间把JAVA中的容器复习了一下,为了以后的不时之需,现在把它记下来。 容器有其名,知其意,用来盛放数据的集合,JAVA中为我们提供了三种容器类:set、list、map,三…

控制器中获取Field值

在ASP.NET MVC程序中,我们需要POST Data到制器中,是有很多方法。但是我们想在控制器中,获取Feild值呢?怎样获取?你可以留意到有一个类FormCollection。它能帮助到我们解决这个问题。 举个简单的例子。在ASP.NET MVC应用…

私有RTP协议和标准流媒体协议

先介绍下RTP协议: 实时传输协议RTP(Real-time Transport Protocol)是一个网络传输协议 ,该协议详细说明了在互联网上传递音频和视频的标准数据包格式 。 RTP标准定义了两个子协议 ,RTP和RTCP 数据传输协议RTP&#xff…

从WebRtc学习RTP协议

文章目录TCP为何不适用于实时音视频UDP->RTPRTP协议结构JittbufferRTP扩展头RTP填充数据参考TCP为何不适用于实时音视频 可靠性是以牺牲实时性为代价的。按照TCP原理,当出现极端网络情况时,理论上每个包的时延可达到秒级以上,而且这种时延…

解决ListView异步加载数据之后不能点击的问题

在ListView的onScroll事件中执行异步加载数据,然后使用notifyDataSetChange()函数更新适配器,之后发现listView不能点击了,这问题苦恼了我半天。最后在一篇博文中发现调用listView的requestFocusFromTouch()函数终于解决了这问题。 Java代码…

从WebRtc学习RTCP协议

文章目录RTCP支持的消息类型RTCP协议头WebRTC的反馈报文RTPFB支持的报文类型:PSFB支持的报文类型:参考RTCP是RTP的控制协议.那么RTCP能对RTP做哪些控制呢?其中最为大家熟知的就是 丢包控制。发送端发送数据后,接收端如果发现有RTP…

无锁队列设计思路以及简要代码

文章目录非并发的一写一读环形队列多读多写环形队列非并发的一写一读环形队列 读指针: 1、先判断是否有数据 2、读取数据 3、操作指针 写指针: 1、先判断空间是否足够 2、写入数据 3、操作指针 所以代码也十分简单: bool putqueue(void* pDa…

CPU Cache对于并发编程的影响

文章目录引子CPU Cache对于并发的影响读写顺序对性能的影响字节对齐对Cache的影响小结引子 下面给出两个极其相似的代码&#xff0c;运行出的时间却是有很大差别&#xff1a; 代码一 #include <stdio.h> #include <pthread.h> #include <stdint.h> #includ…

软工之初识

我们之前已经在完全不懂软件工程的情况下&#xff0c;已经做完了两个小系统&#xff0c;虽然能够运行&#xff0c;但其中有很多的问题&#xff0c;学习软工就是让我们在工程学原理的指导之下去开发和设计软件。 软件工程同大多数书讲的都是一样的&#xff0c;首先对软件工程有一…

perf +火焰图使用

以mysqld进程为例&#xff1a; [rootVM-90-225-centos ~]# ps -ef | grep mysqld root 9808 9621 0 19:30 pts/7 00:00:00 grep --colorauto mysqld root 16104 1 0 17:30 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir/usr/loc…

在一个字符串中找到第一个只出现一次的字符

题目&#xff1a;在一个字符串中找到第一个只出现一次的字符&#xff0c;如输入abaccdeff&#xff0c;则输出b&#xff1b;具体实现如下&#xff1a;#include <iostream> #include <string> using namespace std; void FindChar(const string &strBuf) {int nA…

零拷贝机制在文件传输中的使用手法

文章目录文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换零拷贝技术sendfilesendfile SG-DMAmmap writespliceDirect I/O经典应用文件传输&#xff08;读取与发送&#xff09;中的拷贝与上下文切换 如果服务端要提供文件传输的功能&#xff0c;最简单的方式…

POJ 3233 Matrix Power Series 矩阵快速幂 + 二分

题意&#xff1a;求矩阵的次方和 解题思路&#xff1a;最容易想到方法就是两次二分因为 我们可以把一段 A^1 A^2 .......A^K 变成 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) 当k 为奇数的时候 或者 A^1 ..A^(K/2) ( A^1 ..A^(K/2))*(A^(k/2)) A^K 当K 为偶数的时候…

时间序列进行分析的一些手法以及代码实现(移动平均、指数平滑、SARIMA模型、时间序列的(非)线性模型)

文章目录1、移动平均moving average方法weighted average方法2、指数平滑单指数平滑 exponential_smoothing双指数平滑三指数平滑 Triple exponential smoothing3、平稳性以及时间序列建模SARIMA模型4、时间序列的&#xff08;非&#xff09;线性模型时间序列的滞后值使用线性回…