《勇者踪迹》游戏设计

面向对象程序综合设计课程设计报告

一、项目简介

项目 内容
系统简介 该系统为《勇者踪迹》2D动作小游戏,围绕“勇者打怪升级”核心玩法,解决了角色操控、战斗交互、胜负判定等问题。通过Java Swing/AWT技术、键盘监听、碰撞检测、定时器Timer等技术,实现了人物形象绘制、游戏背景适配、勇者移动攻击、怪物随机漫游、血瓶拾取回血、角色状态可视化及游戏重启等完整功能,保障了游戏交互流畅与画面动态刷新。
参考资料 Oracle 官方文档. Java AWT and Swing Tutorial [EB/OL]. https://docs.oracle.com/javase/tutorial/uiswing/

二、系统功能简介

2.1 系统功能列表及功能概述

功能 概述
1. 勇者移动功能 支持左右移动、跳跃和二段跳,操作丝滑无卡顿,配合边界检测防止移出面板。
2. 释放技能功能 释放一技能(20点伤害,初始解锁)、二技能(40点伤害,击杀1只怪物解锁),对怪物造成对应伤害。
3. 勇者状态管理功能 实时更新血量、等级、击杀怪物数量,推动技能升级,通过血条可视化展示状态。
4. 怪兽初始化并移动功能 生成指定数量(3只)的怪兽,均匀分布在面板上,实现无规则左右随机移动,带边界限制。
5. 碰撞检测功能 通过矩形区域重叠判定勇者与怪物、勇者与血瓶的交互。怪物与勇者碰撞后,0.5秒后展开攻击,勇者血量下降。
6. 怪兽死亡掉落血瓶功能 怪兽血量≤0时判定为死亡,在其坐标附近生成血瓶并浮于地面,支持可视化展示。
7. 怪兽状态管理功能 实时跟踪怪兽血量、存活状态、攻击状态,死亡后停止移动与攻击。
8. 捡血瓶功能 勇者与血瓶碰撞重叠时,可拾取血瓶,勇者血量增加30点(不超过最大血量100),血瓶标记为不可用。
9. 游戏状态功能 所有怪兽死亡则游戏胜利;勇者血量归0则游戏失败,失败后显示重启按钮,支持重新挑战。
10. 界面设置功能 背景图自动适应窗口大小,左上角展示技能提示和勇者状态(等级、血量、击杀数),勇者与怪兽血条可视化。

2.2 功能结构图

《勇者踪迹》

  1. 一级功能模块(核心玩法)
  • 勇者操作类:勇者移动、释放技能功能(玩家直接交互核心)
  • 状态管理类:勇者状态管理、怪兽状态管理功能
  • 基础机制类:怪物初始移动、碰撞检测功能(游戏动态交互核心)
  1. 二级功能模块
  • 资源交互类:捡血瓶功能(游戏内资源恢复机制)
  • 全局控制类:游戏状态(胜负判定)、界面设置功能(游戏流程与视觉展示管理)

三、个人任务简述

3.1 负责的任务与功能

序号 完成功能与任务 描述
1 面向对象设计 运用面向对象技术设计系统架构,明确类间依赖与继承关系,实现模块高内聚、低耦合。
2 Hero类核心功能 封装勇者属性(坐标、血量、等级等),实现左右移动(边界限制)、跳跃与二段跳、技能释放、状态管理(扣血、回血、升级),并完成自身绘制(图片/方块+血条)。
3 Monster类核心功能 封装怪物属性(坐标、血量、存活状态等),实现随机移动(边界限制)、固定伤害攻击、状态管理(扣血、死亡判定),完成碰撞检测与自身绘制(图片/红色方块+血条)。
4 BloodBottle类核心功能 封装血瓶属性(坐标、恢复量30、可拾取状态),实现可视化绘制(粉色圆形+“+30”文字),通过矩形碰撞判定拾取逻辑,被拾取后标记为不可用。
5 GameLauncher类核心功能 作为游戏启动入口,在安全线程中创建JFrame窗口,配置窗口属性(关闭策略、尺寸适配、居中、禁止缩放),嵌入游戏面板并启动游戏逻辑。
6 游戏面板的搭建 继承Swing的JPanel类构建游戏面板,适配背景图片大小,设置面板焦点以支持按键监听,实现重启按钮的交互加载与定位。
7 背景及角色的可视化开发 重写面板paintComponent方法,实现多元素分层绘制(背景、角色、血条、提示文字),添加图片加载失败兜底逻辑(彩色方块替代)。
8 游戏帧循环与状态同步机制 基于Swing Timer实现60FPS帧更新循环,同步执行移动、跳跃、碰撞检测、状态更新与画面重绘,保障逻辑与视觉实时同步。
9 勇者与怪兽/血瓶的交互 集成碰撞检测逻辑,触发怪物攻击、勇者掉血、血瓶拾取回血等交互,关联怪物死亡后血瓶生成逻辑。
10 游戏节点状态控制 维护游戏全局状态(gameOver/gameWin),实现状态触发与界面切换,游戏结束后禁用无效逻辑,重启时全量重置状态。

四、个人负责功能详解

1. 面向对象设计

  • 依赖关系:
    • GameLauncher依赖GamePanel:通过创建GamePanel实例启动游戏,建立启动入口与核心面板的关联。
    • GamePanel依赖Hero、Monster、BloodBottle:初始化游戏对象(勇者、3只均匀分布的怪物、血瓶列表);调用各类方法实现逻辑交互(移动、攻击、拾取等);调用draw()方法渲染所有游戏元素。
    • Hero与Monster依赖:通过isCollideWith()方法实现碰撞检测,触发攻击(怪物→勇者)或技能伤害(勇者→怪物)。
    • BloodBottle与Hero依赖:通过isPickedBy()方法检测拾取交互,触发勇者回血。
  • 继承关系:GamePanel继承JPanel(Swing面板类),实现自定义界面绘制与交互逻辑。

2. 勇者核心功能(移动、跳跃、技能)

2.1 左右移动功能

  • 按键状态跟踪:定义isMovingLeft、isMovingRight布尔变量记录长按状态,左右移动互斥(避免同时按左右键导致静止)。
public void setMovingLeft(boolean movingLeft) {
    this.isMovingLeft = movingLeft;
    if (movingLeft) this.isMovingRight = false;
}
public void setMovingRight(boolean movingRight) {
    this.isMovingRight = movingRight;
    if (movingRight) this.isMovingLeft = false;
}
  • 持续移动更新:游戏帧循环中检测长按状态,按固定步长(12像素)更新坐标,配合边界检测(左不小于0,右不超过面板宽度-勇者尺寸80)。
public void updateMove() {
    if (isMovingLeft) {
        x -= moveStep;
        if (x < 0) x = 0;
    }
    if (isMovingRight) {
        x += moveStep;
        if (x + size > panelWidth) x = panelWidth - size;
    }
}

2.2 跳跃功能

  • 跳跃触发:支持一段跳(地面)和二段跳(空中未使用),通过yVelocity控制跳跃速度,canDoubleJump限制二段跳次数。
public void jump() {
    if (!isJumping) { // 一段跳(地面)
        yVelocity = JUMP_POWER; // 跳跃初速度-16(降低跳跃高度)
        isJumping = true;
        canDoubleJump = true;
    } else if (canDoubleJump) { // 二段跳(空中)
        yVelocity = JUMP_POWER;
        canDoubleJump = false;
    }
}
  • 跳跃状态更新:叠加重力(1像素/帧)实现自然下落,落地后重置状态(丝滑贴地无弹跳)。
public void updateJumpState() {
    if (isJumping) {
        y += yVelocity;
        yVelocity += GRAVITY;
        if (y + size >= groundY) { // 落地判断
            y = groundY - size;
            yVelocity = 0;
            isJumping = false;
            canDoubleJump = false;
        }
    }
}

2.3 技能释放功能

  • 一技能(Z键):初始解锁,固定20点伤害,调用useSkill1()返回伤害值。
  • 二技能(X键):击杀1只怪物解锁,固定40点伤害,未解锁时提示并返回0伤害。

3. 怪物核心功能(移动、攻击、碰撞检测)

3.1 随机移动功能

  • 遍历存活且未攻击的怪物,随机生成0(左移)或1(右移)方向,按固定步长4像素移动,配合边界检测(左不小于0,右不超过面板宽度-80)。
Random random = new Random();
for (Monster monster : monsters) {
    if (!monster.isAlive() || monster.isAttacking()) continue;
    int moveDir = random.nextInt(2);
    int moveStep = 4;
    if (moveDir == 0) {
        monster.setX(Math.max(0, monster.getX() - moveStep));
    } else {
        monster.setX(Math.min(PANEL_WIDTH - 80, monster.getX() + moveStep));
    }
}

3.2 碰撞检测功能

  • 基于Java AWT的Rectangle类实现轴对齐矩形包围盒(AABB)碰撞检测,将角色简化为规则矩形,调用intersects()方法判断是否重叠。
public boolean isCollideWith(Hero hero) {
    if (!isAlive) return false;
    return new Rectangle(x, y, size, size).intersects(
            new Rectangle(hero.getX(), hero.getY(), hero.getSize(), hero.getSize())
    );
}
  • 勇者与血瓶的拾取检测逻辑同理,通过isPickedBy()方法实现。

3.3 攻击功能

  • 怪物与勇者碰撞后,标记为攻击状态,通过攻击定时器(0.5秒间隔)触发攻击,勇者扣除15点伤害。

4. 游戏面板与可视化开发

4.1 游戏面板搭建

  • 继承JPanel类,设置面板尺寸(适配背景图)、焦点状态(支持按键监听)、绝对布局(组件精准定位)。
  • 初始化重启按钮(默认隐藏,失败时显示)、游戏对象(勇者、怪物、血瓶列表)、键盘监听器与定时器。

4.2 可视化绘制

  • 分层绘制顺序:背景→道具(血瓶)→怪物→勇者→血条→文字提示,避免元素遮挡。
  • 角色绘制:优先加载图片(hero.png/monster.png),加载失败则用蓝色(勇者)、红色(怪物)方块兜底;血条采用双层叠加(背景条+当前血量条),随血量动态调整宽度。
  • 游戏结果绘制:胜利/失败时显示半透明遮罩,居中展示结果文字(胜利绿色、失败红色),失败时额外显示重启提示。

5. 游戏帧循环与状态控制

5.1 帧循环机制

  • 基于Swing Timer实现60FPS(16ms/帧)帧更新,同步执行:勇者移动与跳跃状态更新→怪物随机移动→碰撞检测→血瓶拾取检测→游戏状态判断→画面重绘。

5.2 状态控制

  • 全局状态拦截:所有核心逻辑方法首行添加gameOver/gameWin判断,游戏结束时直接返回,禁用按键交互与无效逻辑。
  • 状态全量重置:重启游戏时,重建怪物列表、恢复勇者初始状态(满血、等级1、技能解锁状态重置)、清空血瓶列表,保证新游戏无旧状态残留。

五、课程设计总结及展望

5.1 总结

核心问题与解决方法

问题 解决方法
如何实现移动时的丝滑效果 通过“记录按键长按状态+定时器循环检测”,将单次按键事件转为持续状态,按固定步长更新坐标,避免卡顿;左右移动互斥,提升操作合理性。
如何实现移动物体的碰撞检测 采用矩形包围盒(AABB)算法,用对象坐标和尺寸创建矩形,调用Rectangle的intersects()方法判断是否重叠,简化计算、提升效率。
如何实现键盘与游戏的交互 利用Swing的KeyListener接口和KeyAdapter适配器,监听按键按下/松开事件,关联移动、跳跃、技能释放逻辑,游戏结束时禁用交互。
如何避免游戏状态混乱 帧更新中按“碰撞检测→状态变更→交互执行”固定顺序处理逻辑;游戏结束时停止所有定时器,重启时全量重置状态变量。

核心功能亮点

  1. 勇者跳跃系统:支持一段跳+二段跳,调整跳跃初速度(-16)降低高度,叠加重力实现自然下落,落地丝滑贴地无弹跳,操作手感贴合预期。
  2. 角色状态可视化:血条采用双层叠加设计,随血量动态调整宽度,布局在角色上方不遮挡主体,直观展示存活状态。
  3. 交互逻辑严谨:血瓶拾取后标记为不可用,避免重复拾取;怪物死亡后停止移动与攻击,触发血瓶掉落,流程闭环。

5.2 展望

目前游戏已实现核心玩法,但仍有优化空间:

  1. 视觉体验优化:添加角色动作动画(行走、攻击、跳跃帧动画)、技能特效与音效,提升沉浸感;优化背景动态效果(如滚动背景)。
  2. 玩法扩展:丰富技能体系(如技能冷却、范围伤害),增加怪物种类(不同血量、攻击力、移动速度),设计关卡进度机制。
  3. 功能完善:优化AI逻辑(怪物追击勇者而非随机移动),增加计分系统与排行榜,支持游戏存档与读档功能。

六、课程设计感想

本次《勇者踪迹》2D游戏开发课程设计,让我们在实践中深度巩固了Java Swing/AWT图形编程、面向对象设计等核心知识,也深刻体会到软件开发的系统性与细节重要性。

开发过程中,“丝滑操作”的实现让我们印象深刻:从最初的按键卡顿,到通过“长按状态跟踪+帧循环更新”解决问题,再到调整跳跃参数与重力模拟自然下落,让我们明白用户体验的提升往往源于细节的反复打磨。碰撞检测的统一设计则让我们体会到“模块化复用”的优势,用矩形包围盒算法统一处理所有交互场景,既简化了逻辑,又降低了维护成本。

面向对象设计的落地过程让我们对“高内聚、低耦合”有了更直观的理解:将勇者、怪物、血瓶等封装为独立类,通过明确的接口交互,让后续功能扩展(如新增怪物类型、技能)变得简单高效。同时,调试过程中遇到的状态混乱、元素遮挡等问题,也让我们学会了用“逻辑拆解+日志排查”的方式解决问题,培养了系统化的思维能力。

虽然游戏目前仍有视觉效果、玩法丰富度等方面的提升空间,但这段从需求分析、设计、编码到测试优化的完整流程,让我们不仅提升了技术实操能力,更培养了耐心、细心与解决问题的勇气。这些经历将成为我们后续编程学习与开发实践的宝贵财富,激励我们不断探索、持续进步。

参考文献

Oracle 官方文档. Java AWT and Swing Tutorial [EB/OL]. https://docs.oracle.com/javase/tutorial/uiswing/

posted @ 2026-01-16 10:11  小牙不会写代码  阅读(5)  评论(0)    收藏  举报