`
iceliushuai
  • 浏览: 27271 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

关于在Java游戏中实现暂停的讨论

    博客分类:
  • JAVA
阅读更多
最近写了一个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
  • TrafficLightsDemo.jar (28.9 KB)
  • 描述: 小示例程序 wait()和notifyAll()来实现暂停
  • 下载次数: 101
分享到:
评论
1 楼 Saito 2009-05-16  
Memento模式.

       

相关推荐

    生命游戏javaGUI实现界面十分美观

    本文将详细讨论如何使用Java图形用户界面(GUI)技术来实现一个美观的生命游戏界面。Java GUI为我们提供了丰富的组件和工具,可以创建出互动性强、视觉效果良好的应用程序。我们将主要关注以下几点: 1. **Java GUI...

    基于JAVA的飞机大战游戏的设计与实现计算机毕业设计论文

    - **游戏难点分析**:讨论在开发过程中可能遇到的技术难题,如性能优化、多线程处理等。 #### 飞机大战功能实现 - **游戏首页的实现**:设计游戏的启动页面,包括游戏logo、开始按钮等元素,为用户提供友好的界面...

    用java做的对对碰游戏

    在这个项目中,我们讨论的是一个基于Java实现的“对对碰”游戏。对对碰游戏是一种流行的小型休闲游戏,玩家需要通过交换相邻的图标来匹配三个或更多相同的图标,以消除它们并得分。 首先,我们需要了解Java的基础...

    关于用Java手机游戏

    1. **图形和动画**: 在Java游戏中,图形和动画是至关重要的。开发者通常会使用Java的AWT或Swing库进行2D图形绘制,或者使用Android的OpenGL ES API进行3D图形渲染。通过帧动画和精灵(Sprite)技术,可以实现角色和...

    Java2游戏编程源码

    总的来说,《Java2游戏编程源码》第四章深入浅出地介绍了Java游戏开发的关键技术,不仅让读者能够理解游戏开发的基本流程,还提供了实际操作的机会,是学习Java游戏编程的宝贵资料。通过实践这些源代码,读者不仅...

    Java实现生命游戏.zip

    在这个项目中,Java被用来编写代码,实现生命游戏的规则和交互功能。开发者可能使用了Java的基础语法,包括类、对象、变量、条件语句、循环、异常处理等,来构建游戏的核心逻辑。 生命游戏的规则相当简洁:在一个二...

    java实现超级玛丽小游戏.zip

    Java 实现超级玛丽小游戏是一个基于Java编程语言的项目,展示了游戏开发的基本原理和技术。这个项目不仅为学习者提供了深入理解Java编程的机会,还让他们能够接触到游戏设计的核心概念,包括对象定位、碰撞检测、...

    用 JAVA 开发游戏连连看 实现游戏的算法

    在JAVA中开发一款游戏,如“连连看”,涉及到多个编程技术与算法的综合应用。首先,我们要理解连连看的基本规则:玩家需要找到并消除一对相同的图案,这些图案必须通过不超过两条直线连接,且直线不能穿过其他图案。...

    基于java的坦克大战游戏的设计与实现-毕业论文

    《基于Java的坦克大战游戏的设计与实现》是一篇深度探讨如何使用Java编程语言来构建一款坦克大战游戏的毕业论文。...通过阅读这篇论文,读者不仅能了解Java游戏开发的基本流程,还能深入理解游戏设计背后的技术原理。

    Java.awt实现的符合面向对象思想的贪吃蛇游戏.zip

    在本项目中,"Java.awt实现的符合面向对象思想的贪吃蛇游戏.zip" 是一个使用Java编程语言,特别是Java AWT(Abstract Window Toolkit)库创建的贪吃蛇游戏。贪吃蛇游戏是一款经典的休闲游戏,玩家通过控制一条蛇来吃...

    java swing 小游戏 俄罗斯方块

    在这个场景中,我们讨论的是使用Java Swing实现的经典小游戏——俄罗斯方块。俄罗斯方块是一款流行的世界级益智游戏,由不同形状的方块组成,玩家需要控制这些方块在屏幕上自由下落,并尽可能地填满一整行来消除得分...

    java小游戏 -java拼图源码 java拼图.rar

    【标题】中的“java小游戏 -java拼图源码”指的是一个使用Java编程语言开发的小游戏,具体来说是一款拼图游戏。在Java编程中,开发这样的游戏通常...对于想要深入学习Java游戏开发的人来说,这是一个很好的实践项目。

    雷电游戏JAVA代码

    【雷电游戏JAVA代码】 在Java编程领域,雷电游戏是...总之,"雷电游戏JAVA代码"是一个展示Java游戏开发能力的实例,它涵盖了面向对象设计、图形绘制、输入处理等多个关键知识点,对于学习和提升Java编程技能大有裨益。

    雷电游戏JAVA版源程序资料

    这个压缩包包含的文件详细讲解了如何使用Java来创建雷电风格的射击游戏,是学习Java游戏开发的宝贵资料。 Java是一种广泛使用的面向对象的编程语言,以其跨平台性和高效性能闻名。在游戏开发领域,Java不仅适用于...

    使用Java实现的拼图游戏,有音乐播放.zip

    在本项目中,我们讨论的是一个使用Java编程语言实现的拼图游戏,它还具备音乐播放功能。这个项目可以从其压缩包文件名“使用Java实现的拼图游戏,有音乐播放.zip”中得到基本信息。解压后的主要文件目录是“jigsaw-...

    Java坚持玩20秒小游戏

    在本项目中,我们讨论的是一个使用Java编程语言开发的简单20秒小游戏。这个小游戏是作者基于经典游戏的灵感,通过自我探索和实践编写的。对于初学者和对小游戏开发感兴趣的人来说,这是一个很好的学习资源,可以理解...

    Java毕业设计-基于Java ME无线网络移动端的俄罗斯方块游戏的实现(源代码+论文).rar

    《基于Java ME无线网络移动端的俄罗斯方块游戏实现》 Java ME(Micro Edition)是Java技术在移动设备和嵌入式设备上的应用平台,它为开发面向小型设备的应用提供了强大的框架。本项目主要探讨如何利用Java ME技术在...

    java RPG 源码 建筑菜单制作中

    通过分析这个“java RPG 源码 建筑菜单制作中”的项目,开发者可以深入学习到如何在Java环境中实现RPG游戏的菜单系统,以及如何处理游戏中的交互逻辑和资源管理。对于初学者来说,这是一个极好的实践和学习机会。

    JAVA打飞机游戏设计与实现(论文+源代码).zip

    在打飞机游戏中,Java的面向对象特性将被用来创建游戏对象,如飞机、子弹、敌人等,每个对象都有自己的属性和行为。 其次,游戏设计涉及到的主要概念包括游戏循环(Game Loop)、事件处理、碰撞检测和图形绘制。...

Global site tag (gtag.js) - Google Analytics