(1) 早期的J2ME游戏--来画个框框呗

在android和ios出现之前,基本上都是J2ME游戏.
虽然J2ME已经没落,但是现在还有一部分机顶盒游戏是使用它来开发的 = =||

使用J2ME来做开篇呢,主要是因为我最早就是用它来做游戏开发的. 而且我也认为使用它更加有历史意义. 不过它的套路也工整,具一定参考性

对这个平台,不感兴趣的话, 直接看最后的总结即可


开始:

首先需要创建一个MIDlet. J2ME游戏都是从这开始的.

public class GmMain extends MIDlet {

    public GmMain() {
    }

    @Override
    protected void startApp() throws MIDletStateChangeException { //重要
    }

    @Override
    protected void pauseApp() {
    }

    @Override
    protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
    }

}

系统在启动的时候, 会自动调用MIDletstartApp(),然后进入到运行状态.
而这个要被启动的MIDlet, 又是在配置文件jad里配置的(创建工程的时候,IDE会默认给配置)


本次目标

我们要画个正方形. 那我们需要哪些步骤呢?

  • 创建一个界面
  • 在界面中刷新绘图
  • 把目标界面显示出来

恩. 是不是很简单? 哈哈哈哈..


创建一个界面

这里要创建的界面就是Canvas,也就是画布.

class GmCanvas extends Canvas{
    
    @Override
    protected void paint(Graphics g) {
    }

}

画布中的这个 paint(Graphics g)方法, 就是我们需要进行绘画的地方, 而传进来的这个Graphics就是我们绘制的工具.

这里看下官方对Canvas的描述:

The Canvas class is a base class for writing applications that need to handle low-level events and to issue graphics calls for drawing to the display.

直翻加粗的话就是"发出图形调用,以绘制到显示器", 对于绘画来讲, 这就是画布Canvas的作用


开始画画

不说废话,先在paint()里写点东西:

    @Override
    protected void paint(Graphics g) {
        int x = 0;
        int y = 0;
        int width = 50;
        int height = 50;
        
        g.setColor(0xFF0000); //设置颜色为红色
        g.fillRect(x, y, width, height); //填充一个矩形,左上角放在点0,0上,长/宽分别50
    }

运行的效果如下:

(1) 早期的J2ME游戏--来画个框框呗_第1张图片
红色小框

我们再在 paint()里紧接着上面,加上几句:

        x = 90;
        y = 30;
        width = 30;
        height = 70;
        g.drawRect(x, y, width, height); //画一个矩形框,左上角放在点90,30上,长/宽分别30/70
        
        int startAngle = 0; 
        int arcAngle = 360;
        x = 70;
        y = 150;
        width = 45;
        height = 45;
        g.setColor(0x00FF00); //设置颜色为绿色
        g.fillArc(x, y, width, height, startAngle , arcAngle); //填充一个椭圆,放在点70,150上,长短轴都为45. 起始角度0度, 终止360度.

运行效果如下:

(1) 早期的J2ME游戏--来画个框框呗_第2张图片
加了个矩形框和圆

可以看出, Graphics提供了好多和画图相关的操作, 有设置颜色的,有画矩形,画圆,还有画图片等一系列操作. 在其它平台上,也有这样类似的组件,可以提供这样的操作.

我们引用下官方在Graphics描述里的第一句话:

Provides simple 2D geometric rendering capability.

可以看到Graphics就是提供简单的2D几何渲染功能的工具


你以为这样就结束了吗?

NO!
如果你仔细从上到下看了, 并且有条件自己去写了, 那么你会发现. 程序执行之后, 压根就没有任何东西画出来~~
因为缺少了一个重要的, 在正常游戏开发中,只需要做一次的操作.
那就是让这个创建出来的界面(Canvas), 被显示出来.

这里就要用到Display. 不过我们依旧废话少说, 把最后的代码给补上, 补在MIDlet里:

public class GmMain extends MIDlet {

    private GmCanvas canvas; //新增
    private Display display; //新增
    
    public GmMain() {
        this.display = Display.getDisplay(this); //获得该MIDlet所持有的,唯一与之绑定的Display
        this.canvas = new GmCanvas(); //创建我们自己的界面
    }

    @Override
    protected void startApp() throws MIDletStateChangeException {
        display.setCurrent(this.canvas); // 把我们创建的界面设置为Midlet当前所要展示的
    }

            .
            . 略
            .
}

代码的注释写已经比较清楚,有些细节我就不介绍了, 毕竟也没什么人用这个平台了.

就这样,简单的图形绘制就完成了.


总结

从上面的代码里,我们可以总结出这么个套路:

  • 创建程序入口
  • 把我们自己的界面设置为需要显示的界面 (Display.getDisplay().setCurrent(this.canvas))
  • 通过界面提供的图形调用接口(Graphics)来渲染, 并在可以进行绘制的地方,如paint()里,进行绘制(有时候这些地方也可以是自己定义的).

上面提到的Canvas.paint()就好比后面,讲Android时会用到的View里的onDraw()和iOS中UIVIew的drawRect(). 这些都是组件提供的,绘制界面的场地.

所有的游戏,在系统框架的层面上讲, 都是这个套

虽然这仅仅只是画了个图, 但一旦让他隔一段时间就刷新一次画面, 并且可以处理来自输入设备的消息,配上点逻辑就变成简单的游戏了.


碎碎念:

这篇东西可是花了我断断续续两天的时间, 中间经历了好几次类似于:" 写了两段, 看着不满意,删减成一段. 往后写了几行, 回过头一看, 又把那一段删成一两句话 ". 还不光是这样删删减减, 有些概念,之前认为自己应该了解的差不多了, 结果当要写出来时, 却发现某些描述还不够准确, 然后就各种查资料, 翻阅官方API. 这也是为什么,当出现一些'名词'的时候,我会加上官方说明链接. 这样就可以在我的解读之下,也有权威的描述可供参考. 在保证阅读流畅性的前提下, 也要尊重各位的理解能力, 不能描述的太简单或太啰嗦. 写这个东西可真辛苦呀 _(:з」∠)_

你可能感兴趣的:((1) 早期的J2ME游戏--来画个框框呗)