最近打算做一个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

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

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

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

  2. html5物理引擎对比,GTA历代作品物理引擎大PK!玩家对比后发现,原来4代这么厉害?...

    01 侠盗猎车手简介-- 如果有读者非常喜爱角色扮演题材游戏,那么你们一定会知道,在游戏界,有一款名为侠盗猎车手的游戏非常出名,它真实有趣,并且在自由度方面非常有着非常高的造诣,因为品质足够高,这使得 ...

  3. 「雕爷学编程」Arduino动手做(35)——模拟量声音传感器

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里 ...

  4. 【雕爷学编程】Arduino动手做(77)---模拟灰度传感器

    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的.鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为 ...

  5. 游戏开发物理引擎PhysX研究系列:将重力模拟关闭

    参考: Rigid Body Dynamics - NVIDIA PhysX SDK 4.1 Documentation 说明: PxActor::setActorFlag(PxActorFlag:: ...

  6. 【日常点滴016】python游戏库arcade结合Tiled map editor地图编辑器和Pymunk物理引擎制作游戏过程记录,并最终打包为exe文件

    独此一家,建议收藏 前言 一.创建一个空白窗口 step001.py代码示例 二.创建很多全局能用的常量 step002.py代码示例 三.创建实例变量即代表各种精灵等的变量 step003.py代码 ...

  7. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:"如果说我看得比较远的话,那是因为我站在 ...

  8. Havok物理引擎_百度百科

    Havok 来源:百度百科  目录 Havok概述 Havok的组成 Havok Physic Havok FX Havok Animation Havok Behavior Havok Cloth ...

  9. BEPU物理引擎碰撞系统的架构与设计

    前面我们讲解了如何监听物理引擎的碰撞事件, 在物理引擎内核中如何架构与设计碰撞规则,使得物理Entity与周围的物理环境产生碰撞时,如何灵活的控制物理碰撞,本节給大家详细的讲解BEPUphysicsi ...

最新文章

  1. 网络推广恶意点击js_昆明百度推广电话方法(百度推广)按效果付费_有效商机咨询...
  2. iOS开发 解决UITapGestureRecognizer手势与UITableView的点击事件的冲突
  3. 初学php时一些术语以及一些基础知识
  4. 使用Fresco加载图片
  5. .Net Core 环境安装
  6. boost::hana::power用法的测试程序
  7. java位运算求幂,程序员必学:快速幂算法
  8. React Native随笔 2--重要函数
  9. Linux命令解释之vim
  10. 实战Swiper:利用Swiper制作手机全屏相册
  11. c语言加密字母向右移两位,C语言二进制除法用左右移位来表示
  12. redis unlink
  13. 数组,异质结构以及指针的详解
  14. 进程监控工具 Procmon有Linux版本了
  15. 关于U盘装系统的那点破事儿---No bootable device found
  16. 0基础学python培训班_[长文] 学Python不用培训班,一篇文章带你入门
  17. 区块链-链上云计算应用技术沙龙
  18. 年薪达 35 万元,杭州成为薪酬最高的城市,北上、重庆通勤时间最久,揭晓 2022 年最具潜力的软件名城!...
  19. 硬件-----电路基础(上)
  20. GMAT750分冲刺-Quantitative

热门文章

  1. 继承,is,as,多态
  2. Coder-Strike 2014 - Finals (online edition, Div. 2) A. Pasha and Hamsters
  3. Android应用中Back键的监听及处理
  4. JS获取屏幕浏览器网页高度和宽度属性
  5. 职场交流:一位软件工程师的7年总结
  6. numpy T、transpose()函数、swapaxes()函数
  7. matlab 小括号
  8. 1.6.4 分离原则: 策略同机制分离,接口同引擎分离
  9. HDOJ 1030 Delta-wave
  10. ad如何镜像器件_使用 Dockerfile 制作镜像