制作一款打飞机游戏79:道具拾取系统
道具拾取系统概述
道具拾取系统可以分解为三个阶段:生成道具、更新道具、绘制道具。这是每个游戏对象都需要经历的基本流程。但在深入之前,我想先分享一下在开发过程中遇到的一些挑战和决策过程。
挑战与决策
最初,我考虑过复用现有的系统来实现道具拾取,比如利用粒子系统或者敌人系统。粒子系统虽然动画效果丰富,但它更适合用于短暂的屏幕效果,而非长期存在的、与玩家交互的对象。而敌人系统虽然拥有复杂的行为逻辑,但道具的移动方式和行为模式与敌人截然不同。最终,我决定为道具拾取系统创建一个独立的实现,包括自己的数组和更新函数,以确保其独特的行为模式得以实现。
道具设计与实现
道具设计
我们目前有两种类型的道具:奶牛道具和星星道具。奶牛道具虽然可爱,但在视觉上不够明确其价值。相比之下,星星道具更能直观地传达出“得分”或“有价值”的信息。因此,在设计星星道具时,我采用了镜像功能,以非均匀像素数量进行旋转,使其更加生动有趣。
奶牛道具的实现问题
在实现奶牛道具时,我遇到了一个问题:现有的奶牛精灵图不够全面,缺少某些角度的视图,且部分精灵图有轮廓,部分没有。为了解决这个问题,我考虑了几种方案,包括调整现有精灵图、绘制新的精灵图或者采用其他替代方案(如使用不可交互的地面敌人来模拟奶牛)。最终,我决定暂时使用现有精灵图,并在后续根据需要进行优化。
道具动画与行为
为了让道具更加生动有趣,我为奶牛和星星道具都设计了动画效果。奶牛道具会进行旋转动画,而星星道具则保持静态。此外,我还为奶牛道具添加了一个“泡泡”效果,使其看起来像是在空间中漂浮,从而解决了原本看起来有些奇怪的飞行效果。
绘制泡泡函数
def draw_bubble(x, y, width, height, color):
# 使用自定义的oval函数绘制椭圆
oval(x, y, width, height, color)
更新道具位置,添加泡泡效果
def update_pickup(pickup):
# 计算泡泡的动画效果
bubble_x_offset = math.sin(time) * 4
bubble_y_offset = math.cos(time) * 4
pickup.x += pickup.sx
pickup.y += pickup.sy
# 绘制泡泡
draw_bubble(pickup.x + bubble_x_offset, pickup.y + bubble_y_offset, 7, 7, 7)
# 绘制奶牛道具
draw_sprite(pickup.x, pickup.y, pickup.sprite)
道具生成与移动
道具会在消灭敌人时生成,并从敌人消失的位置飞出。为了使道具的运动更加自然,我为它们添加了一些随机性,确保每个道具都以略微不同的速度和方向移动。此外,我还实现了一个缓动效果,使道具能够逐渐加速到其最终速度,而不是瞬间达到。
生成道具函数
def spawn_pickup(x, y):
pickup = {
‘x’: x,
‘y’: y,
‘sx’: random.uniform(-1, 1), # 随机速度X分量
‘sy’: random.uniform(1, 2), # 随机速度Y分量
‘age’: 0,
‘sprite’: cow_sprite # 默认为奶牛道具
}
pickups.append(pickup)
更新所有道具
def update_pickups():
for pickup in pickups:
update_pickup(pickup)
pickup.age += 1
# 缓动效果
pickup.sx = (pickup.sx * 9) / 10
pickup.sy = (pickup.sy * 9) / 10