Day 090 — 碰撞检测与动画 · 练习清单
✅ 今日完成清单
- [ ] 理解 AABB 碰撞检测的原理
- [ ] 掌握圆形碰撞检测
- [ ] 实现矩形-圆形混合碰撞
- [ ] 理解碰撞响应(反射、停止、分离)
- [ ] 掌握帧动画系统
- [ ] 理解动画状态机
- [ ] 使用缓动函数和插值
- [ ] 了解四叉树空间分区
📝 基础练习
练习 1:碰撞检测函数
实现一个函数,检测一个点是否在矩形内:
python
def point_in_rect(px, py, rect_x, rect_y, rect_w, rect_h):
"""检测点(px,py)是否在矩形内"""
pass
练习 2:AABB 碰撞
补全以下函数,使其正确检测两个矩形是否碰撞:
python
def check_collision(a, b):
"""
a: {"x": 0, "y": 0, "w": 50, "h": 50}
b: {"x": 30, "y": 30, "w": 50, "h": 50}
返回: True/False
"""
pass
练习 3:简单动画
实现一个动画类,能播放多帧动画:
python
class SimpleAnimation:
def __init__(self, frames, fps):
pass
def update(self, dt):
pass
def get_current_frame(self):
pass
🔥 进阶挑战
挑战 1:实现矩形旋转碰撞检测
当矩形可以旋转时,AABB 不再准确。使用 SAT(分离轴定理)实现旋转矩形的碰撞检测。
提示:需要将矩形的四个顶点旋转后,检查在各轴上的投影是否重叠。
挑战 2:实现弹跳物理
模拟一个球在矩形房间内弹跳,要求: - 球碰到墙壁反弹 - 球有重力影响 - 球有能量损失(逐渐停止)
挑战 3:实现粒子爆炸效果
当物体碰撞时,产生粒子爆炸效果: - 粒子从碰撞点向四周飞散 - 粒子受重力影响 - 粒子逐渐变透明 - 粒子数量与碰撞速度相关
🤔 思考题
-
为什么游戏通常用 AABB 做初步检测,再用其他方法做精确检测?
-
在高速运动的物体中,如何防止"穿透"问题(物体从墙的一边跳到另一边)?
-
四叉树在什么情况下会退化成链表?如何避免?
-
帧动画的帧率应该和游戏帧率同步吗?为什么?
-
碰撞检测的频率应该如何确定?太高浪费性能,太低会导致穿透。