在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 {
}
}
系统在启动的时候, 会自动调用MIDlet
的startApp()
,然后进入到运行状态.
而这个要被启动的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
}
运行的效果如下:
我们再在
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度.
运行效果如下:
可以看出, 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. 这也是为什么,当出现一些'名词'的时候,我会加上官方说明链接. 这样就可以在我的解读之下,也有权威的描述可供参考. 在保证阅读流畅性的前提下, 也要尊重各位的理解能力, 不能描述的太简单或太啰嗦. 写这个东西可真辛苦呀 _(:з」∠)_