梦想飞翔

自强不息
posts - 111, comments - 30, trackbacks - 0, articles - 0
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

http://tech.ccidnet.com/art/1077/20050826/319351_1.html
笔者以前是做J2EE的,一个月前由于兴趣所致开始利用业余时间学习J2ME游戏开发。在网上看了一通教程后,便准备动手一边学一边做一个简单的rpg游戏。虽然起点比较高,但感觉游戏难度越大,遇到的问题也就越多。

这样在问题全部解决后,也就学的差不多了。另外只有做这种游戏才有学下去的兴趣。以后我会每次把写成的源码及思路整理成文章的形式供大家参考,互相学习进步。

下面是游戏中所需要的部分图片,还有的图片下次写到了再上传:
hero_left.png:



hero_right.png:



hero_up.png:



hero_down.png:





整个程序的主体在BraveCanvas类中完成,该类继承于GameCanvas实现Runnable接口,由BraveMIDlet类启动他,BraveMIDlet继承MIDlet实现CommandListener接口。BraveMIDlet类代码如下:(由于只是一个简单的rpg,开头画面和菜单全部省略了,改为由一个按扭启动游戏)

 1package brave;
 2
 3import javax.microedition.lcdui.*;
 4import javax.microedition.midlet.*;
 5
 6public class BraveMIDlet extends MIDlet implements CommandListener {
 7    private Display d;
 8    private Command exitCommand;
 9    private Command startCommand;
10
11    private BraveCanvas braveCanvas;
12
13    public BraveMIDlet() {
14        d = Display.getDisplay(this);
15        exitCommand = new Command("退出", Command.EXIT, 1);
16        startCommand = new Command("开始", Command.SCREEN, 1);
17    }

18
19    public void startApp() {
20        // 创建BraveCanvas
21        braveCanvas = new BraveCanvas();
22        braveCanvas.addCommand(exitCommand);
23        braveCanvas.addCommand(startCommand);
24        braveCanvas.setCommandListener(this);
25        // 装载BraveCanvas
26        d.setCurrent(braveCanvas);
27    }

28
29    public void pauseApp() {
30    }

31
32    public void destroyApp(boolean unconditional) {
33    }

34
35    public void commandAction(Command c, Displayable dpa) {
36
37        String str_co = c.getLabel();
38        if (str_co.equals("开始")) {
39            // 运行BraveCanvas中的线程(启动游戏)
40            braveCanvas.startup();
41        }
 else if (str_co.equals("退出")) {
42            destroyApp(false);
43            notifyDestroyed();
44        }

45    }

46}

47

 1package brave;
 2
 3import javax.microedition.lcdui.game.GameCanvas;
 4import javax.microedition.lcdui.Graphics;
 5import java.io.IOException;
 6
 7public class BraveCanvas extends GameCanvas implements Runnable {
 8    private boolean sign;
 9    private Graphics g;
10    // 设置@符号的当前位置
11    private int x, y;
12
13    public BraveCanvas() {
14        super(true);
15        // 初始化@位置
16        x = getWidth() / 2;
17        y = getHeight() / 2;
18    }

19
20    public void startup() {
21        this.sign = true;
22        Thread thread = new Thread(this);
23        // 启动线程
24        thread.start();
25    }

26
27    public void run() {
28        g = getGraphics();
29        while (sign) {
30            try {
31                // @符号的移动
32                input(g);
33                // @符号的显示
34                paint(g);
35                // 这里应该有详细的计算,方便为上,置为15
36                Thread.sleep(15);
37            }
 catch (Exception e) {
38                System.out.println("2:" + e);
39            }

40        }

41    }

42
43    public void input(Graphics g) throws IOException {
44        int keystates = getKeyStates();
45        switch (keystates) {
46        case UP_PRESSED:
47            y = Math.max(0, y - 1);
48            break;
49        case DOWN_PRESSED:
50            y = Math.min(getHeight(), y + 1);
51            break;
52        case LEFT_PRESSED:
53            x = Math.max(0, x - 1);
54            break;
55        case RIGHT_PRESSED:
56            x = Math.min(getWidth(), x + 1);
57            break;
58        }

59    }

60
61    public void paint(Graphics g) {
62        // 设置画布的背景色
63        g.setColor(0x000000);
64        // 把背景色画满画布
65        g.fillRect(00, getWidth(), getHeight());
66        // 设置画布的前景色
67        g.setColor(0xffffff);
68        // 在画布上写上@
69        g.drawString("@", x, y, Graphics.TOP | Graphics.LEFT);
70        // 刷新画布
71        flushGraphics();
72    }

73}

上面代码运行后,画面上会出现一个"@"字符随着键盘的左右而移动。虽然这离rpg游戏相差很远,但这是一

个游戏的基本框架。下面我们要做的就是把"@"换成我们的英雄。为了程序清晰,我们还要设计一个英雄类Hero,该类继承于Sprite,这个类里面要用到上面的图片。


 1package brave;
 2
 3import javax.microedition.lcdui.game.Sprite;
 4import javax.microedition.lcdui.Image;
 5import java.io.IOException;
 6
 7public class Hero extends Sprite {
 8    // 设置英雄的当前位置
 9    private int x, y;
10    private BraveCanvas braveCanvas;
11
12    public Hero(Image image, int frameWidth, int frameHeight) {
13        // 英雄的初始化
14        super(image, frameWidth, frameHeight);
15    }

16
17    public void setBraveCanvas(BraveCanvas braveCanvas) {
18        this.braveCanvas = braveCanvas;
19    }

20
21    public void init(int x, int y) {
22        // 英雄位置的初始化
23        this.x = x;
24        this.y = y;
25    }

26
27    public void afresh() {
28        // 刷新英雄的位置
29        setPosition(this.x, this.y);
30    }

31
32    public void moveUp() throws IOException {
33        // 英雄上移,并改为相应的图片
34        setImage(Image.createImage("/hero_up.png"), 1726);
35        nextFrame();
36        this.y = Math.max(0, y - 1);
37    }

38
39    public void moveDown() throws IOException {
40        // 英雄下移,并改为相应的图片
41        setImage(Image.createImage("/hero_down.png"), 1726);
42        nextFrame();
43        this.y = Math.min(braveCanvas.getHeight(), y + 1);
44    }

45
46    public void moveLeft() throws IOException {
47        // 英雄左移,并改为相应的图片
48        setImage(Image.createImage("/hero_left.png"), 1726);
49        nextFrame();
50        this.x = Math.max(0, x - 1);
51    }

52
53    public void moveRight() throws IOException {
54        // 英雄右移,并改为相应的图片
55        setImage(Image.createImage("/hero_right.png"), 1726);
56        nextFrame();
57        this.x = Math.min(braveCanvas.getWidth(), x + 1);
58    }

59
60}


然后把BraveCanvas类稍做修改,把"@"换成英雄

 1package brave;
 2
 3import javax.microedition.lcdui.game.GameCanvas;
 4import javax.microedition.lcdui.Graphics;
 5import java.io.IOException;
 6import javax.microedition.lcdui.Image;
 7
 8public class BraveCanvas extends GameCanvas implements Runnable {
 9    private boolean sign;
10    private Graphics g;
11    private Hero hero;
12
13    public BraveCanvas() {
14        super(true);
15    }

16
17    public void startup() {
18        this.sign = true;
19        try {
20            Image heroimage = Image.createImage("/hero_up.png");
21            hero = new Hero(heroimage, 1726);
22            hero.setBraveCanvas(this);
23            hero.init(4040);
24        }
 catch (Exception e) {
25            e.printStackTrace();
26        }

27        Thread thread = new Thread(this);
28        thread.start();
29    }

30
31    public void run() {
32        g = getGraphics();
33        while (sign) {
34            try {
35                input(g);
36                paint(g);
37                Thread.sleep(15);
38            }
 catch (Exception e) {
39                System.out.println("2:" + e);
40            }

41        }

42    }

43
44    public void input(Graphics g) throws IOException {
45        int keystates = getKeyStates();
46        switch (keystates) {
47        case UP_PRESSED:
48            hero.moveUp();
49            break;
50        case DOWN_PRESSED:
51            hero.moveDown();
52            break;
53        case LEFT_PRESSED:
54            hero.moveLeft();
55            break;
56        case RIGHT_PRESSED:
57            hero.moveRight();
58            break;
59        }

60        hero.afresh();
61    }

62
63    public void paint(Graphics g) {
64        g.setColor(0x000000);
65        g.fillRect(00, getWidth(), getHeight());
66        g.setColor(0xffffff);
67        hero.paint(g);
68        flushGraphics();
69    }

70}


这样,我们的英雄就可以在画面上移动了,不过英雄比较简单,没有hp,mp等等,只是一个图片。而且如果大家感觉英雄的脚步过快,可以在BraveCanvas类中的Hero初始化时设置:




1hero.setFrameSequence(new int[]{00110022 });


只有注册用户登录后才能发表评论。


网站导航: