【贪吃蛇—Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解

【贪吃蛇—Java程序员写Android游戏】系列 1.Android SDK Sample-Snake详解 Snake也是一个经典游戏了,Nokia蓝屏机的王牌游戏之一。Android SDK 1.5就有了它的身影。我们这里就来详细解析一下Android SDK Sample中的Snake工程。本工程基于SDK 2.3.3版本中的工程,路径为:%Android_SDK_HOME% /samples/android-10/Snake 本次详细解析了Android SDK 自带 Sample——Snake的结构和功能。下次将会把这个游戏移植到J2ME平台上,并且比较Android和J2ME的区别和相通之处,让从 阅读详情

 

本次会详细讲解将Android的Snake Sample移植到J2ME上,从而比较二者的区别和联系。

在《1.Android SDK Sample-Snake详解 》中,我们已经详细介绍了Android实现的Snake项目结构,现在我们要将这个项目用J2ME实现。

一、 J2ME vs. Android

Android的UI实用、方便,而且很美观,基本无需改动且定制方便。而J2ME的高级用户界面比较鸡肋,在现在大多数的应用里都看不到,多数稍微复杂点的界面都是手工画,或是用一些开源的高级UI库。接下来我们简单比较下二者的区别,为Snake项目从Android到J2ME的移植做准备。

1. 平台

J2ME :

开发平台

Android :

操作系统

2. 工程结构

J2ME :

res:资源文件

src:源代码

Android :

src:源代码

res/drawable:图片

res/raw:声音

res/values:字符串

assets:数据文件

3. 安装包

J2ME :

jad,jar

Android :

apk

4. 代码结构

J2ME :

MIDlet,Canvas,采用继承的方式,只有一个MIDlet,一般只有一个Canvas

Android :

Activity,View,采用继承的方式,只有一个Activity,一般只有一个View

5. 入口程序

J2ME :

MIDlet类

Android :

Activity类

6. 主程序结构

J2ME :

Android :

7. 生命周期- 开始

J2ME :

startApp(),活动状态,启动时调用,初始化。

Android :

onCreate(),返回时也会调用此方法。

onCreate()后调用onStart(),onStart()后调用onResume(),此时Activity进入运行状态。

8. 生命周期- 暂停

J2ME :

pauseApp(),暂停状态,如来电时,调用该接口。

Android :

onPause()。

9. 生命周期- 销毁

J2ME :

destroyApp(),销毁状态,退出时调用。

Android :

onStop(),程序不可见时调用onDestroy(),程序销毁时调用。

10. 刷新

J2ME :

高级UI组件由内部刷新实现。低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环。低级UI架构可以用MVC方式来实现,建议使用二级缓存。

Android :

高级UIHandler类通过消息的机制刷新。onDraw()刷新接口,低级UI开发者用线程控制更新,在lockCanvas()和unlockCanvasAndPost()方法之间绘制。

如果去读API,我们可以发现J2ME中Canvas的repaint()与Android中View的invalidate()/postInvalidate()方法实现了相同的功能(连说明文字几乎都一样…),但是invalidate()/postInvalidate()两者却有着区别:invalidate() 只能在UI这个线程里通过调用onDraw(Canvas canvas)来update屏幕显示,而postInvalidate()是要在non-UI线程里做同样的事情的。这就要求我们做判断,哪个调用是本 线程的,哪个不是,这在做多线程callback的时候尤为重要。而在J2ME中,不管怎样直接调用repaint()就好了。

11. 绘画

J2ME :

Displayable类。J2me中所有可显示的组件都是直接或间接的继承了Displayable,直接的是Canvas和Screen。不同的继承导致了低级 UI和高级UI的区别。J2me中现成的UI组件都是直接或者间接继承了Screen。只要调用Display.getDisplay(MIDLet instan).setCurrrent(Displayable disp),就可以把组件显示到手机界面上。切换界面的时候也可以使用该接口。

Android :

View类。可见的组件直接或者间接继承了android.view.View。通过 Activity.setContentView(View view)就可以显示在android手机界面上,切换界面的时候也可以使用该接口。如果是直接继承了View而不是Android自带的UI组件,那么 还要自己去实现它的刷新,类似J2me的低级UI组件。

12. 画笔

J2ME :

高级UI组件由内部刷新实现。低级UI,canvas中通过调用线程结合repaint()来刷新,让线程不断循环。低级UI架构可以用MVC方式来实现,建议使用二级缓存。

Android :

Canvas类,Android绘 制的时候会传入一个参数Paint。该对象表示绘制的风格,比如颜色,字体大小,字体格式等。Android的Canvas不同于J2ME的Canvas,它更像于J2ME的Graphics,用来绘制。

13. 全屏

J2ME :

Canvas中SetFullScreenMode()。

Android :

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);

14. 获得屏幕尺寸

J2ME :

Canvas类的getHeight()和getWidth()

Android :

Display d = getWindowManager().getDefaultDisplay();

screenWidth = d.getWidth();

screenHeight = d.getHeight();

15. 可绘区域

J2ME :

int clipX = g.getClipX();

int clipY = g.getClipY();

int clipWidth = g.getClipWidth();

int clipHeight = g.getClipHeight();

g.clipRect(x, y, width, height);

g.setClip(clipX, clipY, clipWidth, clipHeight);//释放当前状态

Android :

canvas.save();//保存当前状态

canvas.clipRect(x,y, x+width, y+height)

cavnas.resave();//释放当前状态

16. 清屏操作

J2ME :

g.setColor(Color.WHITE);

g.fillRect(0,0,getWidth(),getHeight());

Android :

// 首先定义paint

Paint paint = new Paint();

// 绘制矩形区域-实心矩形

// 设置颜色

paint.setColor(Color.WHITE);

// 设置样式-填充

paint.setStyle(Style.FILL);

// 绘制一个矩形

canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint);

17. 双缓冲

J2ME :

Image bufImage=Image.createImage(bufWidth, bufHeight);

Graphics bufGraphics=bufImage.getGraphics();

Android :

Bitmap carBuffer = Bitmap.createBitmap(bufWidth, bufHeight, Bitmap.Config.ARGB_4444);

Canvas carGp = new Canvas(carBuffer);

18. 图片类

J2ME :

Image类,Image.createImage(path);

Android :

BitMap类,BitmapFactory.decodeResource(getResources(),R.drawable.map0);

19. 绘制矩形

J2ME :

drawRect的后两个参数为宽度和高度

Android :

drawRect的后两个参数为结束点的坐标

20. 按键

J2ME :

keyPressed()

keyRepeated()

keyReleased()

Android :

onKeyDown()

onKeyUp()

onTracKballEvent()

21. 键值

J 2ME :

Canvas.LEFT…

Android :

KeyEvent.KEYCODE_DPAD_LEFT…

22. 触笔

J2ME :

pointerPressed(),pointerReleased(),pointerDragged()

Android :

onTouchEvent()

23. 数据存储

J2ME :

Record Management System (RMS)

Android :

SQLite数据库,SharedPreferences类

24. 连接

J2ME :

从Connector打开,可以直接在Connector.Open时设置连接是否可读写,以及超时设置

Android :

从URL对象打开,必须使用setDoInput(boolean)和setDoOutput(boolean)方法设置,使用setConnectTimeout(int)不仅可以对连接超时进行设置,还能设置超时时间,参数为0时忽略连接超时

25. 游戏开发包

J2ME :

javax.microedition.lcdui.game.*;

GameCanvas/Layer/LayerManager/ Sprite/TiledLayer

Android :

无专门针对游戏的开发包。

26. 音效

J2ME :

Player s=Manager.createPlayer(InputStream);

s.prepare();//创建

s.start();//播放

s.stop();//暂停

s.stop();//关闭

s.release();//释放

Android :

MediaPlayer类处理背景音乐

SoundPool类处理一些简单的音效

27. 显示文本

J2ME :

String

Android :

TextView类

28. 打印信息

J2ME :

System.out.println()

Android :

Log类

二、 迁移关键点

1. 基础 类和结构

J2ME程序的主体从Activity改变为MIDlet,TileView从View改变为Canvas,相关的方法也需要进行调整,但是主体结构和逻辑还是一致的。此外,有些J2ME不支持的类,需要做对应处理。

资源获取,从xml 改为自行获取:

 

ArrayList ,用Vector 替换掉:

 

Bundle ,用RMS 实现:

 

Log ,自己实现Log 系统:

 

2. TileView 类

(1)用Image替换BitMap,“private Image[] mTileArray;”

(2)private final Paint mPaint = new Paint();不再需要了。直接在Graphics中drawImage即可

(3)onSizeChanged() 不会被自动调用,需要在构造函数中主动调用,以实现对应功能。onSizeChanged(this.getWidth(),this.getHeight());

(4)最重要的,用paint替换onDraw,呵呵,Canvas的核心啊!失去它你伤不起!!!咱也试试咆哮体!!!!!!

3. SnakeView 类

(1)J2ME 没有Handler,直接用Thread定期repaint()就OK。这里要啰嗦几句。

熟悉Windows编程的朋友可能知道Windows程序是消息驱动的,并且有全局的消息循环系统。而Android应用程序也是消息驱动的,按道理来说也应该提供消息循环机制。实际上Android中也实现了类似Windows的消息循环机制,它通过Looper、Handler来实现消息循环机制,Android消息循环是针对线程的(每个线程都可以有自己的消息队列和消息循环)。

Android系统中Looper负责管理线程的消息队列和消息循环。Handler的作用是把消息加入特定的(Looper)消息队列中,并分发和处理该消息队列中的消息。构造Handler的时候可以指定一个Looper对象,如果不指定则利用当前线程的Looper创建。

一个Activity中可以创建多个工作线程或者其他的组件,如果这些线程或者组件把他们的消息放入Activity的主线程消息队列,那么该消息就会在主线程中处理了。因为主线程一般负责界面的更新操作,并且Android系统中的weget不是线程安全的,所以这种方式可以很好的实现Android界面更新。在Android系统中这种方式有着广泛的运用。

如果另外一个线程要把消息放入主线程的消息队列,就需要通过Handle对象,只要Handler对象以主线程的Looper创建,那么调用Handler的sendMessage等接口,将会把消息放入队列都将是放入主线程的消息队列。并且将会在Handler主线程中调用该handler的handleMessage接口来处理消息。

之所以Android有这些处理,是因为Android平台来说UI控件都没有设计成为线程安全类型,所以需要引入一些同步的机制来使其刷新。而对于J2ME来说,Thread比较简单,直接匿名创建重写run方法,调用start方法执行即可。或者,也可以从Runnable接口继承。实现如下:

 

(2)直接使用String代替TextView类,在Canvas的paint()中直接绘制各种提示信息。

(3)在一些地方需要主动调用repaint()进行强制重绘。

其它具体参考源代码。

4. Snake 类

本类就比较简单了,直接把源代码贴出来如下:

 

本次就大概介绍这么多,源代码将在下次放出。下次主要讲解源代码的存储和维护,敬请期待。

J2ME 贪食蛇游戏源码 之前学J2ME游戏时写的贪食蛇游戏,整理优化后打包上传,供初学者学习。 包括游戏JAR包、源码、详细注释,240*320屏幕上开发,未做机型适配,诺基亚6120c上测试通过。 立即下载

相关推荐

j2me贪吃蛇源码

j2me贪吃蛇源码,可以正常运行,对初学者有一定帮助

J2ME贪吃蛇源代码——200行左右,包含详细注释

//文件名:SnakeMIDlet .javapackage snake;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;public class SnakeMIDlet extends MIDlet {    SnakeCanvas displayable = new SnakeCanvas()

爪哇米工作室陈跃峰的移动开发博客 9652

基于J2ME的贪吃蛇游戏的开发与实现代码

基于J2ME的贪吃蛇游戏的开发与实现:J2ME(Java 2 Micro Edition)是一种主要针对消费类电子设备的高度优化的Java运行环境,是Java 2的一个组成部分。当今开发手机 软件、游戏,到嵌入式开发,J2ME都是主流。该文介绍了J2ME体系结构与其开发环境,着重就贪吃蛇这一经典手机游戏的开发与实现作了详细 介绍。

j2me贪吃蛇(Demo学习总结)

(存手绘版贪吃蛇 [掌握里面面向对象的编程思想 和 ‘MVC模式’] )游戏思路:首先:规划出所需的类,其次,为每个类详细列出各个类所需属性和方法。比如就拿Food类来讲,他本身有x, y属性,绘制自己的方法(drawMe(Graphics g) ), 判断蛇是否吃到食物的方法(

xyylchq的专栏 812

J2ME版贪吃蛇游戏

NULL 博文链接:https://smq-java.iteye.com/blog/418968

JAVA程序设计之J2ME的手机游戏开发贪吃蛇(源代码+LW).zip

JAVA程序设计之J2ME的手机游戏开发贪吃蛇(源代码+LW). 在贪吃蛇游戏中,玩家操作由小方块连接而成的蛇,去吃随机散落在画面内的小方块,每吃一块就增加一小方块长度,要是撞壁以及撞自己的尾,就属于失败,如无失败则直到通关为止。 屏幕的长度的行向为11单位,纵向为18单位。在这个范围内,玩家通过操作方向键来控制蛇的运动方向。该游戏的最大特色是屏幕自适应,无论各种手机,PDA的屏幕大小如何,该游戏总是能获得最佳的显示效果。

基于Java的贪吃蛇游戏设计与实现

本次设计实验完成后,让我对程序的设计、实现、调试与维护进行了切实的体验。深刻的了解到了前期设计对于整个软件编程过程是多么重要。因为设计的不完善,在随后的调试当中走了好多的弯子。而实际上,本次设计代码实现当中所出现的绝大部分问题,都是由于我在前期设计时候的不完善,设计太粗犷所引起的。而实际上整个过程中唯独编程(即实现)所花时间是最少的,在调试阶段所花的时间最多。但幸运的是,因为采用螺旋式设计方式帮助我解决了很大一部分问题,并让我对设计的理解的深化,虽然由于时间问题,我在工作过程中的很多有趣的设想并没有完成。

qq_61141142的博客 2749

J2ME自己做的贪吃蛇游戏

自己在学习J2ME过程中做的一个贪吃蛇游戏。

利用J2ME制作的手机游戏----贪吃蛇

在此附上游戏画布的的代码及完成后的产品 package com.xiang.game.graph; import javax.microedition.lcdui.Canvas; import javax.microedition.lcdui.Command; import javax.microedition.lcdui.CommandListener; import java...

追求专业 275

Abaqus 2023 保姆级安装避坑指南:从环境变量到许可证配置,一次搞定

本文提供Abaqus 2023的详细安装指南,涵盖环境变量设置、许可证配置等关键步骤,帮助用户避开常见安装陷阱。通过系统环境检查、目录结构规划、许可证服务器安装及Java环境配置等实用技巧,确保顺利完成安装并优化软件性能。

weixin_42524276的博客 425

三角洲行动交易行自动化脚本

DFMarketBot - 三角洲行动自动交易助手 DFMarketBot是一款专为三角洲行动游戏设计的交易行自动化工具,通过OCR识别和鼠标模拟实现自动补卡、补子弹功能。项目采用Python开发,支持Windows平台,主要功能包括: 自动检测并购买指定物品(房卡/子弹) 价格监控与智能购买(低于设定价格自动下单) 自定义购买数量与次数限制 支持窗口/无窗口两种游戏模式 使用前需安装Tesseract OCR引擎并配置游戏为1920*1080分辨率。通过JSON文件可灵活配置监控物品清单、理想价格和购买策

愤怒的阿木木的博客 3万+

【贪吃蛇―Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解

【贪吃蛇―Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解 2011年04月10日   本次会详细讲解将Android的Snake Sample移植到J2ME上,从而比较二者的区别和联系。   在《1.Android SDK Sample-Snake详解 》中,我们已经详细介绍了Android实现的Snake项目结构,现在我们...

tkxhw29a 277

二、时间序列的预处理

一般情况下,拿到一个观察值序列之后,首先要对它的平稳性和纯随机性进行检验,这两个重要的检验称为序列的预处理。根据检验的结果可以将序列分为不同的类型,对不同类型的序列我们会采用不同的分析方法。 一、平稳性检验 1、特征统计量 (1)概率分布           数理统计的基础知识告诉我们分布函数或者密度函数能够完整地描述一个随机变量的统计特征。同样,一个堆积变量族{Xt} 的统计特征也完全由...

Nicole的博客 2万+

【贪吃蛇—Java程序员写Android游戏】系列 2. 用J2ME实现Android的Snake Sample预览

为了让大家更好的理解J2ME和Android编程的差别,我用J2ME重新实现了Android的Snake Sample。下次,我会详细介绍在将Snake从Android移植到J2ME上时,需要特别注意的问题,并对Android和J2ME的区别和联系进行粗略的比较。本次,暂时把J2ME实现的运行画面列出如下。JAVA的好处就是一次编写多处运行,:-),我的PC上各种模拟器都有,因此在WTK、黑莓、Nokia N97上都跑了跑。可运行的包也给大家一下:http://download.csdn.net/sourc

no pain no gain no Gavin 8253

从SPI协议到文件系统:手把手教你用HAL库给W25Q16移植FATFS(附扇区管理优化方案)

本文详细介绍了如何在STM32平台上,通过HAL库的SPI接口为W25Q16 Flash芯片移植FATFS文件系统。文章从SPI通信基础讲起,深入解析了FATFS底层驱动(diskio.c)的移植要点,并重点探讨了针对W25Q16的4KB物理扇区特性进行扇区管理优化的两种方案,旨在帮助开发者构建稳定高效的文件存储方案。

happy2的博客 1043

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 379

JAVA桌面版、J2ME版、ANDROID版贪吃蛇

呃,主要是想复习下J2ME,不然忘记了,就做了3个版本。 先说说本程序实现的结构: J2SE: Food类: 实现食物随机产生及判断是否会碰撞在墙壁上或蛇身上 GameWindow类:主要实现整个游戏的线程及双缓冲 Snake类:绘制蛇身判断是否会碰撞在墙壁,移动,变长,自己撞到自己 Wall类:实现墙壁 Score类:实现计分

Simdanfeg的专栏 2261

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1117

【贪吃蛇—Java程序员写Android游戏】系列 0. 前言几句话

<br />这段时间以来,本博陆续介绍了Android系统的开发和调试环境、模拟器,并详细解析了Android的一个实例SoftKeyboard,这里具体列出如下:Android是什么Android SDK 2.3与Eclipse最新版开发环境搭建(一)Android SDK 2.3与Eclipse最新版开发环境搭建(二)Android SDK 2.3与Eclipse最新版开发环境搭建(三)Android SDK 2.3与Eclipse最新版开发环境搭建(四)Android SDK 2.3与Eclipse最

fengg5241的专栏 666

040、全志V853低功耗AI视觉平台的ISP调优——电池供电场景下的画质与功耗平衡

本文分享了全志V853 AI视觉平台在电池供电场景下的ISP调优经验。作者通过实际项目踩坑案例,揭示了V853 ISP的特殊性:不同于主流平台,其ISP与CPU共享时钟域,降噪能力有限,需特别注意功耗控制。关键优化策略包括:关闭无效ISP模块、优化Sensor联动时钟、采用场景自适应配置、开发快速启动模式等。特别指出V853个体差异大,量产需考虑高低温影响。文章强调V853的ISP功耗优化需从寄存器级别精打细算,不能简单套用其他平台经验,建议选型时单独评估ISP功耗,避免续航缩水。

zzfmlxs的博客 25

“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型

得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。

getusushu的博客 98
上一篇: 【贪吃蛇—Java程序员写Android游戏】系列 0. 前言几句话
下一篇: 【贪吃蛇—Java程序员写Android游戏】系列 3. 用J2ME实现Android的Snake Sample详解
周三山
博客等级 码龄23年 303粉丝 40原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值