最近写了一个Swing版本的Snake程序,可是不太清楚怎么样来实现游戏中常见的暂停操作,所以我列出自己的一些方案,大家来讨论下什么样的方式会好些,还有就是如何更好的实现暂停这种方法。
方案1,直接利用状态变量,如果处于暂停状态,则什么也不做(空循环)
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int mDirection = sv.getMoveDirection();
// KEY_START
//如果是开始键,就设置程序状态为开始
if (keyCode == SnakeKey.START) {
gameState == RUNNING;
return;
}
// KEY_PAUSE
//如果是暂停键,就设置程序状态为开始
if (keyCode == SnakeKey.PAUSE) {
gameState == PAUSE;
return;
}
//设置方向
//省略其它按键的操作
//...
return;
}
更新画面的线程
private Thread mRedrawHandler = new Thread() {
@Override
public void run() {
try {
while (true) {
// if pause mode, do nothing
if (mMode == PAUSE) {
continue;
}
if (mMode == RUNNING) {
// 进行更新操作
// 省略部分代码
}
Thread.sleep(mMoveDelay);
}
if (mMode == LOSE) {
// TODO sss
// 重置 mScore
// 重置 mMoveDelay
// 记录当前得分,如果有排行榜的话
}
} catch (InterruptedException ex) {
}
}
};
觉得这样的话 while 循环会占用大量的 CPU 时间 , 所以在 continue 前加了一个 Thread.sleep(1000); 先让程序停止 1s 钟。虽然不知道系统的原理是什么,但感觉自己写的空循环占用的资源要比 Thread.sleep() 要多吧。
if (mMode == PAUSE) {
Thread.sleep(1000);
continue;
}
可是觉得这样也不好,会影响程序的响应速度。
后来学习了线程的同步,就想着改成同步,在系统中加入一个锁,平时这个锁可以由画面线程获得,可是当按下 pause 时,就让另外的线程取得锁,这样的话,画面线程取得不到锁,就会自已停下来了。
接收键盘事件的函数
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
int mDirection = sv.getMoveDirection();
// KEY_START
if (keyCode == SnakeKey.START) {
pauseOrResume();
return;
}
// KEY_PAUSE
if (keyCode == SnakeKey.PAUSE) {
pauseOrResume();
return;
}
//设置方向
//省略其它按键的操作
//...
return;
}
更新画面的线程
private Thread mRedrawHandler = new Thread() {
@Override
public void run() {
try {
while (true) {
synchronized (pauseLock) {
// if pause mode, wait the lock.
if (mMode == PAUSE) {
pauseLock.wait();
}
pauseLock.notifyAll();
}
if (mMode == RUNNING) {
// 进行更新操作
// 省略部分代码
}
Thread.sleep(mMoveDelay);
}
if (mMode == LOSE) {
// TODO sss
// 重置 mScore
// 重置 mMoveDelay
// 记录当前得分,如果有排行榜的话
}
} catch (InterruptedException ex) {
}
}
};
另外加了一个方法来控制锁:
private Object pauseLock = new Object();
/**
* Pause or resume the game
*/
private void pauseOrResume() {
while (true)
synchronized (pauseLock) {
if (mMode == RUNNING) {
mMode = PAUSE;
break;
}
if (mMode == PAUSE || mMode == LOSE) {
mMode = RUNNING;
// Tell the screen to run.
pauseLock.notifyAll();
break;
}
}
}
但是不知道在这种情况下会有什么不好,欢迎大家讨论。
附件是一个小的示例程序,大家可以看一下,可以是因为代码贴多了,不好容易看,可以下载附件看看示例。
=================================================
2009-05-23
1.更新了代码,删除了无用的部分代码
2.更新了TrafficLightsDemo.jar代码,修正原来的代码,使用在暂停时的响应时间减少。
3.贪吃蛇的程序已经放到论坛上,可以去下载看全部代码
http://www.iteye.com/topic/393669
分享到:
相关推荐
本文将详细讨论如何使用Java图形用户界面(GUI)技术来实现一个美观的生命游戏界面。Java GUI为我们提供了丰富的组件和工具,可以创建出互动性强、视觉效果良好的应用程序。我们将主要关注以下几点: 1. **Java GUI...
- **游戏难点分析**:讨论在开发过程中可能遇到的技术难题,如性能优化、多线程处理等。 #### 飞机大战功能实现 - **游戏首页的实现**:设计游戏的启动页面,包括游戏logo、开始按钮等元素,为用户提供友好的界面...
在这个项目中,我们讨论的是一个基于Java实现的“对对碰”游戏。对对碰游戏是一种流行的小型休闲游戏,玩家需要通过交换相邻的图标来匹配三个或更多相同的图标,以消除它们并得分。 首先,我们需要了解Java的基础...
1. **图形和动画**: 在Java游戏中,图形和动画是至关重要的。开发者通常会使用Java的AWT或Swing库进行2D图形绘制,或者使用Android的OpenGL ES API进行3D图形渲染。通过帧动画和精灵(Sprite)技术,可以实现角色和...
总的来说,《Java2游戏编程源码》第四章深入浅出地介绍了Java游戏开发的关键技术,不仅让读者能够理解游戏开发的基本流程,还提供了实际操作的机会,是学习Java游戏编程的宝贵资料。通过实践这些源代码,读者不仅...
在这个项目中,Java被用来编写代码,实现生命游戏的规则和交互功能。开发者可能使用了Java的基础语法,包括类、对象、变量、条件语句、循环、异常处理等,来构建游戏的核心逻辑。 生命游戏的规则相当简洁:在一个二...
Java 实现超级玛丽小游戏是一个基于Java编程语言的项目,展示了游戏开发的基本原理和技术。这个项目不仅为学习者提供了深入理解Java编程的机会,还让他们能够接触到游戏设计的核心概念,包括对象定位、碰撞检测、...
在JAVA中开发一款游戏,如“连连看”,涉及到多个编程技术与算法的综合应用。首先,我们要理解连连看的基本规则:玩家需要找到并消除一对相同的图案,这些图案必须通过不超过两条直线连接,且直线不能穿过其他图案。...
《基于Java的坦克大战游戏的设计与实现》是一篇深度探讨如何使用Java编程语言来构建一款坦克大战游戏的毕业论文。...通过阅读这篇论文,读者不仅能了解Java游戏开发的基本流程,还能深入理解游戏设计背后的技术原理。
在本项目中,"Java.awt实现的符合面向对象思想的贪吃蛇游戏.zip" 是一个使用Java编程语言,特别是Java AWT(Abstract Window Toolkit)库创建的贪吃蛇游戏。贪吃蛇游戏是一款经典的休闲游戏,玩家通过控制一条蛇来吃...
在这个场景中,我们讨论的是使用Java Swing实现的经典小游戏——俄罗斯方块。俄罗斯方块是一款流行的世界级益智游戏,由不同形状的方块组成,玩家需要控制这些方块在屏幕上自由下落,并尽可能地填满一整行来消除得分...
【标题】中的“java小游戏 -java拼图源码”指的是一个使用Java编程语言开发的小游戏,具体来说是一款拼图游戏。在Java编程中,开发这样的游戏通常...对于想要深入学习Java游戏开发的人来说,这是一个很好的实践项目。
【雷电游戏JAVA代码】 在Java编程领域,雷电游戏是...总之,"雷电游戏JAVA代码"是一个展示Java游戏开发能力的实例,它涵盖了面向对象设计、图形绘制、输入处理等多个关键知识点,对于学习和提升Java编程技能大有裨益。
这个压缩包包含的文件详细讲解了如何使用Java来创建雷电风格的射击游戏,是学习Java游戏开发的宝贵资料。 Java是一种广泛使用的面向对象的编程语言,以其跨平台性和高效性能闻名。在游戏开发领域,Java不仅适用于...
在本项目中,我们讨论的是一个使用Java编程语言实现的拼图游戏,它还具备音乐播放功能。这个项目可以从其压缩包文件名“使用Java实现的拼图游戏,有音乐播放.zip”中得到基本信息。解压后的主要文件目录是“jigsaw-...
在本项目中,我们讨论的是一个使用Java编程语言开发的简单20秒小游戏。这个小游戏是作者基于经典游戏的灵感,通过自我探索和实践编写的。对于初学者和对小游戏开发感兴趣的人来说,这是一个很好的学习资源,可以理解...
《基于Java ME无线网络移动端的俄罗斯方块游戏实现》 Java ME(Micro Edition)是Java技术在移动设备和嵌入式设备上的应用平台,它为开发面向小型设备的应用提供了强大的框架。本项目主要探讨如何利用Java ME技术在...
通过分析这个“java RPG 源码 建筑菜单制作中”的项目,开发者可以深入学习到如何在Java环境中实现RPG游戏的菜单系统,以及如何处理游戏中的交互逻辑和资源管理。对于初学者来说,这是一个极好的实践和学习机会。
在打飞机游戏中,Java的面向对象特性将被用来创建游戏对象,如飞机、子弹、敌人等,每个对象都有自己的属性和行为。 其次,游戏设计涉及到的主要概念包括游戏循环(Game Loop)、事件处理、碰撞检测和图形绘制。...