`
wuhua
  • 浏览: 2111553 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用GameCanvas制作星空效果

阅读更多
http://www.3geye.net/bbs/thread-164-1-1.html

MIDP2.0中提供了游戏开发专用的API,比如GameCanvas等类。他们位于javax.microedition.lcdui.game包内。本文介绍GameCanvas的基本使用方法并实现一种滚动星空的效果。您可以参考Game Canvas Basic获得更详细的信息。

    GameCanvas是Canvas的子类,因此他同样继承了Canvas类的一些特性,比如showNotify()方法会在Canvas被显示在屏幕 的时候调用,而hideNotify()会在Canvas离开屏幕的时候被调用。我们可以把他们当作{8}来使用,用于初始化和销毁资源。比如
    // When the canvas is shown, start a thread to
    // run the game loop.

    protected void showNotify()
    {
        random = new Random();
        thread = new Thread(this);
        thread.start();
    }
    // When the game canvas is hidden, stop the thread.

    protected void hideNotify()
    {
        thread = null;
    }

在游戏开发中最重要的就是接受用户触发的事件然后重新绘制屏幕,通常我们使用getKeyStates()方法判断哪个键被按下了,然后绘制屏幕, 调用flushGraphics()。在GameCanvas中,系统事实上已经为我们实现了双缓冲技术,因此每次我们绘制的时候就是在off- screen上绘制的。结束后通过flushGraphics把它复制到屏幕上去。下面是典型的接受事件、处理逻辑、绘制屏幕的代码。
 // Get the Graphics object for the off-screen buffer
Graphics g = getGraphics();

while (true) {
      // Check user input and update positions if necessary
      int keyState = getKeyStates();
      if ((keyState & LEFT_PRESSED) != 0) {
          sprite.move(-1, 0);
      }
      else if ((keyState & RIGHT_PRESSED) != 0) {
          sprite.move(1, 0);
      }

// Clear the background to white
g.setColor(0xFFFFFF);
g.fillRect(0,0,getWidth(), getHeight());

      // Draw the Sprite
      sprite.paint(g);

      // Flush the off-screen buffer
      flushGraphics();
}

    下面开始实现我们滚动星空的效果,其实设计的思想非常简单。我们启动一个线程,使用copyArea()方法把屏幕的内容往下复制一个像素的距离。然后绘画第一个空白的直线,随机的在直线上绘画点儿,这样看起来就像星空一样了。逻辑代码如下:
    // The game loop.

    public void run()
    {
        int w = getWidth();
        int h = getHeight() - 1;
        while (thread == Thread.currentThread())
        {
            // Increment or decrement the scrolling interval
            // based on key presses
            int state = getKeyStates();

            if ((state & DOWN_PRESSED) != 0)
            {
                sleepTime += SLEEP_INCREMENT;
                if (sleepTime > SLEEP_MAX)
                    sleepTime = SLEEP_MAX;
            } else if ((state & UP_PRESSED) != 0)
            {
                sleepTime -= SLEEP_INCREMENT;
                if (sleepTime < 0)
                    sleepTime = 0;
            }

            // Repaint the screen by first scrolling the
            // existing starfield down one and painting in
            // new stars...

            graphics.copyArea(0, 0, w, h, 0, 1, Graphics.TOP | Graphics.LEFT);
            graphics.setColor(0, 0, 0);
            graphics.drawLine(0, 0, w, 0);
            graphics.setColor(255, 255, 255);
            for (int i = 0; i < w; ++i)
            {
                int test = Math.abs(random.nextInt()) % 100;
                if (test < 5)
                {
                    graphics.drawLine(i, 0, i, 0);
                }
            }
            flushGraphics();

            // Now wait...

            try
            {
                Thread.currentThread().sleep(sleepTime);
            } catch (InterruptedException e)
            {
            }
        }
    }

下面给出源代码
/*
 * License
 *
 * Copyright 1994-2004 Sun Microsystems, Inc. All Rights Reserved.
 *
 */

import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.*;
import javax.microedition.midlet.*;

public class GameCanvasTest extends MIDlet implements CommandListener
{

    private Display display;

    public static final Command exitCommand = new Command("Exit", Command.EXIT,
            1);

    public GameCanvasTest()
    {
    }

    public void commandAction(Command c, Displayable d)
    {
        if (c == exitCommand)
        {
            exitMIDlet();
        }
    }

    protected void destroyApp(boolean unconditional)
            throws MIDletStateChangeException
    {
        exitMIDlet();
    }

    public void exitMIDlet()
    {
        notifyDestroyed();
    }

    public Display getDisplay()
    {
        return display;
    }

    protected void initMIDlet()
    {
        GameCanvas c = new StarField();
        c.addCommand(exitCommand);
        c.setCommandListener(this);

        getDisplay().setCurrent(c);
    }

    protected void pauseApp()
    {
    }

    protected void startApp() throws MIDletStateChangeException
    {
        if (display == null)
        {
            display = Display.getDisplay(this);
            initMIDlet();
        }
    }
}
/*
 * License
 *
 * Copyright 1994-2004 Sun Microsystems, Inc. All Rights Reserved.
 */

import java.util.Random;
import javax.microedition.lcdui.*;
import javax.microedition.lcdui.game.GameCanvas;

// A simple example of a game canvas that displays
// a scrolling star field. Use the UP and DOWN keys
// to speed up or slow down the rate of scrolling.

public class StarField extends GameCanvas implements Runnable
{

    private static final int SLEEP_INCREMENT = 10;

    private static final int SLEEP_INITIAL = 150;

    private static final int SLEEP_MAX = 300;

    private Graphics graphics;

    private Random random;

    private int sleepTime = SLEEP_INITIAL;

    private volatile Thread thread;

    public StarField()
    {
        super(true);

        graphics = getGraphics();
        graphics.setColor(0, 0, 0);
        graphics.fillRect(0, 0, getWidth(), getHeight());
    }

    // The game loop.

    public void run()
    {
        int w = getWidth();
        int h = getHeight() - 1;
        while (thread == Thread.currentThread())
        {
            // Increment or decrement the scrolling interval
            // based on key presses
            int state = getKeyStates();

            if ((state & DOWN_PRESSED) != 0)
            {
                sleepTime += SLEEP_INCREMENT;
                if (sleepTime > SLEEP_MAX)
                    sleepTime = SLEEP_MAX;
            } else if ((state & UP_PRESSED) != 0)
            {
                sleepTime -= SLEEP_INCREMENT;
                if (sleepTime < 0)
                    sleepTime = 0;
            }

            // Repaint the screen by first scrolling the
            // existing starfield down one and painting in
            // new stars...

            graphics.copyArea(0, 0, w, h, 0, 1, Graphics.TOP | Graphics.LEFT);
            graphics.setColor(0, 0, 0);
            graphics.drawLine(0, 0, w, 0);
            graphics.setColor(255, 255, 255);
            for (int i = 0; i < w; ++i)
            {
                int test = Math.abs(random.nextInt()) % 100;
                if (test < 5)
                {
                    graphics.drawLine(i, 0, i, 0);
                }
            }
            flushGraphics();

            // Now wait...

            try
            {
                Thread.sleep(sleepTime);
            } catch (InterruptedException e)
            {
            }
        }
    }

    // When the canvas is shown, start a thread to
    // run the game loop.

    protected void showNotify()
    {
        random = new Random();
        thread = new Thread(this);
        thread.start();
    }
    // When the game canvas is hidden, stop the thread.

    protected void hideNotify()
    {
        thread = null;
    }
}

分享到:
评论

相关推荐

    GameCanvas测试源码

    本文将深入探讨`GameCanvas`的特性和使用方式,同时通过分析提供的`GameTest.java`源码,来揭示其在实际项目中的应用。 `GameCanvas`是`javax.microedition.lcdui.game`包下的一个类,它是对标准`Canvas`类的扩展,...

    GameCanvas和Stripe

    // 使用GameCanvas的示例 public class GameCanvasExample extends GameCanvas implements Runnable { // ... protected void update(Graphics g) { // 在离屏缓冲区绘制 } // ... } ``` 在GameCanvasExample中...

    《黑白棋》手机版源代码GameCanvas版本

    在这个特定的案例中,源代码是基于Java 2 Micro Edition(J2ME)平台,并使用了GameCanvas库。J2ME是Java为嵌入式设备和移动设备开发的一个子集,适用于开发手机游戏和其他轻量级应用。 GameCanvas是J2ME中一个实用...

    GameCanvas-Unity:庆应义University大学“智能设备编程”教材GameCanvas for Unity

    欢迎来到GameCanvas! GameCanvas for Unity是2D游戏框架,在庆应义University大学的“智能设备编程”中用作教材。开发它的目的是创建一个环境,即使是编程的初学者也可以享受开发智能设备应用程序的乐趣。引进方法...

    canvas_game.rar

    渲染循环则负责在每一帧时重绘整个游戏画面,因为Canvas是静态的,需要不断擦除旧图像并绘制新图像以显示动态效果。 在这个游戏中,角色和鱼可能都是通过`ctx.fillRect()`或`ctx.drawImage()`方法绘制的。例如,...

    这是一款使用htmljavascript和css制作的经典俄罗斯方块小游戏

    本文将深入探讨如何使用这三种技术制作一款经典的游戏——俄罗斯方块。 【HTML基础】 HTML是网页内容的骨架,负责搭建游戏的基本结构。在这个俄罗斯方块小游戏中,HTML可能会包含一个游戏画布(canvas)元素,用于...

    关于如何制作一个简单的HTML5 Canvas游戏的快速教程_JavaScript_代码_下载

    `requestAnimationFrame`函数确保游戏循环在浏览器的下一次重绘之前执行,这样可以保持流畅的动画效果。 在描述中提到的链接是一个实际的游戏示例,你可以通过查看其源代码来学习更多细节,如对象移动、碰撞检测、...

    j2me 文字渐隐效果

    在提供的代码示例中,一个名为`wenzi_GameCanvas`的类被用来实现这一效果。这个类继承自`GameCanvas`,并且实现了`CommandListener`和`Runnable`接口,这使得它能够在自己的线程中运行,从而避免阻塞UI。 在`wenzi_...

    Esquisse:使用Java AWT + Swing制作的小型,灵活且功能强大的游戏库

    松鼠使用AWT + Swing和java.util.concurrent制作的易于使用的Java 2d游戏库制作2D游戏应该与编写一些回调函数以实现GameLoop接口一样简单。 该库旨在帮助人们做到这一点。 在示例中查看ExampleGamLoop.java,以查看...

    Java GameAPI

    **GameCanvas的使用** GameCanvas是LCDUI的Canvas类的子类,专门为游戏提供基础的屏幕功能。它不仅继承了Canvas的所有特性,还添加了游戏专用功能,如查询当前游戏按键状态和同步图像输出。GameCanvas实例具有一个...

    J2ME初学者小游戏

    这个游戏以飞船躲避陨石为主题,通过GameCanvas类和精灵类的运用,展示了J2ME中实现游戏逻辑和动画效果的方法。 在J2ME中,GameCanvas是Canvas类的一个子类,它提供了对低级图形操作的支持,是创建游戏的基础。...

    Java毕业论文范例:俄罗斯方块源码及文档.rar

    Java毕业论文范例:俄罗斯方块源码及文档,适合学习的Java小... * 1, 一个GameCanvas画布类的实例引用,  * 2, 一个保存当前活动块(ErsBlock)实例的引用,  * 3, 一个保存当前控制面板(ControlPanel)实例的引用;

    手机游戏,子棋游戏手机的象棋游戏

    本文档详细介绍了如何使用 Java ME 开发一个简单的五子棋游戏应用,包括使用 `MIDlet` 和 `GameCanvas` 类来构建游戏的基本结构,以及实现游戏的图形界面和逻辑控制。这不仅适用于初学者学习 Java ME 游戏开发的基础...

    midp2.0 GameAPI实现

    例如,GameCanvas作为游戏的主画布,LayerManager管理多个Layer,包括Sprite和TiledLayer,而Sprite则负责显示和动画效果。通过深入理解和实践这些API,开发者可以构建出具有流畅动画、分层显示和高效性能的2D游戏。...

    java黑白棋游戏手机版 v2.1完整源码.zip.zip

    J2ME《黑白棋》游戏手机版源代码GameCanvas版本。    1.2版更新如下: ... 使用GameCanvas;  使用多线程控制游戏进度;  修改游戏的部分Bug;    2.1版更新如下:  优化了界面;  

    J2ME黑白棋游戏手机版 V2.1完整源码

    J2ME《黑白棋》游戏手机版源代码GameCanvas版本。    1.2版更新如下:  解决了显示屏大小问题 ;... 使用GameCanvas;  使用多线程控制游戏进度;  修改游戏的部分Bug;    2.1版更新如下:  优化了界面;

    J2ME黑白棋游戏手机版 V2.1完整源码.7z

    J2ME《黑白棋》游戏手机版源代码GameCanvas版本。    1.2版更新如下:  解决了显示屏大小问题 ;... 使用GameCanvas;  使用多线程控制游戏进度;  修改游戏的部分Bug;    2.1版更新如下:  优化了界面;

    j2me的飞机游戏 j2me

    为了实现动画效果,通常需要定时更新`GameCanvas`的内容,如通过改变`Sprite`的位置来实现平移。 2. **事件处理**:`GameCanvas`可以监听触摸、按键等设备事件,通过重写`keyPressed()`, `keyReleased()`等方法响应...

    HTML5实现在文本上跳跃的小球动画效果源码.zip

    如果小球与文本发生碰撞,我们可以根据需求调整小球的属性,如颜色、速度或运动方向,以实现更复杂的交互效果。 这个压缩包提供的源码可能还包含了其他细节,如文本元素的处理、碰撞检测的优化以及更多的动画效果。...

Global site tag (gtag.js) - Google Analytics