分享
 
 
 

J2ME游戏开发技巧(2)

王朝java/jsp·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能...

编写自己的工具类

因为手机内存和功能的限制,J2ME只提供了部分的J2SE工具类供使用者调用。所以有时我们不得不编写自己的工具类来实现一些特殊的功能。下面给出的kSet类就类似于J2SE中Set工具类的功能。它用来记录游戏中被删去的方块集合,同时保证集合中没有相同元素。

/***

Description: Set类在J2ME上的实现

*Date:2003.2.28*Author:Tomjava

*email:tomjava@sohu.com

*/

public class kSet

{//用单链表实现PRivate kSetNode head;public kSet(){head=null;}

//将kSet清空

public void clear(){head=null;}

//向kSet中添加元素

public boolean add(int x,int y)

{kSetNode node=new kSetNode(x,y);return add(node);}

//向kSet中添加元素

public boolean add(kSetNode node)

{ if(!contains(node))

{ node.next=head;head=node;return true;}

else{return false;}}

//判断kSet是否为空

public boolean isEmpty()

{if(head==null)return true;elsereturn false;}

//摘下链表头元素并返回此元素

public kSetNode getFirst()

{ kSetNode p=head;head=p.next;return p;}

//遍历kSet,如果有相同元素返回true,否则返回

false

public boolean contains(kSetNode node)

{kSetNode p = head;while (p != null)

{if(p.equals(node))return true;p=p.next;

}return false;}

}

//kSet中的元素

public class kSetNode

{ public int x,y;public kSetNode next;

public kSetNode(int x,int y)

{this.x=x;this.y=y;next=null;}

public boolean equals(kSetNode node)

{if(node.x==x&&node.y==y)

return true;elsereturn false;

}

public int getX(){return x;

}

public int getY(){return y;}

kSetNode类负责记录被删除方块的坐标,它重载equals()方法用来判断两个方块是否是同一个方块。kSet类是由kSetNode对象组成的没有相同元素的集合,用单链表实现,并且提供了 getFirst()、add()、clear()、isEmpty()、contains()等方法供其它类调用。编写和使用一些这样的工具类,将大大加快编程的速度,也使程序变得更加清晰。 矫正屏幕坐标

GridOne这个游戏是专门为MotoT720开发的,也就是说游戏背景图片大小和MotoT720型手机的大小是相等的。如果它在那些屏幕比MotoT720大的手机上运行,游戏背景图片会显示在屏幕左上角而影响美观,这时就要用到屏幕矫正技术,使得游戏背景图片居中显示。矫正屏幕坐标代码如下:

public class BlocksCanvas extends Canvas implements Runnable{

private final int addX;//坐标矫正

private final int addY;

private final int SCREEN_X;//屏幕顶点

private final int SCREEN_Y;

private final int WAITBLOCK_X;//等待方块顶点

private final int WAITBLOCK_Y;

private final int SCORES_X;//分数顶点

private final int SCORES_Y;

private final int STAR_X;//五角星的顶点

private final int STAR_Y;

public BlocksCanvas()

{//取得当前手机屏幕的高度和宽度

height = getHeight();

width = getWidth();//坐标矫正量

addX = (width-120)/2;

addY = (height-142)/2;//初始化屏幕参数

SCREEN_X = addX + 48;//屏幕顶点

SCREEN_Y = addY + 10;

WAITBLOCK_X = addX + 19;//等待方块顶点

WAITBLOCK_Y = addY + 103;

SCORES_X = addX + 36;//分数顶点

SCORES_Y = addY + 34;

STAR_X=addX+4;//五角星的顶点

STAR_Y=addY+70;

}

} 首先把所有有关屏幕的参数都定义成private final int型变量。这里之所以加上final 修饰符,是因为不希望变量附初值后,它们的值会发生变化;之所以不加static修饰符,是因为要在其函数中初始化变量,而不是在定义时就初始化好了。先用getHeight()和getWidth()函数取得当前手机屏幕的高度和宽度,再计算出需要的偏移量addX和addY,然后加到各屏幕参数上,这样游戏内容就会居中显示了。图2与图3是效果比较图。

图2 :矫正前

图3 :矫正后

还有一点需要注意,用getHeight()取得的并不是手机屏幕的真实高度,而是手机屏幕的高度减去Command标签高度,因为屏幕需要留出地方显示Command标签。

合理使用内存

本来使用Java编程是不需要关心内存使用的,因为Java有它引以为豪的垃圾处理机制。但到了J2ME里,情况发生了变化,因为手机的内存只有屈指可数的几百K,再也不能像在J2SE里那样大手大脚了。否则就会发现,即使程序没有任何语法和逻辑错误,也不能在模拟器中运行。下面给出合理使用内存的几个建议:

1.尽可能使用本地变量代替类成员,减少对象的创建,最好能重新利用对象;

2.不要试图在初始化的时候把所有Form或者Canvas对象都读入内存中,而应该在需要的时候再创建,虽然这样在显示上会有一些延迟,但是总比程序不能运行或者内存溢出要好;

3.一旦对象不需要使用就及时将其置为null,以便能够被垃圾处理器回收,适当的时候调用System.gc()语句提示虚拟机调用垃圾处理器;

4.必须记住Java的内存管理是有向边机制,所以对于不使用的对象,千万不要让正在使用的对象指向它,以免内存得不到回收;

5.尽量使图片占有的字节数小一点,可以使用fireworks在保证图片质量同时减小图片的大小;

即使做到上面几点,也不能保证程序不会发生内存泄漏,因为手机内存毕竟那么少。所以我提出最后一个建议,就是先完成游戏的主体部分,使它能够正常运行并没有内存泄漏,再慢慢扩展游戏,给它加上封面和其它功能。一旦发现内存不足,再去掉部分功能。

使游戏更有魅力

编写游戏当然希望它能吸引人,我觉得下面几个地方值得大家注意:

1.注意控制游戏的节奏

原来我在削除方块的时候,什么都不做就直接删除,然后开始一个新的循环,让等待的方块往下掉。在实际运行的时候感觉效果不是很好,因为削得越快,上面的方块也掉得越快,让游戏者有一种措手不及的感觉。后来我在删除方块的时候,用空循环停顿了几秒钟,这样就给了游戏者一个反应时间,感觉就好些了,而且如果连削的话,反应时间会更长,这样使得游戏者在玩游戏时有一种轻松的感觉。再后来,我将空循环改成对屏幕上的方块遍历三次,让被删的方块闪烁,使得游戏者能够看清楚被删除的方块,欣赏到自己的成果,这样又增加了游戏的吸引力。

2.利用图片实现丰富多彩的表达效果

在J2ME中如果不能控制文字的大小和字体,那么这将使游戏的效果大打折扣。不过,可以通过把各种特殊的文字做成图片的方法来解决这个问题。有些地方我们也可以用图片来取代文字,使得游戏更加生动,比如在等级栏用五角星来表示游戏的难度。使用图片还有一个好处就是增加游戏的通用性,使得游戏在不同手机上的显示基本相同。另外,如果出现字体颜色在模拟器中显示正常,而在手机上显示不正常的情况,也可以用这种方式解决。

3.让游戏能够自动调整难度

我使用如下函数,使得游戏难度不断加大。

private void giveLevel()

{if(level<=10)

{ levelSleep=600-(level - 1) * 50;

if(levelSleep<200)levelSleep=200;

levelDelTask=200+(level-1)*100;

if(levelDelTask>1000)levelDelTask=1000;//画等级--五角星

paintStar();

}

else{gameWin();}

}

level表示游戏等级,levelSleep表示方块下落一个的等待时间,levelDelTask表示过一关需要删除的方块数,也可以理解为过一关需要完成的任务。上面的计算公式可以保证游戏会越来越难,增加了游戏的吸引力

(出处:http://www.knowsky.com)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有