论坛首页 移动开发技术论坛

第一次亲密接触J2ME游戏

浏览 8897 次
精华帖 (0) :: 良好帖 (3) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-09-10  
以前从未接触和开发过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游戏,文章里肯定有错误和不足的地方,请行家高手指正。
   发表时间:2009-09-16  
j2me 没接触过,现在主要从事 j2ee
0 请登录后投票
   发表时间:2009-09-16   最后修改:2009-09-16
whaosoft 写道
j2me 没接触过,现在主要从事 j2ee

我也是,从事了7年J2EE了,由于公司要转型,所以开始研究手机客户端方面的东东。J2ME本身还是挺有意思的,但是想赚钱目前貌似很困难。
有一点没想到,俺这种老家伙竟然学习速度还相当令自己满意,看了3,4天j2me方面的东东,然后用20天就做了个各方面效果都相当炫的效果的游戏,自己比较得意,哈哈。
0 请登录后投票
   发表时间:2009-09-16  
7年J2ee经验,也算老鸟了。。。

呵呵。必竟都是基于j2se基础的。一通百通嘛。。。学习起应该快些
0 请登录后投票
   发表时间:2009-09-16  
偶是从j2me转型到j2ee的,呵呵。
1 请登录后投票
   发表时间:2009-09-17  
偶之前是j2ee的,后来偶然间接触了j2me,学的很有兴致,唉,无奈现在又回到j2ee了,只是偶尔看看j2me的东西。
0 请登录后投票
   发表时间:2009-09-17  
恕小弟献丑,我之做过一个手机游戏,但是我在那个游戏里从未奢侈过用int,觉得short足够了,如果short不够的,只能用long了,int实在不太有用
0 请登录后投票
   发表时间:2009-09-21  
紫之皇 写道
恕小弟献丑,我之做过一个手机游戏,但是我在那个游戏里从未奢侈过用int,觉得short足够了,如果short不够的,只能用long了,int实在不太有用

说的很对啊,我开发时用了很多byte类型
0 请登录后投票
   发表时间:2009-10-20  
我以前也是做jee的,现在想弄弄j2me。不知道怎么开头阿 ,各位赐教一下拉
0 请登录后投票
   发表时间:2009-10-20  
shhbobby 写道
我以前也是做jee的,现在想弄弄j2me。不知道怎么开头阿 ,各位赐教一下拉

我当时学习,第一步,是先google了一些资料,找了一些常用类,看了一下API文档,把这几个常用类熟悉;第二步,从网上当了一些程序,阅读别人的代码,前后总共也就学习了4,5天时间。
然后自己就开始写程序了,写程序的过程中,对J2ME的了解在不断加深。
只开发了一个游戏,现在像什么双缓冲技术,浮点运算,伪随机数生成,MIDP2.0,MIDP2.1的区别,硬盘读写,局部刷新等等什么的,在开发过程中统统都明白了。
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics