51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 1966|回复: 0
打印 上一主题 下一主题

J2ME游戏开发中时钟的简单实现

[复制链接]
  • TA的每日心情
    慵懒
    2015-1-8 08:46
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2007-11-22 15:57:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     在游戏开发中,有时候我们需要一个时钟来记录游戏的时间,如果时间结束则结束游戏。本文介绍如何在J2ME中使用Timer和TimerTask来实现这样一个时钟,并给出具体代码实例。在java.util包中有一个TimerTask类,你可以扩展这个类并且实现他的run()方法,在run()方法中编写我们的逻辑代码。如果我们想制作一个游戏时钟,那么非常简单我们编写一个GameClock类扩展TimerTask,GameClock需要维持一个实例变量timeLeft,这样我们就可以记录游戏剩余的时间了,在每次run()运行的时候把timeLeft减1就可以了。有时候我们需要始终暂停以及重新启动,这并不复杂,在GameClock中添加一个boolean类型的标记就可以了。下面给出GameClock的代码:

      /*

       * GameClock.java

       *

       * Created on 2005年7月18日, 上午11:00

       *

       * To change this template, choose Tools   Options and locate the template under

       * the Source Creation and Management node. Right-click the template and choose

       * Open. You can then make changes to the template in the Source Editor.

       */

      package com.j2medev.gameclock;

      import java.util.TimerTask;

      /**

       *

       * @author Administrator

       */

      public class GameClock extends TimerTask{

       private int timeLeft = 60;//时钟的默认时间

       private boolean pause = false;

       /** Creates a new instance of GameClock */

       public GameClock() {

       }

       public GameClock(int value){

       timeLeft = value;

       }

       public void run(){

       if(!pause){

       timeLeft--;

       }

       }

       public void pause(){

       pause = true;

       }

       public void resume(){

       pause = false;

       }

       public int getTimeLeft(){

       return timeLeft;

       }

       public void setTimeLeft(int _value){

       this.timeLeft = _value;

       }

      }

      当我们使用这个时钟的时候,只需要把它的一个实例作为参数传给Timer的schedule()方法即可。例如

       clock = new GameClock(30);

       timer.schedule(clock,0,1000);

      接下来我们编写一个简单的游戏界面测试一下时钟。我们在程序启动的时候开始计时,每隔一秒钟timeLeft会减少1,并且在手机屏幕上显示当前剩余的时间。如果timeLeft为0的时候代表游戏已经结束了。因此我们需要这样判断游戏的状态。

       public void verifyGameState(){

       timeLeft = clock.getTimeLeft();

       if(timeLeft == 0){

       going = false;

       }

       }

      为了测试时钟的暂停功能,我们接收用户的按键行为,如果左键被按下,那么调用clock的pause()方法,如果右键被按下则调用clock的resume()方法。

      

       public void userInput(){

       int keyStates = this.getKeyStates();

       if((keyStates & GameCanvas.LEFT_PRESSED) != 0){

       clock.pause();

       }else if((keyStates & GameCanvas.RIGHT_PRESSED) != 0){

       clock.resume();

       }

         }
    下面给出MIDlet和Canvas的代码:

      /*

       * ClockCanvas.java

       *

       * Created on 2005年7月18日, 上午11:04

       *

       * To change this template, choose Tools   Options and locate the template under

       * the Source Creation and Management node. Right-click the template and choose

       * Open. You can then make changes to the template in the Source Editor.

       */

      package com.j2medev.gameclock;

      import java.util.Timer;

      import javax.microedition.lcdui.Command;

      import javax.microedition.lcdui.Graphics;

      import javax.microedition.lcdui.game.*;

      /**

       *

       * @author Administrator

       */

      public class ClockCanvas extends GameCanvas implements Runnable {

       private Timer timer = new Timer();

       private GameClock clock = null;

       private boolean going = true;

       int timeLeft = 0;

       /** Creates a new instance of ClockCanvas */

       public ClockCanvas() {

       super(false);

       }

       public void run(){

       clock = new GameClock(30);

       timer.schedule(clock,0,1000);

       while(going){

       verifyGameState();

       userInput();

       repaint();

       try{

       Thread.sleep(100);

       }catch(Exception e){

       e.printStackTrace();

       }

      

       }

       }

       public void userInput(){

       int keyStates = this.getKeyStates();

       if((keyStates & GameCanvas.LEFT_PRESSED) != 0){

       clock.pause();

       }else if((keyStates & GameCanvas.RIGHT_PRESSED) != 0){

       clock.resume();

       }

         }

       public void paint(Graphics g){

       int color = g.getColor();

       g.setColor(0xffffff);

       g.fillRect(0,0, this.getWidth(), this.getHeight());

       g.setColor(color);

       if(timeLeft == 0){

       g.drawString("游戏结束", this.getWidth()/2, this.getHeight()/4, Graphics.HCENTER Graphics.BOTTOM);

       }else{

       g.drawString("游戏剩余时间:"+timeLeft, this.getWidth()/2, this.getHeight()/4, Graphics.HCENTER Graphics.BOTTOM);

       }

       }

       public void verifyGameState(){

       timeLeft = clock.getTimeLeft();

       if(timeLeft == 0){

       going = false;

       }

       }

       public void start(){

       Thread t = new Thread(this);

       t.start();

       }

       public void stop(){

       going = false;

       }

      }

      /*

       * TestMidlet.java

       *

       * Created on 2005年7月18日, 上午11:00

       */

      package com.j2medev.gameclock;

      import javax.microedition.midlet.*;

      import javax.microedition.lcdui.*;

      /**

       *

       * @author Administrator

       * @version

       */

      public class TestMidlet extends MIDlet {

       private Display display = null;

       public void startApp() {

       display = Display.getDisplay(this);

       ClockCanvas canvas = new ClockCanvas();

       canvas.start();

       display.setCurrent(canvas);

       }

       public void pauseApp() {

       }

       public void destroyApp(boolean unconditional) {

       }

      }
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-5-6 12:59 , Processed in 0.068865 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表