本周主要学习了基于 C# WinForms 开发的一款名为“雷霆战机”的射击类小游戏的完整实现,采用面向对象的设计思想,将游戏元素抽象为各类对象,核心实现了敌机生成、子弹发射、碰撞检测、生命值管理、游戏结束等核心逻辑。以下是对各部分的详细解析:

一、核心抽象类:FlyingObject

作为所有飞行类游戏元素的基类(抽象类),定义了飞行对象的通用属性和行为,是整个游戏的核心抽象层:

  • 核心属性X/Y(坐标)、Width/Height(宽高)、flag(是否被销毁)、HurtCount(受击次数,用于BOSS/大飞机的多血条逻辑);
  • 构造函数:支持两种初始化方式(随机生成坐标的敌机/固定坐标的英雄机/子弹等);
  • 抽象方法GetImage()(获取对象显示图片)、DestoryImage()(获取销毁动画图片)、Step()(对象移动逻辑),强制子类实现个性化行为;
  • 通用方法
    • PaintObject():绘制对象到画布;
    • Destory():绘制销毁动画;
    • hit():碰撞检测逻辑(判断当前对象与另一飞行对象是否重叠)。

二、游戏元素子类(继承自 FlyingObject

所有游戏可见元素均继承自 FlyingObject,实现各自的个性化逻辑:

游戏子类 功能说明
Hero 玩家操控的英雄机:
1. 加载英雄机切换动画图片;
2. GetBul() 生成子弹;
3. moveTo() 跟随鼠标移动;
AirPlane 小敌机:
1. 加载普通/销毁动画图片;
2. 移动逻辑(垂直向下,速度4);
3. 单次击中即销毁。
BigPlane 大敌机:
1. 加载普通/销毁动画图片;
2. 移动速度2(比小敌机慢);
3. 需要2次击中才销毁(HurtCount%2)。
Bee 蜜蜂(特殊敌机):
1. 加载普通/销毁动画图片;
2. 移动逻辑(垂直向下+水平左右反弹);
3. 单次击中销毁。
Boss BOSS机:
1. 加载普通/销毁动画图片;
2. 移动速度1(最慢);
3. 需要4次击中才销毁(HurtCount%4)。
Bullet 子弹:
1. 加载子弹图片;
2. 移动逻辑(垂直向上,速度3)。
Life 生命值图标:
加载生命值图片。
GameOver 游戏结束界面:
1. 加载“游戏结束”图片,游戏结束时显示。
Sky 游戏背景:
1. 加载背景图片。

三、辅助工具类

1. FlyGather

自定义的飞行对象集合类,封装数组操作,解决WinForms中动态管理大量敌机/子弹的问题:

  • 核心属性:_fly(存储飞行对象的数组)、_size(当前元素数量)、_empty(数组容量);

  • 核心方法:

    • AddFly():添加对象(数组满时自动扩容,容量翻倍);
    • RemoveAt():删除指定下标对象(数组拷贝实现,避免空指针);
    • 索引器:通过下标快速获取对象;
    • Count:返回当前元素数量。

    按顺序执行核心游戏循环:

    • ShootAction():每30帧(300ms)随机生成敌机(小敌机/大敌机/蜜蜂/BOSS);
    • BulletAction():每30帧生成一颗子弹;
    • StepAction():调用所有敌机/子弹的Step()方法,实现移动;
    • RemoveAction():移除越界对象(敌机出屏幕下方、子弹出屏幕上方);
    • HitAction():碰撞检测(子弹击中敌机、敌机撞击英雄机);
    • OverAction():判断游戏结束(生命值为0时停止定时器,显示游戏结束);
    • Invalidate():触发重绘,更新界面。
  1. 交互逻辑

    • Form1_MouseMove:英雄机跟随鼠标坐标移动;
    • Form1_Load:开启双缓冲,解决界面闪烁问题。
  2. 游戏规则

    • 玩家初始3条命,被敌机撞击则减命,命为0游戏结束;
    • 不同敌机需不同击中次数(小敌机/蜜蜂1次、大敌机2次、BOSS 4次);
    • 子弹越界销毁,敌机越界自动移除。

更多推荐