原文见: http://today.java.net/pub/a/today/2005/07/07/j2me3.html?page=3
定义游戏的角色和特征一个只能将图片左右移动的游戏是没有意思的。我们现在要对清单1的代码作一些改动,让它变得更有趣些。首先我们要定义游戏显示的边界,这样能保证在所有设备上的大小一致,先定义一些常量,如下代码所示:
(注意,我们这里引入了一个游戏特征:couple小精灵很快就可以在屏幕上跳动了)在游戏屏幕上定义的这些常量规定了游戏的边界,如图2所示。
图 2. 用常量定义游戏边界当然,我们现在需要修改代码来使用这些常量。在清单1的代码中添加一个buildGameScreen(Graphics g)方法,如下代码所示:
再在updateGameScreen()方法里绘制couple之前添加一个该方法的调用,还要将couple小精灵的开始位置由CENTER_Y改为BASE(在start()方法里设置coupleY = BASE)。
couple小精灵可以左右移动,我们要限制它走出边界,更改calculateCoupleX()方法里左右移动的代码,避免坐标超出边界。修改后的代码如下:
方法使用Math.max()和min()函数使图片显示在游戏边界内。注意我们在计算中还考虑了图片的大小。
我们刚才说过要实现couple小精灵在屏幕上跳跃的功能,我们现在增加一个方法使图片在Y轴上移动,跳跃时移动的具体路径将不受玩家影响。
在清单1的代码中添加三个新的实例变量:up、jumpHeight 和random。如下所示:
jumpHeight初始值被设为MAX_HEIGHT。jumpHeight变量会在couple小精灵每次跳跃时动态设为随机值,新增的calculateCoupleY()方法如下:
你可能已经发觉,这个方法不依赖于用户的按键,传入的keyState信息也没有用到。传入这个值是为了与calculateCoupleX()方法保持一致。方法刚开始时通过渐增coupleY变量值使couple小精灵上升,直到达到这次的跳跃高度(刚开始是MAX_HEIGHT)。达到这个高度后,小精灵开始往下降,降到BASE后又随机生成一个介于MAX_HEIGHT和图像高度之间的数值,按这个高度开始下一次跳跃。
游戏的整个效果是一个以随机高度跳跃的couple小精灵,它可以在用户的操纵下左右移动。图3是游戏的一个截屏: 图 3. 游戏截屏
承接第一部分,介绍小游戏的具体实现,实现第一个版本,并介绍GameCanvas类的使用及运行机制。
原文见:http://www.blogjava.net/Andyluo/archive/2005/12/08/23003.html
图中有14个著名的开源项目,你都能看出来吗?(答案附文后)答案:
原文见:http://today.java.net/pub/a/today/2005/07/07/j2me3.html?page=2构建一个J2ME游戏:从GameCanvas类开始
GameCanvas类继承自Canvas,提供了一个屏幕后端的缓冲区,所有的绘制操作都先在这个缓冲区里进行。当所有绘制操作完成后,我们调用flushGraphics()方法将缓冲区内容输出到屏幕。这种双缓冲机制可以使图像的移动更加平滑,避免图像的闪烁。缓冲区大小等于屏幕的大小,而且每一个GameCanvas实例有且仅有一个缓冲区。
GameCanvas类提供一种存储按键状态的机制,我们可以通过它方便的了解用户与游戏的交互。这种机制可以跟踪用户按特殊键的次数,调用getKeyStates()方法返回所有游戏键按键状态的二进制表示,1代表上次调用方法后按过该键,0表示上次调用后还没有按过该键。我们可以跟踪的游戏状态有(这里的键都是在Canvas类里定义的):DOWN_PRESSED, UP_PRESSED, RIGHT_PRESSED, LEFT_PRESSED, FIRE_PRESSED, GAME_A_PRESSED, GAME_B_PRESSED, GAME_C_PRESSED和GAME_D_PRESSED。
首先扩展GameCanvas类,定制一个游戏画布,代码见清单1。清单2是运行例子的MIDlet。
清单 1. MyGameCanvas:游戏画布的第一个版本
清单 2 是使用这个游戏画布的MIDlet:
清单 2. 运行游戏示例的MIDlet类
使用Wireless工具建立一个工程,导入这两个类,然后生成并运行工程。确保你的工程目录res中有这个图片文件,并保证名称为couple.gif, 图1是运行结果。
图1. 构建一个游戏:使用GameCanvas类
使用设备的方向键可以左右移动屏幕中的小图像,这是通过从checkUserInput()里取得按键状态,然后调用calculateCoupleX(),通过将按键状态与GameCanvas里预定义的按键值进行与操作(&),得到用户当前按的键,然后将实例变量更新,最终反映到设备屏幕上。
图像是在updateGameScreen()方法里被绘制到屏幕上的。这个方法使用传入的Graphics对象进行绘制,每一个GameCanvas只有一个Graphics对象。方法首先擦除上次绘制的图像,然后基于当前的coupleX值(还有一直不变的coupleY值)绘制couple.gif图像,最后将缓冲区的数据输出到屏幕。
run()方法里的循环体遵循我们刚开始提出的游戏结构。循环每30毫秒检查一次用户输入并刷新屏幕。你可以试着将这个值改变一下,这会改变刷新的频率。
最后,注意MyGameCanvas的构造器里调用了父类GameCanvas的构造方法,传入的参数为true,这表示从Canvas类继承的按键事件机制被抑制了,因为我们的代码不需要这些通知机制。我们的游戏状态用GameCanvas里自带的按键信息(由getKeyStates()方法取得)来处理已经足够了。通过抑制“keyPressed”、“keyReleased”和“keyRepeated”等通知机制,可以提高游戏的性能。
原文见:http://today.java.net/pub/a/today/2005/07/07/j2me3.htmlJ2ME是一个很流行的用于移动设备游戏开发的平台。J2ME中的MIDP 2.0引入了一个新的API包,它提供了一些定义好的游戏结构,这在以前的1.0版中要通过很多累赘代码来实现。在这部分tutorial中,我们会学习这个API包,然后用它开发一个小游戏(为了学习需要,我们会用到包中所有的类)。这个包是javax.microedition.lcdui.game. 它的建立基于我们前两次学的J2ME概念。
J2ME游戏API:摘要javax.microedition.lcdui.game包只有5个类:GameCanvas, Layer, Sprite, TiledLayer和LayerManager. 这5个类提供了开发各种游戏应用的平台。
Layer是Sprite和TiledLayer的父类。这个类封装了游戏中可视化元素的行为。可视化元素可以是小精灵(sprite),代表一个可以在屏幕上来回移动的独立图形(或组成动画的一组图形),或是一个背景层:通过很少的图片,就可以生成庞大游戏中的背景。我们可以用Layer来布置图形和进行可视化操作。Layer的子类通过重写paint(Graphics g)方法将元素绘制到屏幕上。
LayerManager类可以控制各层的绘制及绘制顺序,因此我们可以更方便地管理游戏中的可视化元素(包括小精灵和背景层)。
GameCanvas类扩展了上两节我们讲过的Canvas类(画布),提供一个在屏幕后端运行(off-screen)的缓冲区,所有绘制操作都先在这个缓冲区上进行,然后再显示到屏幕。它还提供了得到用户按键信息的快捷方法。
最好的学习方法应该是写一个完整的小游戏,通过这个小游戏我们可以了解游戏制作的方方面面。我们在介绍完这个小游戏的构造后(针对目前还没有游戏开发经验的),会在开发游戏的过程中具体介绍包中的每个类。
构建游戏的简短入门
游戏和动画是建立在重复执行某段代码的机制上的。这段代码跟踪实例变量的值,然后更新相应状态。基于当前游戏状态,代码将游戏元素绘制到屏幕上。实例变量值是随着用户交互和游戏内部行为而改变的。
代码的重复执行是通过将这段代码放入循环中实现的。在进入循环前,先检查一下实例变量,看是否要继续游戏,否则退出循环。为了控制实例变量的更新频率(其实是屏幕刷新的频率),循环体中的代码应该每次休眠一段时间(毫秒计)。
游戏的结构如下列代码所示:
我们将在以下几节中使用这个结构来开发一个游戏。
转自:http://forum.ubuntu.org.cn/viewtopic.php?t=6774
1、临时更改(不需要重启):代码: $ sudo ifconfig eth0 down $ sudo ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX $ sudo ifconfig eth0 up
这样做完以后default route可能就没有了,要重新加一下 代码: $ sudo route add default gw xxx.xxx.xxx.xxx
2、永久更改:代码: $ sudo gedit /etc/iftab
eth0 mac 00:e0:4d:75:8e:50(改成你要的物理地址mac)
代码: $ sudo gedit /etc/network/interfaces
将iface eth0 inet static后面添加一行
hwaddress ether 00:E0:4d:75:8E:50
如:iface eth0 inet static hwaddress ether 00:E0:4d:75:8E:50(自己加的) address 219.220.214.113 。 。 。
然后就好了 可能要重启一下
Getting Started with MIDP 2.0
J2ME Tutorial, Part 1: Creating MIDlets
J2ME Tutorial, Part 2: User Interfaces with MIDP 2.0
J2ME Tutorial, Part 3: Exploring the Game API of MIDP 2.0