游戏的运行机制
4
1
2
2.传递控制命令
0011 0010 1010 1101 0001 0100 1011
• 如何让玩家控制小球的运动方向? 设想:当玩家按下键盘的上下左右四键 时让小球向相应的方向移动 实现:覆盖KeyPressed方法,同时在 gameUpdate()中加入条件判断 (参见例4_2)
4
1
2
3.实例:贪食蛇游戏
4
ห้องสมุดไป่ตู้
1
2
继续改进
0011 0010 1010 1101 0001 0100 1011
1.当窗口最小化或被遮挡时暂停游戏 2.添加游戏结束规则,并能重新开始游戏 3.能够添加多个食物,如当按下某个键后随机添 加一个新食物(原来的食物不消失) 4.改变蛇的运动速度,按+号键加速,按-号键减速 5.手动控制蛇的移动,按下方向键时让蛇朝对应 的方向移动,否则静止不动 6.自由发挥„„
4
1
2
2 如何更新蛇的坐标? -0010 只需要更新和保存蛇头的坐标值 (why?) 0011 1010 1101 0001 0100 1011 -当前祯的蛇头位置便是下一帧的蛇身位置 3 如何将蛇体绘制出来? a.如果tail值不等于head值,则在tail值对应的数组 下标中读取坐标值,并在其位置绘制一个小球(蛇 身),否则转步骤c, b.将tail值加一(需要对数组长度取模),转步骤a c. 绘制蛇头,在head值对应的数组下标中读取坐标 值,并用特定的颜色来绘制一个小球(蛇头) (参见例4_3)
输入命令 玩家 响应命令 游戏
命令输入方式:键盘、鼠标事件(单击,拖放等 ) 命令响应方式:事件处理程序更新游戏逻辑
4
1
2
1.改变游戏状态
0011 0010 1010 1101 0001 0100 1011
游戏的有限状态机(FSM)模型
暂停 启动 运行 结束
退出
设置
4
1
2
1 如何让游戏停止? 0011 0010 1010 1101 0001 0100 1011 ——跳出游戏循环while(true) • 如何实现? a.设置一个布尔变量(running)作为游戏循 环的条件,初值为true b.为程序添加键盘或鼠标事件监听 c. 添加相应的事件处理程序,如当键盘按 下Esc键时将running值设置为false;
4
1
2
定义snake类
将贪食蛇的属性和方法进行封装 ——抽象(面向对象编程思想) 0011 0010 1010 1101 0001 0100 1011 主要数据成员: public int x; public int y; public int diameter; private Point[] body; private int head; private int tail; private int length; • 主要方法: update(); //移动蛇,更新其坐标 draw(); //绘制蛇,显示其形状
4
1
2
添加食物
0011 0010 1010 1101 0001 0100 1011
• 添加Food类,并定义相关方法,用于在指 定的位置绘制食物方块 数据成员: public Point location; public Point size; 方法: update();//更新食物坐标 draw(); //绘制食物图形
4
1
2
0011 0010 1010 1101 0001 0100 1011
1.如何表示贪食蛇 • 外观上如何表现? 一系列首尾相连的小球(用特定的颜色表示 蛇头) • 怎样实现蛇的移动? 在游戏的每一祯动态更新所有小球的坐标值 ,并进行绘制 • 用怎样的数据结构来存放和处理蛇的位置信息 ? 循环队列(数组实现) 定义两个变量head和tail,分别表示蛇头指针 和蛇尾指针
0011 0010 1010 1101 0001 0100 1011
第4章 游戏的运行机制(1) ——用户事件处理
4
1
2
内容提要
0011 0010 1010 1101 0001 0100 1011
• 改变游戏状态 • 传递控制命令 • 实例:贪食蛇游戏
4
1
2
交互性—游戏的根本特性—让玩家掌控世界 0011 0010 1010 1101 0001 0100 1011 如何交互?
4
1
2
总结
0011 0010 1010 1101 0001 0100 1011
1 通过对键盘和鼠标事件处理,我们可以: • 转换游戏状态; • 传递控制命令; 2 贪食蛇游戏设计要点: • 蛇体的表示:循环队列 • 蛇体的运动:保存蛇头的坐标值,并动 态调整蛇头及蛇尾指针 • 蛇与食物的交互:碰撞检测(下一讲内 容)
4
1
2
2 如何让游戏暂停和恢复运行? ——暂停和恢复游戏更新gameUpdate() 0011 0010 1010 1101 0001 0100 1011 • 如何实现? a.设置一个布尔变量(isPaused)作为游戏 更新的条件,初值为true b.为游戏更新设置条件 if(isPaused) {gameUpdate();} c. 添加相应的事件处理程序,如当键盘按 下P键时将isPaused值设置为!isPaused; (参见例4_1)
4
1
2
添加蛇与食物的交互
0011 0010 1010 1101 0001 0100 1011
• 如何在屏幕区域随机添加一个食物? 借助Random对象 • 如何让蛇“吃”到食物? “吃的”过程:蛇头与食物重叠,食物 消失,蛇身加长一个单位 • 如何实现? (参见例4_4)
4
1
2
类关系图
0011 0010 1010 1101 0001 0100 1011
4
1
2
用循环数组表示贪食蛇
0011 0010 1010 1101 0001 0100 1011
4
1
2
那么,如何在游戏的每一祯中确定蛇头和蛇尾指针 的数值 ? 0001 0100 1011 0011 0010 1010 1101 a.当蛇长达到最大值时(数组最大容量) • 蛇头指针(head) 加一即可(对数组长度取模) • 蛇尾指针(tail)永远在蛇头的前一个位置 b.当蛇长不足最大值时(难点) • 蛇头指针仍然只需要加一 • 蛇尾指针值=(蛇头指针值+数组长度-蛇长+1) MOD 数组长度 (Why?看黑板) (测试:当按下I键时蛇身加长一个单位)