`
sharong
  • 浏览: 496689 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
D1667ae2-8cfc-3b68-ac7c-5e282789fa4a
论开源
浏览量:8833
7eb53364-fe48-371c-9623-887640be0185
Spring-data-j...
浏览量:13191
社区版块
存档分类
最新评论

第一次亲密接触J2ME游戏

阅读更多
以前从未接触和开发过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游戏,文章里肯定有错误和不足的地方,请行家高手指正。
分享到:
评论
21 楼 xmj101 2010-03-31  
文章不錯,頭像不好,換個美女,哈哈
20 楼 鸟哥哥 2010-02-07  
javax.microedition.lcdui.Graphics 
 public static final int BASELINE 64 
 public static final int BOTTOM 32 
 public static final int DOTTED 1 
 public static final int HCENTER 1 
 public static final int LEFT 4 
 public static final int RIGHT 8 
 public static final int SOLID 0 
 public static final int TOP 16 
 public static final int VCENTER 2 

也就是SOLID了?
实体?画图用实体?画字还差不多吧。用0虽然没错,按理来说应该抛出参数不对的异常的,但它在实现运行中没有。
在drawImage里,0与TOP|LEFT效果一致。这里建议写成20(TOP=16,LEFT=4,LEFT|TOP=20),写成0的话,解析不清楚,也许0是默认值?我是不知道了。
19 楼 sharong 2010-02-07  
鸟哥哥 写道
sharong 写道
鸟哥哥 写道
g.drawImage(birdImg, birdAppearX, birdAppearY, 0); 

请问anchor为什么是0?

关于参数的说明,可以参考api的说明啊

对,我就是发现没这个参数,才发问的。
我做j2me那么久,第一次发现用这个参数的。

下面是wtk3.0对drawImage方法的说明,我用的wtk是3.0,是不是2.5.2版的drawImage方法有一些不同?
drawImage

public void drawImage(Image img,
                      int x,
                      int y,
                      int anchor)

    Draws the specified image by using the anchor point. The image can be drawn in different positions relative to the anchor point by passing the appropriate position constants. See anchor points.

    If the source image contains transparent pixels, the corresponding pixels in the destination image must be left untouched. If the source image contains partially transparent pixels, a compositing operation must be performed with the destination pixels, leaving all pixels of the destination image fully opaque.

    If img is the same as the destination of this Graphics object, the result is undefined. For copying areas within an Image, copyArea should be used instead.

    Parameters:
        img - the specified image to be drawn
        x - the x coordinate of the anchor point
        y - the y coordinate of the anchor point
        anchor - the anchor point for positioning the image 
    Throws:
        IllegalArgumentException - if anchor is not a legal value 
        NullPointerException - if img is null
    See Also:
        Image
18 楼 鸟哥哥 2010-02-05  
sharong 写道
鸟哥哥 写道
g.drawImage(birdImg, birdAppearX, birdAppearY, 0); 

请问anchor为什么是0?

关于参数的说明,可以参考api的说明啊

对,我就是发现没这个参数,才发问的。
我做j2me那么久,第一次发现用这个参数的。
17 楼 sharong 2010-02-05  
稻-草 写道
这个不会用图像数组吗?



#     //换图片,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; 
#     }

恩,多谢啊,用一个数组来表示是一个好办法,只是在内存的占用上并没有什么优势。
16 楼 sharong 2010-02-05  
鸟哥哥 写道
g.drawImage(birdImg, birdAppearX, birdAppearY, 0); 

请问anchor为什么是0?

关于参数的说明,可以参考api的说明啊
15 楼 稻-草 2010-02-05  
这个不会用图像数组吗?



#     //换图片,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; 
#     }
14 楼 鸟哥哥 2010-02-05  
g.drawImage(birdImg, birdAppearX, birdAppearY, 0); 

请问anchor为什么是0?
13 楼 yestotofu 2010-02-04  
做游戏要有美工支持才行
12 楼 sharong 2009-10-21  
shhbobby 写道
能提一提你看了哪些源代码不?

看了一下网上的二人麻将,俄罗斯,连连看的源代码。
11 楼 shhbobby 2009-10-21  
能提一提你看了哪些源代码不?
10 楼 shhbobby 2009-10-21  
谢谢指点,我感觉现在j2me还是很有前途的
9 楼 sharong 2009-10-20  
shhbobby 写道
我以前也是做jee的,现在想弄弄j2me。不知道怎么开头阿 ,各位赐教一下拉

我当时学习,第一步,是先google了一些资料,找了一些常用类,看了一下API文档,把这几个常用类熟悉;第二步,从网上当了一些程序,阅读别人的代码,前后总共也就学习了4,5天时间。
然后自己就开始写程序了,写程序的过程中,对J2ME的了解在不断加深。
只开发了一个游戏,现在像什么双缓冲技术,浮点运算,伪随机数生成,MIDP2.0,MIDP2.1的区别,硬盘读写,局部刷新等等什么的,在开发过程中统统都明白了。
8 楼 shhbobby 2009-10-20  
我以前也是做jee的,现在想弄弄j2me。不知道怎么开头阿 ,各位赐教一下拉
7 楼 sharong 2009-09-21  
紫之皇 写道
恕小弟献丑,我之做过一个手机游戏,但是我在那个游戏里从未奢侈过用int,觉得short足够了,如果short不够的,只能用long了,int实在不太有用

说的很对啊,我开发时用了很多byte类型
6 楼 紫之皇 2009-09-17  
恕小弟献丑,我之做过一个手机游戏,但是我在那个游戏里从未奢侈过用int,觉得short足够了,如果short不够的,只能用long了,int实在不太有用
5 楼 xiaoleizi 2009-09-17  
偶之前是j2ee的,后来偶然间接触了j2me,学的很有兴致,唉,无奈现在又回到j2ee了,只是偶尔看看j2me的东西。
4 楼 gundumw100 2009-09-16  
偶是从j2me转型到j2ee的,呵呵。
3 楼 cqllang 2009-09-16  
7年J2ee经验,也算老鸟了。。。

呵呵。必竟都是基于j2se基础的。一通百通嘛。。。学习起应该快些
2 楼 sharong 2009-09-16  
whaosoft 写道
j2me 没接触过,现在主要从事 j2ee

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

相关推荐

    使用C++制作戰車射擊-100%提供源码

    使用C++制作战车射击-100%提供源码 以及可执行的源码, 让你回到任天堂的时代 ...ASP.NET Web (第一次亲密接触ASP.NET) http://download.csdn.net/source/2241466 http://hqioan.download.csdn.net/

    使用C++制作3D动画人物-100%提供源码

    使用C++制作3D动画人物-100%提供源码 以及可执行的源码, 决对不会让你失望, 人物真的会动, 希望对大家会有帮助 ...ASP.NET Web (第一次亲密接触ASP.NET) http://download.csdn.net/source/2241466

    深入研究Windows内部原理系列-下载影片网址-16份档案-总共172M

    从开机引导过程,应用程序,驱动管理,用户模式,visua,............. 是不可多得的教学影片 档案是&lt;&lt;url.txt&gt;&gt;里面包有下载影片网址&gt;&gt;...ASP.NET Web (第一次亲密接触ASP.NET) http://download.csdn.net/source/2241466

    使用C++超级玛丽制作-100%源码公开-不用钱o

    包含制作的说明档(readme.doc)以及一定会动的执行档 一、 超级玛丽制作揭秘1工程开始 2 ...ASP.NET Web (第一次亲密接触ASP.NET) http://download.csdn.net/source/2241466 http://hqioan.download.csdn.net/

    Programming Embedded Systems 2nd

    1. Introduction ................................................................................................ 1 What Is an Embedded System? ............................................................

    USB30 Universal Serial Bus 3.0 Specification pdf it is free

    ASP.NET Web (第一次亲密接触ASP.NET) http://download.csdn.net/source/2241466 1 Introduction 1-1 11 Motivation 1-1 12 Objective of the Specification 1-2 13 Scope of the Document1-2 14 USB Product ...

Global site tag (gtag.js) - Google Analytics