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

第一次亲密接触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天就做了个各方面效果都相当炫的效果的游戏,自己比较得意,哈哈。

相关推荐

    我的第一个j2me游戏代码

    我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我的第一个j2me游戏代码我...

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏下,上为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    J2ME游戏开发(第一版)

    《J2ME游戏开发(第一版)》是针对Java Micro Edition(J2ME)平台进行游戏编程的专业指导书籍。J2ME是Java平台的一个子集,主要用于嵌入式设备和移动设备,如早期的智能手机和平板电脑。这本书的焦点在于教导开发者...

    J2ME小游戏J2ME小游戏J2ME小游戏上,下为另一部分

    J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏J2ME小游戏

    j2me游戏引擎详解

    总之,J2ME游戏引擎是构建移动平台上游戏的关键工具,它们通过提供一系列预封装的功能和优化,帮助开发者克服硬件限制,创造出引人入胜的游戏体验。随着技术的发展,虽然现在更多高级平台如Unity和Unreal Engine占据...

    j2me游戏开发 经典教程

    j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发j2me游戏开发

    j2ME游戏开发详解

    总之,j2ME游戏开发涉及到多方面的技术和技巧,从基础的MIDP API学习,到游戏设计、图形动画和音频处理,再到性能优化和分发部署,每一个环节都是成功开发游戏的关键。通过深入理解和实践,开发者可以创造出丰富的...

    J2me 游戏原代码

    Java 2 Micro Edition (J2ME) 是一种用于开发小型设备和嵌入式系统的 Java 平台,尤其在早期智能手机和功能手机上广泛应用于游戏开发。"J2ME 游戏原代码" 提供的资源可能是一个包含 J2ME 游戏完整源代码的压缩包,名...

    J2ME 游戏开发资源

    J2ME,全称Java 2 Micro Edition,是Java平台的一个子集,主要用于移动设备、嵌入式设备上的应用程序开发,尤其是手机游戏。这个压缩包包含的“J2ME游戏开发资源”是一份宝贵的资料库,对于想要学习或从事J2ME游戏...

    经典j2me游戏实例

    Java 2 Micro Edition(J2ME)是Java平台的一个子集,专门用于开发在移动设备和嵌入式系统上运行的应用程序,其中包括许多经典的游戏。本篇将通过分析提供的文件名来探讨J2ME游戏开发的基础知识。 1. **NewGame....

    J2ME游戏源代码

    J2ME应用的数据存储一般采用RecordStore系统,这是一个简单的键值对数据库,用于保存用户数据和游戏进度。 8. **优化技巧** 由于资源限制,J2ME游戏需要进行性能优化。例如,减少绘图调用、使用位图操作而非颜色...

    J2ME游戏的基本结构

    J2ME 游戏开发通常需要一个集成开发环境(IDE),如 NetBeans 或 Eclipse,以及相应的 J2ME 插件。这些工具提供代码编辑、编译、模拟器测试等功能,帮助开发者构建和调试应用程序。 二、配置文件 J2ME 游戏的核心...

    j2me游戏中文教程

    《J2ME游戏开发中文教程》是一本专为Java ME(J2ME)平台上的游戏开发而设计的详细指南。J2ME,全称为Java 2 Micro Edition,是Java技术的一个分支,主要用于移动设备和嵌入式系统的应用程序开发,包括手机、智能...

    j2me游戏开发实例

    本资源包含多个J2ME游戏的源代码,对于学习J2ME游戏开发的初学者来说,是一个极其宝贵的实践参考。 首先,我们要理解J2ME的游戏开发基础。J2ME使用MIDP(Mobile Information Device Profile)和CLDC(Connected ...

    J2ME游戏开发J2ME游戏开发

    J2ME游戏的发布通常涉及将游戏打包成JAR(Java Archive)文件,然后通过运营商的网络服务或第三方应用商店分发。用户可以通过设备的内置浏览器或应用商店下载并安装。 **总结** J2ME游戏开发是一个涵盖多方面技术...

    J2ME 游戏

    J2ME 游戏

    J2ME游戏开发(第一版)无打印限制版

    《J2ME游戏开发》是一本专注于Java 2 Micro Edition (J2ME) 平台上游戏开发的专业书籍。该书由Jason Lam编写,Deaboway Chou翻译成中文版本。本书旨在教授读者如何利用J2ME的技术栈来开发适用于移动设备的游戏。 ##...

    一个简单的j2me游戏源码.rar

    【标题】"一个简单的j2ME游戏源码"揭示了我们正在探讨的是一个基于Java Micro Edition(J2ME)平台开发的小型游戏项目。J2ME是Java平台的一个子集,专为资源有限的移动设备如早期的智能手机、功能手机以及嵌入式系统...

    j2me游戏.rar

    Java 2 Micro Edition(J2ME)是一种针对嵌入式设备和移动设备的Java平台,主要用于开发手机游戏、应用程序和服务。"j2me游戏.rar"很可能是包含了一系列使用J2ME技术开发的游戏资源包。在本文中,我们将深入探讨J2ME...

Global site tag (gtag.js) - Google Analytics