以前从未接触和开发过J2ME游戏方面的东东,此次从6月下旬开始,先学习了半个月,不过这半个月也基本没顾上学,公司总是今天做同级生游戏,明天又节奏巨星游戏,天天尽折腾这些游戏的设计了,真正学J2ME估计只有4,5天的时间。
之后就开始开发和修改一款麻将游戏,通过开发这个游戏,学到了很多游戏开发的方法和经验,体会到一个J2ME程序,想要在小小的手机上运行,优化工作是多么的重要。
1.开发J2ME游戏一个首要的条件就是,从一开始开发,就一定的有几款测试用真机,一款显然是不够的。而且测试用真机理论上应该找性能非常差的老旧机器(当然是曾经非常畅销的机型);屏幕分辨率相当重要,否则你在模拟器上跑的非常欢实的程序,放到真机上,那简直就是噩梦。
2.本次开发在一穷二白的空白基础上,竟然自己想到了开发无数多屏幕效果,例如小鸟飞,云彩飘动,字体垂直下落,字体递推向上,打字机效果等等,现在回想起来,其实这些效果都很好实现,下面是小鸟从屏幕右边水平飞到左边的部分代码:
private void birdFly(Graphics g,int beiHeight) {
birdCount++;
int bottom = screenHeight - beiHeight - ban1Img.getHeight();
//换图片,bird1Img,bird2Img,bird3Img已经实例化过,最好是一张大图包含若干小鸟状态
Image birdImg = null;
if (birdCount % 3 == 0) {
birdImg = bird1Img;
} else if (birdCount % 3 == 1) {
birdImg = bird2Img;
} else if (birdCount % 3 == 2) {
birdImg = bird3Img;
}
//birdAppearX, birdAppearY等是成员变量,自己设置需要的初始值
birdAppearX -= 10;
//如果右边到达了左边界
if( birdAppearX < 0){
birdAppearX=screenWidth-birdImg.getWidth();
birdAppearY = GameUtils.getRandomByRate(beiHeight + 5, bottom, bottom - gate1Img.getHeight()/2, "90%");
}
g.drawImage(birdImg, birdAppearX, birdAppearY, 0);
}
3.在J2ME游戏中切忌,千万不能使用多个Canvas类。本次开发一开始就是使用了好几个Canvas类,在Nokia N95上,每次切换到下一个Canvas,都会有白屏闪动一下,后来总算解决了这个问题,就是在开发中只使用一个真正的Canvas,其他的都仅仅是类和对象而已,构成实例后,放到Canvas中运行即可。
此方法对任何真机都可奏效,不会出现白屏,黑屏一闪而过的问题。
4.随机数的生成和使用。本次开发中,发现SUN的WTK中的CLDC1.0的jar包中竟然不支持nextInt(int n)这个方法,于是寻找了若干随机数生成方法。由于java程序生成的仅仅是伪随机数,因此在循环中生成随机数时,几乎所有的方法都有问题,今后仍然需要寻找一个真正好用的随机数算法。或者说,在程序里尽量少用随机数算法。
下面是我的一些随机数算法例程:
public class GameUtils {
private static long lRandomSeed = 0;
private static Random random = new Random();
public static int nextInt(int limit){
random.setSeed(lRandomSeed++);
int absVar = Math.abs(random.nextInt());
if (limit == 0){
limit = 1;
}
return (absVar % limit);
}
public static int nextInt(int limit){
return Math.abs(random.nextInt()) % limit + 1;
}
public static int nextInt(int n,long lseed) {
if (n <= 0)
throw new IllegalArgumentException("n must be positive");
//Random random = new Random();
random.setSeed(lseed);
if ((n & -n) == n) // i.e., n is a power of 2
return Math.abs((int) ((n * (long) random.nextInt()) >> 31));
int bits, val;
do {
bits = random.nextInt();
val = bits % n;
} while (bits - val + (n - 1) < 0);
return Math.abs(val);
}
}
由于这是我第一次近距离接触J2ME游戏,文章里肯定有错误和不足的地方,请行家高手指正。