← 返回 Day 90 正文

Day 90 · 练习与清单

Day 090 — 碰撞检测与动画 · 练习清单

✅ 今日完成清单


📝 基础练习

练习 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:实现粒子爆炸效果

当物体碰撞时,产生粒子爆炸效果: - 粒子从碰撞点向四周飞散 - 粒子受重力影响 - 粒子逐渐变透明 - 粒子数量与碰撞速度相关


🤔 思考题

  1. 为什么游戏通常用 AABB 做初步检测,再用其他方法做精确检测?

  2. 在高速运动的物体中,如何防止"穿透"问题(物体从墙的一边跳到另一边)?

  3. 四叉树在什么情况下会退化成链表?如何避免?

  4. 帧动画的帧率应该和游戏帧率同步吗?为什么?

  5. 碰撞检测的频率应该如何确定?太高浪费性能,太低会导致穿透。