这只是我的构想而已 (请参考):
将程序分成几部份,每部分做自己的事,极度模组化:
(1) 建构模组 (读取模组的边缘线,将部分合成集团,然后用一些曲线去修正边缘)
(2) 模组绘图
(3) 移动模组
(4) 判断碰撞
(5) 物体碰撞行为 (能量损失、转矩、压缩量、判断精准碰撞时间点、判断反弹)因为现在只讨论 "判断碰撞",所以第五项不考虑
模组 (Model) ,就是构成物体的一整个东西
而模组的边缘,可以用 函数式来表示 (例如半椭圆 f(x)=Sqrt(1-(x/3)^2) )
另外一个部分负责 移动模组,那肯定没问题,而判断 "何时会碰撞" 会比较困难
正确地来说,应该是要在程式运行中判断 "已经碰撞了吗?"
因此,要算数学了
不管是什么函数,判断何时有交集最简单的方法就是 "解联立"
所以只要一条一条线去互相检查 "当联立的解不是无解的时候",就是碰撞发生了
可以下载两个程式,有助于了解
Physion 与 SpeQ Mathematics
SpeQ 是一款数学+图表的软体
以上的表达式:
复制程式
f1(x)=Sqrt(1-(x/3)^2)
f2(x)=-Sqrt(1-(x/3)^2)
col(x)=-x*3+6
Plot(f1(x))
Plot(f2(x))
Plot(col(x))
Physion 是一款模拟物理性质的软体,可以看看这个来构想
所以实作部分,推荐用线段组成一个正方形,设定四条线是联合的
加上一个阵列设定每条线初始的运动方向
然后一个 Timer 中规中矩的按照 阵列每个项目的内容去让 线段移动 (由于四条线组成正方形,因此移动起来还是正方形)
Timer 最后还要加上 判断碰撞 的函数
而这个函数,即是检查 四条线与另外一条线 (当作墙壁,被撞的物体的一条线) 的联立方程式是否有解
有解的话还要特别注意
如果物体还会加速,不规则碰撞,运动等 (如果是 传统贪吃蛇 等速、矩形介面 就不用考虑这点)
因为 Timer 的检查时间不能太短,在庞大的 2D 绘图软体中,如果这样检查会浪费效能 (P.S. 可以检查 X, Y 的值,是先检查是否有可能交集,有可能再来进入 函数重点部分,例如 一条线 X= 1~3 另外的一条线 X=5~8 这样就不可能会碰撞)
当有解的时候,通常物体都已经与被碰撞的物体交集有一段时间,所以可以在函数加上 +t 这样,在已知的会碰撞的时间范围内,来去解联立
就能得出正确的碰撞时间与位置
就这样判断完成,然后把物体隐藏,或放出 爆炸、粉碎一些 Sprites 特效
其他的就交给绘图的模组吧