当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/274322.html

相关文章:

  • c++设计模式:简单工厂模式
  • C++STL-list
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • 线性回归的从零开始实现(详解部分疑问)
  • 【三】ObservableCollection 与 List 的区别
  • RK3566/RK3568 Android11 CAN开发(内核配置+测试验证+安卓app开发)
  • 2025 年第十五届 APMCM 亚太地区大学生数学建模竞赛C题 基于Quantum Boosting的二分类模型问题
  • 5G标准学习笔记15 --CSI-RS测量
  • 【龙泽科技】新能源汽车维护与动力蓄电池检测仿真教学软件【吉利几何G6】
  • 深入理解C语言内存空间、函数指针(三)(重点是函数指针)
  • Redis 主从复制及哨兵模式模拟部署
  • 3.检查函数 if (!CheckStart()) return 的妙用 C#例子
  • PBR渲染
  • 【网络安全】理解安全事件的“三分法”流程:应对警报的第一道防线
  • leaflet【十二】自定义图层——海量数据加载
  • 安全监测预警平台的应用场景
  • 机器学习数据集加载全攻略:从本地到网络
  • Git Submodule 介绍和使用指南
  • FS820R08A6P2LB——英飞凌高性能IGBT模块,驱动高效能源未来!
  • Vscode 下载远程服务器失败解决方法
  • Jenkins 版本升级与插件问题深度复盘:从 2.443 到 2.504.3 及功能恢复全解析
  • 和鲸社区深度学习基础训练营2025年关卡2(3)pytorch
  • 限流算法
  • GT IP核仿真测试
  • 关于大模型引用特定网页或文章的思考
  • 稳石氢能受邀参加亚洲氢能与燃料电池技术应用论坛,荣获2025中国制氢装备技术创新企业。
  • P1484 种树,特殊情形下的 WQS 二分转化。
  • 【leetcode】1486. 数组异或操作
  • 国际学术期刊IJCAST发布最新一期论文
  • 声明式 vs 编程式:Spring事务管理全对比