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

   最近打算做一个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,一经查实,立即删除!

相关文章

GoldenGate DDL双向复制

继续上一篇的实验。 节点说明&#xff1a; dd1(源库)--->>kf2(目标库) dd1(目标库)<<---kf2(源库) 在配置反向复制过程中&#xff0c;可暂时把源库和目标库调换位置&#xff0c;配置基本上雷同。 但在官网上有说明要注意的一个地方&#xff1a; Do ei…

转载|pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

原文链接&#xff1a;https://www.cnblogs.com/heiao10duan/p/9373237.html 原因&#xff1a; 使用了多线程&#xff0c;多线程共享了同一个数据库连接&#xff0c;但每个execute前没有加上互斥锁 方法&#xff1a; 方法一&#xff1a;每个execute前加上互斥锁 lock.acquire…

JSF入门

1. 简介 JSF技术是Sun公司在2004年发布的用于开发Web应用的框架。当前版本是2.2&#xff0c;由JSR344规范定义。它是Java EE 7推荐的Web标准框架。Mojarra(https://javaserverfaces.java.net/)是Oracle官方采用的JSF的参考实现&#xff0c;其他的参考实现还有Apache基金的MyFac…

nyist 488 素数环

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

Android System分区大小异常

平台&#xff1a;Freescale &#xff0f; Android 4.2.2 问题描述&#xff1a; 用 df 命令&#xff0c;看到/system分区大小275M。 用 busybox fdisk -l /dev/block/mmcblk0p5&#xff0c;看到 536M。 Freescale的刷机工具是Mfgtool&#xff0c;分区的动作在mksdcard-android.s…

python数据库连接池使用

在转载|pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0这一篇中&#xff0c;我使用了方法一。接下来试试方法三&#xff0c;方法三和方法二其实意义差不多&#xff0c;但是对于数据库的连接并不是交由程序员管理而是交由连接池管理了&#xff0…

.Net入门-部署问题

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

pymysql.err.OperationalError: (1203, “User root already has more than ‘max_user_connections‘ active

max_connections 是指MySQL服务器的最大连接数。即所有用户最大连接数的和。 max_user_connections 是指MySQL中单个用户的最大连接数。 这里说明当前用户的连接数大于了单个用户的最大连接数&#xff0c;需要扩大连接数&#xff1a; mysql> show variables like %connect%…

北京行——JSP入门与Servlet精通

Servlet技术 用来动态生成 网页数据资源Servlet生成HTML 页面数据时&#xff0c;所有内容都是通过 response.getWriter response.getOutputStream 向浏览器输出的 <html> <head> </head> <body> Hello </body></html> 用Servlet 输出流打印…

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

可以参考一波&#xff1a;https://stackoverflow.com/questions/16573332/jsondecodeerror-expecting-value-line-1-column-1-char-0 1、json格式不对引起的错误 加上if json_rep.content:判空操作 json_rep requests.post(url monitor_url, headers monitor_header,json …

WINDOWS系统Eclipse+NDK+Android + OpenCv

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

ural 1910. Titan Ruins: Hidden Entrance(Titan Ruins系列题目)

这是Titan Ruins系列第一道题&#xff0c;以后慢慢更新。 赤裸裸滴阅读理解题&#xff0c;大意就是找到三个连在一起的数&#xff0c;使其之和最大&#xff0c;输出的第一个数是这三个数的和&#xff0c;第二个数是中间那个数所在的位置。水题一道&#xff0c;很简单。 1 #incl…

python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host=‘‘, port=80): Max retries e

对于问题&#xff1a;python OSError: [Errno 24] Too many open files 原因:超出了进程同一时间最多可开启的文件数. 解决方案P: 使用ulimit -n查看进程同一时间最多可开启的文件数 mac默认是256&#xff0c;linux是1024 修改 sudo vim /etc/security/limits.conf 这个文件的最…

Android 之视频监控

Android 视频监控已经有示例了&#xff0c;如http://www.open-open.com/lib/view/open1346400423609.html完全可以实现简单的监控功能。但是&#xff0c;如果想要在手机上监控另外一个手机就需要做一些改动了。 其中&#xff0c;手机A实现的功能和上文中的一样&#xff0c;主要…

Max retries exceeded with url 解决方案

目录问题解决方案keep alive 与close使用场景问题解决方案 在上一篇问题解决中&#xff1a;python OSError: [Errno 24] Too many open files | HTTPConnectionPool(host‘‘, port80): Max retries e 有提到修改本地进程最大文件数来避免Max retries exceeded with url 报错&…

正确理解JavaScript

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

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

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

py脚本:linux系统下定时清理文件

linux清空文件内容的三种方法&#xff1a; 1.使用vi/vim命令打开文件后&#xff0c;输入"%d"清空&#xff0c;后保存即可。但当文件内容较大时&#xff0c;处理较慢&#xff0c;命令如下&#xff1a; vim file_name :%d :wq2.使用cat命令情况&#xff0c;命令如下&a…

Process类:启动和停止本地系统进程

Process.Start 方法 (String, String) 通过指定应用程序的名称和一组命令行参数来启动一个进程资源。&#xff08;并将该资源与新的 Process 组件相关联&#xff09; 如果没有启动资源&#xff0c;则返回null Process.Start("d:\\0.jpg"); Process.StartInfo 属性 获…

NYOJ2括号配对问题

括号配对是最基本的栈的问题&#xff0c;它是栈入门的经典题目&#xff0c;思路是&#xff0c;如果是左括号直接进栈&#xff0c;如果是右括号&#xff0c;这时就要比较栈顶的元素与他是否匹配&#xff0c;如果匹配则出栈&#xff0c;否则进栈&#xff0c;下面是代码的实现&…