锁定老帖子 主题:使用GameCanvas制作星空效果
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-10-05
MIDP2.0中提供了游戏开发专用的API,比如GameCanvas等类。他们位于javax.microedition.lcdui.game包内。本文介绍GameCanvas的基本使用方法并实现一种滚动星空的效果。您可以参考Game Canvas Basic获得更详细的信息。
GameCanvas是Canvas的子类,因此他同样继承了Canvas类的一些特性,比如showNotify()方法会在Canvas被显示在屏幕 的时候调用,而hideNotify()会在Canvas离开屏幕的时候被调用。我们可以把他们当作{8}来使用,用于初始化和销毁资源。比如 protected void showNotify() protected void hideNotify() 在游戏开发中最重要的就是接受用户触发的事件然后重新绘制屏幕,通常我们使用getKeyStates()方法判断哪个键被按下了,然后绘制屏幕, 调用flushGraphics()。在GameCanvas中,系统事实上已经为我们实现了双缓冲技术,因此每次我们绘制的时候就是在off- screen上绘制的。结束后通过flushGraphics把它复制到屏幕上去。下面是典型的接受事件、处理逻辑、绘制屏幕的代码。 while (true) { // Clear the background to white // Draw the Sprite // Flush the off-screen buffer 下面开始实现我们滚动星空的效果,其实设计的思想非常简单。我们启动一个线程,使用copyArea()方法把屏幕的内容往下复制一个像素的距离。然后绘画第一个空白的直线,随机的在直线上绘画点儿,这样看起来就像星空一样了。逻辑代码如下: public void run() if ((state & DOWN_PRESSED) != 0) // Repaint the screen by first scrolling the graphics.copyArea(0, 0, w, h, 0, 1, Graphics.TOP | Graphics.LEFT); // Now wait... try 下面给出源代码 import javax.microedition.lcdui.*; public class GameCanvasTest extends MIDlet implements CommandListener private Display display; public static final Command exitCommand = new Command("Exit", Command.EXIT, public GameCanvasTest() public void commandAction(Command c, Displayable d) protected void destroyApp(boolean unconditional) public void exitMIDlet() public Display getDisplay() protected void initMIDlet() getDisplay().setCurrent(c); protected void pauseApp() protected void startApp() throws MIDletStateChangeException import java.util.Random; // A simple example of a game canvas that displays 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() graphics = getGraphics(); // The game loop. public void run() if ((state & DOWN_PRESSED) != 0) // Repaint the screen by first scrolling the graphics.copyArea(0, 0, w, h, 0, 1, Graphics.TOP | Graphics.LEFT); // Now wait... try // When the canvas is shown, start a thread to protected void showNotify() protected void hideNotify() 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
浏览 4406 次