制作一款打飞机游戏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
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值