Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 236|回复: 0

[J2ME学习]J2ME游戏中时钟的简单实现

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-11 05:05:22 | 显示全部楼层 |阅读模式
    在游戏开发中,有时候我们需要一个时钟来记录游戏的时间,如果时间结束则结束游戏。

          本文介绍如何在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) {
         }
    }


      
      
       
       

         
       

         
       
      
    复制代码

    源码下载:http://203.93.208.26/kj/cwb/dir7/TestMidlet.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-26 06:56 , Processed in 0.374143 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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