
J2ME游戏移植到Android思路:
在手机游戏中程序要处理的主要有游戏界面(UI),按键,数据保存,游戏算法。游戏算法是用java语言实现。在Android,J2ME上都一样。游戏界面上主要 有图片和文字。在Android上画图片,文字,按键,数据保存的代码与J2ME不一样。区别也不是很大,J2ME游戏移植到Android上主要要改的就是 画图,画文字,按键,数据保存的代码,其它的基本不用改。
利用Android平台的接口重写J2ME的相关接口。
游戏开发中J2ME和Android的区别概述
下面列出了J2ME和Android的主要区别
| 作用 | J2ME实现方式 | Android实现方式 |
| 启动程序时执行的方法 | MIDlet.startApp() | Activity. onCreate() |
| 低级界面类 | Canvas | View |
| 绘制界面的方法 | Canvas.paint() | View.onDraw() |
| 画笔类 | Graphics | Canvas |
| 画图的方法 | Graphics.drawImage() | Canvas.drawBitmap() |
| 画文字的方法 | Graphics.drawString() | Canvas. drawText() |
| 图像类 | Image | Bitmap |
| 按键处理的方法 | keyPressed() | onKeyDown() |
| 触摸屏处理的方法 | pointerPressed() | onTouchEvent() |
| 数据保存 | RMS | Sqlite |
| 启动程序 | Push | BroadcastReceiver |
启动程序时执行的代码的区别
程序启动时要加载资源,把某一个界面对象显示在手机屏幕上。J2ME中启动程序会执行MIDlet子类的startApp方法,在Android中启动程序会执行Activity子类的onCreate方法。
低级界面类的区别
软件的界面可以使用低级界面或高级界面(控件)来画,低级界面最大的优点是程序员对低级界面控制力强,能指定图,文字的具体坐标,能画各种图形。游戏开发 中界面都使用低级界面来完成,在J2ME中低级界面类是Canvas,在Android中低级界面类是View。
画笔类区别
画笔类的主要功能是画图,画文字,画各种图形(矩形,线),在J2ME中画笔类是Graphics,在Android中画笔类是Canvas。
画图的方法代码的区别
游戏开发中地图,人物,道具等很多内容都是用图片表示的,在J2ME中画图用的代码是Graphics.drawImage(),在Android中画图用的代码是Canvas.drawBitmap()。
画文字的区别
游戏中的对话,剧情都是以文字的方式显示出来的。在J2ME中画文字用的代码是Graphics.drawString(),在Android中画文字用的代码是Canvas. drawText()。
图像类的区别
在游戏中人物,地图都是图像,在J2ME中图像对象是Image,在Android中图像对象是Bitmap。
按键处理的区别
在游戏中玩家与手机的交互主要靠按键,玩家通过按键来控制人物的移动,在J2ME中处理按键的代码是keyPressed,在Android中处理按键的代码是onKeyDown
数据保存的区别
在J2ME上保存数据用RecordStore,RecordStore类似于数据库中的一张表,表里有很多条记录,一个记录只有两列,一列是recordId,自动加1,另一列是byte[]类型,下面一段代码演示如何在J2ME上添加读取数据。
//打开记录仓储 RecordStore rs=RecordStore.openRecordStore("users", true); String userName="无名"; byte[] data=userName.getBytes(); //添加数据 rs.addRecord(data, 0, data.length); //读取数据 byte[] readData=rs.getRecord(1); String readUserName=new String(readData); //显示到控制台上 System.out.println(readUserName);
在Android上保存数据可以使用Sqlite数据库,可以在库中创建多张表,在表中创建多个列,功能很强大,下面一段代码演示如何在Android上添加读取数据
// 打开数据库 SQLiteDatabase mdb = this.openOrCreateDatabase("db", 0, null); // 创建表 String sql_create = "create table users (id int,username TEXT)"; mdb.execSQL(sql_create); // 添加数据 String sql_insert = "insert into users(id,username) values(1, '无名')"; mdb.execSQL(sql_insert); // 读取数据 Cursor cur = mdb.rawQuery("select id,username from users", null); cur.moveToFirst(); String readUserName = cur.getString(1); System.out.println("userName=" + readUserName); mdb.close();
| 游戏开发中J2ME和Android相同之处 在游戏开发中,最重要,最难的是游戏算法,游戏算法代码行数一般会占代码的总行数50%以上。游戏算法是用标准的J2SE代码实现,在J2ME和 Android上都是一样的。开发游戏需要框架,如MVC, 框架与语言,开发技术无关。在J2ME和Android上使用MVC的代码是一样的。现在的手机游戏开发都使用编辑器,用编辑器来编辑地图,动作。编辑器的 开发可以使用awt,swing等开发技术。与J2ME, Android无关。 |
程序入口类生命周期的比较:
J2me程序入口类为 MIDlet,所有的 j2me程序都要继承该类来初始化 j2me程序。 Android程序入口是 Activity类。下面先看看她们的生命周期。
J2me MIDlet 生命周期
1 、 startApp (活动状态)程序启动的时候会调用该方法来初始化用户需要的资源。
2 、 PauseApp (暂停状态)当手机来电接电话的时候,会调用该接口。用户可以调用该接口停止也写线程的操作。
3 、 destroyApp (销毁状态)程序退出的时候调用。用户可以调用该接口处理处于活动状态的线程。
该几个周期状态有 AMS 调用转换,也可以程序代码调用转换。 resumeRequest 调用会的结果是 AMS 会调用 startApp 方法, notifyPaused 调用的结果是可能 AMS 调用 PsuseApp , notifyDestroyed 调用会使 AMS 销毁该 midlet 。
Android Activity 生命周期
1 、 onCreate 程序开始初始化的时候调用该接口,用户导航返回到 Activity 的时候也会调用该接口。类似于 J2me 里面多个 Canvase(Displayable) 切换。所以 Activity 也类似于 Displayable 。
2 、 onStart onCreate 调用完后,程序调用该接口。
3 、 onResume onStart 调用后调用该接口。此时 Activity 进入运行状态。
4 、 onPause 新的 Activity 启动的时候调用该接口。
5 、 onStop 该 Activity 不可见的时候调用。
6 、 onDestroy 程序销毁的时候调用。 pubilc class DatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "com.roiding.simple.note";
private static final int DATABASE_VERSION = 1;
private static final String NOTES_TABLE_NAME = "notes";
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + NOTES_TABLE_NAME
+ " (id integer primary key autoincrement, name text);");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS notes");
onCreate(db);
}
}
public static void select(Context context) {
DatabaseHelper mOpenHelper = new DatabaseHelper(context);
String table = "notes";
String[] columns = new String[] { "id", "name" };
String selection = "id>? and name<>?";
String[] selectionArgs = new String[] { "0", "roiding.com" };
String groupBy = null;
String having = null;
String orderBy = "id desc";
String limit = "1";
Cursor c = mOpenHelper.getReadableDatabase().query(table,
columns, selection, selectionArgs, groupBy, having, orderBy, limit);
c.moveToFirst();
for (int i = 0; i < c.getCount(); i++) {
String s = c.getString(1);
c.moveToNext();
}
c.close();
mOpenHelper.getReadableDatabase().close();
}
=============================================================
Android游戏的移植分为硬性移植和软性移植。硬性移植是在不同的硬件平台上进行移植,因为Android是一个开放平台,而且Android平台系统版本多(每个版本之间都存在一定的差异性),硬件规格多。所有的OEM厂商都会根据自己的硬件进行Android系统的定制,以更合适的适应自家的硬件平台。这样一来 Android的开发者在开发游戏时,需要考虑的因素就更多,比如不同版本系统功能上的兼顾性,比如不同硬件架构上CPU/GPU的兼容性等等。
软性移植就是J2ME和Android之间的移植。目前市面上Java VM主要使用的是Sun公司的Java Micro Edition。而Google Android平台采用的是自己开发的Dalvik。虽然都是用JAVA语言进行软件的开发,但是游戏开发者还是需要考虑是否能更好的兼容不同的平台。
硬件的可以执行需要对底层的代码进行修改,这里不做过多的深入讨论。本文讨论的范围主要是软性的可以移植性。平台之间的移植主要部可以分为以下几个方面:
1)用户界面
这一点是J2ME移植到Dalvik上最麻烦的地方,Android的图形类和J2ME有了很大的不同,同时m3到m5的SDK上也有更大改变的趋势,导致了移植时出现很多需要自己去实现相关类,使最终程序的运行效率可能会受影响,真机没有出现的情况下通过开发板可以适当的测试出性能损失。
2)数据存储
这方面就显示出Android平台比Sun Java强大的地方,Android平台附带了一个SQLite数据库,和J2ME中的Record Management System (RMS)相比在功能上有了很大的提升,同时在性能上也会有不俗的表现,在过去开发J2ME软件时一直都采取的是如果数据比较简单使用自定义的二进制格式或XML代替。
3)网络数据
这部分Android平台的做法是import Sun中的I/O读写库InputStream这样的类,同时网络相关的仍然采用Sun的URLConnection类进行操作,基本上没有变化,移植时注意下设备的栈空间简单的调整下就可以了。
4)媒体播放
这部分在Android系统上就有了大幅的改变,官方推荐使用MediaPlayer播放类,该类支持mp3、mid、wav、mp4等常规媒体格式的播放,相比J2ME中提供的就灵活强大的多。
