【代码】如何快速将J2me游戏移植到Android上
2013-09-11 12:13
567 查看
前言
小白:“老大,你让做的三个J2me游戏搞定了,请看DEMO。”
老大:“恩,不错,小白,你知道Android这个平台吧?”
小白:“恩,听过。听说和J2ME有很多共同点。”
老大:“(一阵奸笑)很多共同点是吧?”
小白:“恩。”
老大:“那好,你把这几个J2ME游戏给我移植到Android上去。”
小白:“……”
很多J2ME开发者可能都会遇到这样的临时性需求。其实J2ME程序往Android移植,并不是特别麻烦。
经过一番认真学习,小白开始整理起了笔记……
零 高级UI界面
J2ME的高级用户界面比较鸡肋,在现在大多数的应用里都看不到,多数稍微复杂点的界面都是手工画,或是用一些开源的高级UI库,但Android则不同,它的UI实用、方便,而且很美观,基本无需改动且定制方便。
一 设备差异
虽说普通的手机性能越来越高,屏幕也越来越大,但平均而言,运行J2ME的手机从性能和屏幕分辨率及附属功能来说不及Android手机。拿入门的HTC G1来说,CPU为528MHz,屏幕为3.17英寸触摸屏、HVGA 480×320像素,192MB RAM和256MB ROM。所以从J2ME移植到Android的程序可以暂时不考虑性能问题。
但要充分发挥Android手机的特点。要注意一下几点:
比如应用UI的布局可以更加自由,输入更加灵活,网络应用注意发挥3G、WIFI的速度优势。
游戏要注意可适当的用效率换效果,可增加动画、音效、背景音乐的质量,图片元素的大小,发挥高分辨率手机的优势,强大的运算能力可以让开发人员编写基于OpenGL的3D游戏,可以用一些吃CPU但效果不错的开发包,如Box2D仿真物理引擎开发包。
可以结合GPS定位、重力感应、话筒、指南针、触笔的压力感应等等让游戏的效果更加逼真。
二 常用类对比
三 开始移植
小白找到Android中对应的J2ME相关的替代类和替代方法后,开始噼里啪啦的改代码了。没过多久,首个俄罗斯方块算是移植成功。当他开始移植下一款游戏时,发现又要重复的改那些代码……
“可不可以减少代码的改动呢?”小白问自己。“可否用Android的相关代码构造一些和J2me里功能类似的代码呢?”
原则:尽量少改动J2ME项目的代码。用Android中对应的类改写成J2ME中的方法和类,减少以后移植的工作量,甚至实现无缝移植。
“或许我可以构造一个名为MIDlet实为Activity的类,这样J2me中的入口类就不用改动了”
用Activity类改装的MIDlet类:
MIDlet类我们解决了,接下来就是非常重要的Canvas类了。
J2me里的Canvas类相当于Android体系中的SurfaceView类,都是负责绘制显示界面的,游戏的大循环一半也在这两个类里实现,也就是都会实现Runnable类,更新逻辑和更新界面都在此类的大循环中处理。
Graphics类在J2me里负责绘图和排版样式等。
我们可以用Android里的Canvas类和Paint类共同组合一个Android里的Graphics类,如Graphics类的构造函数可这样定义:
Graphics里可以设置居中方式,在Android体系里我们用Paint类来实现相同的效果,例如:
所有的绘制方法也同样沿用J2me中的方法名,用Android体系的代码完成方法体,达到无缝移植。以绘制、填充矩形为例:
再来说说按键处理:
大体思路就是获取Android中的按键消息后,修改封装一下,转换成J2me的键值和事件,然后传递给显示层。
先定义出J2me中的键值:
经过中间一个转换方法:
转换成J2me的按键处理体系,转去调用J2me原生的keyReleased方法:
其他的字体类、颜色类、等等都可以按此方法无缝移植。
Font字体类用Android中的FontMetrics重写。
而Graphics类中的setColor(int rgb)以及setColor(int r,int g,int b)方法,则可以修改Graphics类中Paint的颜色。如:
小白心想: “或许我还可以用Android中的Canvas类改写一个J2me中的Graphics类,用Android中的Bitmap改装一个J2me中的Image类……然后把J2me游戏开发包javax.microedition.lcdui.game包里的GameCanvas类,Layer类,LayerManager类,Sprite类,TiledLayer类直接拿来用。嗯嗯,几乎不用改动原来的J2me代码了。第一个移植任务花费了一个周,以后一天就能移植一个小游戏啦。哈哈哈。”
本文摘自:清源教育 ,转载请注明此处,谢谢!
小白:“老大,你让做的三个J2me游戏搞定了,请看DEMO。”
老大:“恩,不错,小白,你知道Android这个平台吧?”
小白:“恩,听过。听说和J2ME有很多共同点。”
老大:“(一阵奸笑)很多共同点是吧?”
小白:“恩。”
老大:“那好,你把这几个J2ME游戏给我移植到Android上去。”
小白:“……”
很多J2ME开发者可能都会遇到这样的临时性需求。其实J2ME程序往Android移植,并不是特别麻烦。
经过一番认真学习,小白开始整理起了笔记……
零 高级UI界面
J2ME的高级用户界面比较鸡肋,在现在大多数的应用里都看不到,多数稍微复杂点的界面都是手工画,或是用一些开源的高级UI库,但Android则不同,它的UI实用、方便,而且很美观,基本无需改动且定制方便。
一 设备差异
虽说普通的手机性能越来越高,屏幕也越来越大,但平均而言,运行J2ME的手机从性能和屏幕分辨率及附属功能来说不及Android手机。拿入门的HTC G1来说,CPU为528MHz,屏幕为3.17英寸触摸屏、HVGA 480×320像素,192MB RAM和256MB ROM。所以从J2ME移植到Android的程序可以暂时不考虑性能问题。
但要充分发挥Android手机的特点。要注意一下几点:
比如应用UI的布局可以更加自由,输入更加灵活,网络应用注意发挥3G、WIFI的速度优势。
游戏要注意可适当的用效率换效果,可增加动画、音效、背景音乐的质量,图片元素的大小,发挥高分辨率手机的优势,强大的运算能力可以让开发人员编写基于OpenGL的3D游戏,可以用一些吃CPU但效果不错的开发包,如Box2D仿真物理引擎开发包。
可以结合GPS定位、重力感应、话筒、指南针、触笔的压力感应等等让游戏的效果更加逼真。
二 常用类对比
三 开始移植
小白找到Android中对应的J2ME相关的替代类和替代方法后,开始噼里啪啦的改代码了。没过多久,首个俄罗斯方块算是移植成功。当他开始移植下一款游戏时,发现又要重复的改那些代码……
“可不可以减少代码的改动呢?”小白问自己。“可否用Android的相关代码构造一些和J2me里功能类似的代码呢?”
原则:尽量少改动J2ME项目的代码。用Android中对应的类改写成J2ME中的方法和类,减少以后移植的工作量,甚至实现无缝移植。
“或许我可以构造一个名为MIDlet实为Activity的类,这样J2me中的入口类就不用改动了”
用Activity类改装的MIDlet类:
public abstract class MIDlet extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); startApp(); } public abstract void destroyApp(boolean unconditional); public String getAppProperty(String key) { return null; } public abstract void startApp(); public void notifyDestroyed() { } public void notifyPaused() {} public void pauseApp() {} public void platformRequest(String URL) {} public void resumeRequest() {} }
MIDlet类我们解决了,接下来就是非常重要的Canvas类了。
J2me里的Canvas类相当于Android体系中的SurfaceView类,都是负责绘制显示界面的,游戏的大循环一半也在这两个类里实现,也就是都会实现Runnable类,更新逻辑和更新界面都在此类的大循环中处理。
Graphics类在J2me里负责绘图和排版样式等。
我们可以用Android里的Canvas类和Paint类共同组合一个Android里的Graphics类,如Graphics类的构造函数可这样定义:
public Graphics(Bitmap bitmap) { this.bitmap = bitmap; this.canvas = new Canvas(bitmap); this.canvas.clipRect(0, 0, bitmap.getWidth(), bitmap.getHeight()); this.canvas.save(Canvas.CLIP_SAVE_FLAG); this.paint = new Paint(); this.clip = canvas.getClipBounds(); }
Graphics里可以设置居中方式,在Android体系里我们用Paint类来实现相同的效果,例如:
public void setAlign(int align) { if(LEFT == align (Graphics.LEFT | Graphics.TOP) == align (Graphics.LEFT | Graphics.BOTTOM) == align) { paint.setTextAlign(Align.LEFT); }else if(HCENTER == align (Graphics.HCENTER|Graphics.TOP) == align) { paint.setTextAlign(Align.CENTER); }else if(RIGHT == align (Graphics.RIGHT | Graphics.TOP) == align) { paint.setTextAlign(Align.RIGHT); } }
所有的绘制方法也同样沿用J2me中的方法名,用Android体系的代码完成方法体,达到无缝移植。以绘制、填充矩形为例:
public void fillArc(int x,int y,int width,int height, int startAngle,int arcAngle) { paint.setStyle(Style.FILL); canvas.drawArc(new RectF(x,y,width,height), startAngle, arcAngle, true, paint); } public void drawArc(int x,int y,int width,int height, int startAngle,int arcAngle) { paint.setStyle(Style.STROKE); canvas.drawArc(new RectF(x,y,width,height), startAngle, arcAngle, true, paint); }
再来说说按键处理:
大体思路就是获取Android中的按键消息后,修改封装一下,转换成J2me的键值和事件,然后传递给显示层。
先定义出J2me中的键值:
public class GameCanvas extends Screen { public static final int UP = 1; public static final int DOWN = 6; public static final int LEFT = 2; public static final int RIGHT = 5; public static final int FIRE = 8; public static final int GAME_A = 9; public static final int GAME_B = 10; public static final int GAME_C = 11; public static final int GAME_D = 12; public static final int KEY_NUM0 = 48; public static final int KEY_NUM1 = 49; public static final int KEY_NUM2 = 50; public static final int KEY_NUM3 = 51; public static final int KEY_NUM4 = 52; public static final int KEY_NUM5 = 53; public static final int KEY_NUM6 = 54; public static final int KEY_NUM7 = 55; public static final int KEY_NUM8 = 56; public static final int KEY_NUM9 = 57; public static final int KEY_STAR = 42; public static final int KEY_POUND = 35; }
经过中间一个转换方法:
public int keyCode4J2me = 0; public int keyAction4J2me = 0; public void changeToJ2meKey(int keyCode, KeyEvent e) { if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) { keyCode4J2me = GameCanvas.DOWN; keyAction4J2me = GameCanvas.DOWN; } else if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) { keyCode4J2me = GameCanvas.LEFT; keyAction4J2me = GameCanvas.LEFT; } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) { keyCode4J2me = GameCanvas.RIGHT; keyAction4J2me = GameCanvas.RIGHT; } else if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) { keyCode4J2me = GameCanvas.FIRE; keyAction4J2me = GameCanvas.FIRE; } else if (keyCode == KeyEvent.KEYCODE_0) { keyCode4J2me = GameCanvas.KEY_NUM0; } else if (keyCode == KeyEvent.KEYCODE_1) { keyCode4J2me = GameCanvas.KEY_NUM1; } else if (keyCode == KeyEvent.KEYCODE_2) { keyCode4J2me = GameCanvas.KEY_NUM2; } }
转换成J2me的按键处理体系,转去调用J2me原生的keyReleased方法:
public boolean onKeyUp(int keyCode, KeyEvent e) { changeToJ2meKey (keyCode,e); keyReleased(keyActual); return true; }
其他的字体类、颜色类、等等都可以按此方法无缝移植。
Font字体类用Android中的FontMetrics重写。
而Graphics类中的setColor(int rgb)以及setColor(int r,int g,int b)方法,则可以修改Graphics类中Paint的颜色。如:
public void setColor(int r,int g,int b) { int argb = (0xff000000)+(r<<16)+(g<<8)+b; paint.setColor(argb); }
小白心想: “或许我还可以用Android中的Canvas类改写一个J2me中的Graphics类,用Android中的Bitmap改装一个J2me中的Image类……然后把J2me游戏开发包javax.microedition.lcdui.game包里的GameCanvas类,Layer类,LayerManager类,Sprite类,TiledLayer类直接拿来用。嗯嗯,几乎不用改动原来的J2me代码了。第一个移植任务花费了一个周,以后一天就能移植一个小游戏啦。哈哈哈。”
本文摘自:清源教育 ,转载请注明此处,谢谢!
相关文章推荐
- 浅谈J2me游戏如何快速移植到Android
- J2ME游戏如何快速移植到Android
- 浅谈J2me游戏如何快速移植到Android
- J2me游戏如何快速移植到Android(1)
- J2me游戏如何快速移植到Android (2)
- J2me游戏如何快速移植到Android (2)
- 浅谈J2me游戏如何快速移植到Android
- 浅谈J2me游戏如何快速移植到Android
- 如何把J2ME游戏移植到Android平台的方法
- 如何把J2ME游戏移植到Android平台
- Android团队开发中如何快速定位代码修改者等提交信息
- 如何使用android独立工具链快速移植开源项目
- Cocos2d-x游戏开发之代码如何识别ios平台与android并分开处理
- J2ME游戏移植到Android平台的方法
- 已有Java/Android源码项目,如何快速理解代码结构
- J2ME游戏移植到Android平台的方法
- 游戏引擎--基于安卓平台对J2ME游戏代码的移植
- 【读书笔记《Android游戏编程之从零开始》】9.游戏开发基础(如何快速的进入 Android 游戏开发)
- J2ME 拼图游戏 快速开发 全过程 之代码祥解(2 )——游戏数据库与游戏模型开发
- 关于自己J2ME和android游戏《小鱼吃苹果》的游戏主代码