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入门到精通教程
查看: 355|回复: 0

[J2ME学习]探究MIDP2.0的游戏API(二)

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

    [LV.1]初来乍到

    发表于 2014-10-11 00:55:03 | 显示全部楼层 |阅读模式
    构建一个J2ME游戏:从GameCanvas类开始    GameCanvas类继承自Canvas,提供了一个屏幕后端的缓冲区,所有的绘制操作都先在这个缓冲区里进行。当所有绘制操作完成后,我们调用flushGraphics()方法将缓冲区内容输出到屏幕。这种双缓冲机制可以使图像的移动更加平滑,避免图像的闪烁。缓冲区大小等于屏幕的大小,而且每一个GameCanvas实例有且仅有一个缓冲区。
                                                                                        
    GameCanvas类提供一种存储按键状态的机制,我们可以通过它方便的了解用户与游戏的交互。这种机制可以跟踪用户按特殊键的次数,调用getKeyStates()方法返回所有游戏键按键状态的二进制表示,1代表上次调用方法后按过该键,0表示上次调用后还没有按过该键。我们可以跟踪的游戏状态有(这里的键都是在Canvas类里定义的):DOWN_PRESSED, UP_PRESSED, RIGHT_PRESSED, LEFT_PRESSED, FIRE_PRESSED, GAME_A_PRESSED, GAME_B_PRESSED, GAME_C_PRESSED和GAME_D_PRESSED。  
      
      
    1.   首先扩展GameCanvas类,定制一个游戏画布,代码见清单1。清单2是运行例子的MIDlet。
    复制代码

       
       
        package
         com.j2me.part3;


        import
         javax.microedition.lcdui.Image;

        import
         javax.microedition.lcdui.Display;

        import
         javax.microedition.lcdui.Graphics;

        import
         javax.microedition.lcdui.game.GameCanvas;


        import
         java.io.IOException;


        public
         
        class
         MyGameCanvas  
        extends
         GameCanvas  
        implements
         Runnable

       
        {
        public MyGameCanvas()
        {
            super(true);
        }
       
        public void start()
        {
            try
            {
                //导入couple图片,坐标定位在屏幕中央
                coupleImg = Image.createImage("/couple.gif");
                coupleX = CENTER_X;
                coupleY = CENTER_Y;
            }
            catch(IOException ioex)
            {
                System.err.println(ioex);
            }
            
            Thread runner = new Thread(this);
            runner.start();
        }
       
        public void run()
        {
            //获取画布的graphics对象
            Graphics g = getGraphics();
            
            while(true) //无穷循环
            {
                //基于上一个代码清单列出的结构
                
                //首先检查游戏状态
                verifyGameState();
                
                //检查用户输入
                checkUserInput();
                
                //更新屏幕
                updateGameScreen(getGraphics());
                
                //休息一下,控制刷新频率
                try
                {
                    Thread.currentThread().sleep(30);
                }
                catch(Exception e)
                {}
            }
        }
       
        private void verifyGameState()
        {
            //现在先不做任何操作
        }
       
        private void checkUserInput()
        {
            //获取按键信息
            int keyState = getKeyStates();
            
            //计算x轴位置
            calculateCoupleX(keyState);
        }
       
        private void updateGameScreen(Graphics g)
        {
            //清空屏幕背景
            g.setColor(0xffffff);
            g.fillRect(0, 0, getWidth(), getHeight());
            
            //将couple图片绘制到当前坐标位置
            g.drawImage(
                coupleImg, coupleX, coupleY, Graphics.HCENTER | Graphics.BOTTOM);
            
            flushGraphics();
        }
       
        private void calculateCoupleX(int keyState)
        {
            //判断移动方向
            if((keyState & LEFT_PRESSED) != 0)
            {
                coupleX -= dx;
            }
            else if((keyState & RIGHT_PRESSED) != 0)
            {
                coupleX += dx;
            }
        }
       
        private Image coupleImg;
        private int coupleX;
        private int coupleY;
        private int dx = 1; //移动量
       
        //屏幕中心
        public final int CENTER_X = getWidth() / 2;
        public final int CENTER_Y = getHeight() / 2;
    }
        清单 1. MyGameCanvas:游戏画布的第一个版本 清单 2 是使用这个游戏画布的MIDlet:
       
       
       
        package
         com.j2me.part3;


        import
         javax.microedition.lcdui.Display;

        import
         javax.microedition.midlet.MIDlet;


        public
         
        class
         GameMIDlet
        extends
         MIDlet

       
        {
        MyGameCanvas gCanvas;
       
        public GameMIDlet()
        {
            gCanvas = new MyGameCanvas();
        }
       
        public void startApp()
        {
            Display d = Display.getDisplay(this);
            gCanvas.start();
            
            d.setCurrent(gCanvas);
        }
       
        public void pauseApp()
        {}
       
        public void destroyApp(boolean unconditional)
        {}
    }
        清单 2. 运行游戏示例的MIDlet类 使用Wireless工具建立一个工程,导入这两个类,然后生成并运行工程。确保你的工程目录res中有这个图片文件,并保证名称为couple.gif, 图1是运行结果。
      
    图1. 构建一个游戏:使用GameCanvas类      使用设备的方向键可以左右移动屏幕中的小图像,这是通过从checkUserInput()里取得按键状态,然后调用calculateCoupleX(),通过将按键状态与GameCanvas里预定义的按键值进行与操作(&),得到用户当前按的键,然后将实例变量更新,最终反映到设备屏幕上。 图像是在updateGameScreen()方法里被绘制到屏幕上的。这个方法使用传入的Graphics对象进行绘制,每一个GameCanvas只有一个Graphics对象。方法首先擦除上次绘制的图像,然后基于当前的coupleX值(还有一直不变的coupleY值)绘制couple.gif图像,最后将缓冲区的数据输出到屏幕。 run()方法里的循环体遵循我们刚开始提出的游戏结构。循环每30毫秒检查一次用户输入并刷新屏幕。你可以试着将这个值改变一下,这会改变刷新的频率。 最后,注意MyGameCanvas的构造器里调用了父类GameCanvas的构造方法,传入的参数为true,这表示从Canvas类继承的按键事件机制被抑制了,因为我们的代码不需要这些通知机制。我们的游戏状态用GameCanvas里自带的按键信息(由getKeyStates()方法取得)来处理已经足够了。通过抑制“keyPressed”、“keyReleased”和“keyRepeated”等通知机制,可以提高游戏的性能。
       
         
         
          
          

            
          

            
          
         
       

      


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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-2-26 13:24 , Processed in 0.399614 second(s), 46 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

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