分享
 
 
 

J2ME 2D小游戏入门之旅(一)游戏的框架

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

作者:favoyang 文章来源:J2ME开发网

前几天看到tony在csdn上发布自己的学习作品“是男人就坚持60s”,觉得创意虽然简单但是却很耐玩,是学习手机游戏制作的入门经典,于是一时兴起,clone了一下,图片依然使用的是tony的图片,纯粹学习之用。如果大家对这个游戏感兴趣可以与tony联系或访问他的blog。 从发展趋势上说midp2.0是趋势,最便宜的midp2.0手机如ot735i,已经1700元左右;而西门子一年前的高端机cx65,现在也只有2500左右;并且2500-3000这个价位的midp2.0手机有多种选择,西门子、se、N机都有。我个人挺喜欢cx65,如果将来手机制造商成本不断降低,相信1500元的midp将不是梦

…当然还要看应用是否丰富了。

言归正传,我们将使用midp 2.0 来开发我们的游戏,代号fly。开发工具jbulider。等文章全写完了,会提供src下载。

目录:

一、游戏的框架

二、完善周边工具类(图象、GameObject、Font)

三、控制飞机的移动

四、加入子弹群,实现碰撞运算

五、实现爆炸效果、并加入道具导弹

六、不足多多,你认为呢?

七、源码

一、游戏的框架 我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者如果要你考虑太多的问题,恐怕会让你偏离主线,这里只给出canvas的代码,不理解可以参看本站的另外一篇系列文章《使用MIDP2.0开发游戏》。

使用singlon实现,因为每个gamecanvas都需要很多的内存空间。另外对我们来说,只要改写gameInit(),gameMain(),一次性初始化的代码写在构造函数中。

public class MyGameCanvas extends GameCanvas

implements Runnable, CommandListener{

private static MyGameCanvas instance;

Graphics g;

boolean running;

Thread t;

Command startcmd,exitcmd,restartcmd;

int keystate;

boolean keyevent;

boolean key_up,key_down,key_left,key_right,key_fire;

private boolean allowinput;

public int screenwidth;

public int screenheight;

boolean gameover;

//define your variable here

//define your variable end

protected MyGameCanvas() {

super(true);

g=getGraphics();

running=false;

t=null;

addCommand(startcmd=new Command("start",Command.OK,1));

addCommand(exitcmd=new Command("exit",Command.EXIT,1));

setCommandListener(this);

screenwidth=getWidth();

screenheight=getHeight();

//put your init once code here

//put your init once code end

}

synchronized public static MyGameCanvas getInstance() {

if (instance == null) {

instance = new MyGameCanvas();

System.out.println("new MyGameCanvas");

}

return instance;

}

public void run(){

System.out.println("MyGameCanvas run start");

long st=0,et=0,diff=0;

int rate=50;//16-17 frame per second

while(running){

st=System.currentTimeMillis();

gameinput();

gameMain();

et=System.currentTimeMillis();

diff=et-st;

if(diff<rate){

//System.out.println("Sleep "+(rate-diff));

try {

Thread.sleep(rate - diff);

}

catch (InterruptedException ex) {}

}else{

//System.out.println("rush , and the frame using time: á"+diff);

}

}

System.out.println("MyGameCanvas run end");

}

public void start(){

if(!running){

running=true;

t=new Thread(this);

t.start();

}

}

private void gameMain() {

g.setColor(0,0,0);//clear screen

g.fillRect(0,0,getWidth(),getHeight());

background.paint(g);//draw background

//g.setColor(255,255,255);

//g.drawString("hello",1,1,g.TOP|g.LEFT);

flushGraphics();

}

private void gameInit() {

gameover=false;

gametime=0;

gametimeoffset=System.currentTimeMillis();

allowinput=true;

key_up=key_down=key_left=key_right=key_fire=false;

}

public void stop(){

if(running){

running = false;

}

}

public void commandAction(Command c, Displayable d) {

String cmdstr=c.getLabel();

if(cmdstr.equals("start")){

gameInit();

start();

removeCommand(startcmd);

addCommand(restartcmd=new Command("restart",Command.OK,1));

}else if(cmdstr.equals("restart")){

stop();

while(t.isAlive());

gameInit();

start();

}else if(cmdstr.equals("exit")){

stop();

Navigate.midlet.destroyApp(false);

Navigate.midlet.notifyDestroyed();

}

}

private void gameinput() {

if(allowinput){

keystate=getKeyStates();

keyevent=false;

if((keystate & UP_PRESSED)!=0){//up

key_up=true;keyevent=true;

//deal your unstop job code here

//System.out.println("up press");

//deal your unstop job code end

}else if((keystate & UP_PRESSED)==0){//release key

if(key_up==true){

key_up=false;

//deal your one press-one job code here

//System.out.println("up release");

//deal your one press-one job code end

}

}

if((keystate & DOWN_PRESSED)!=0){//down

key_down=true;keyevent=true;

//deal your unstop job code here

//System.out.println("down press");

//deal your unstop job code end

}else if((keystate & DOWN_PRESSED)==0){//release key

if(key_down==true){

key_down=false;

//deal your one press-one job code here

//System.out.println("down release");

//deal your one press-one job code end

}

}

if((keystate & LEFT_PRESSED)!=0){//left

key_left=true;keyevent=true;

//deal your unstop job code here

//System.out.println("left press");

//deal your unstop job code end

}else if((keystate & LEFT_PRESSED)==0){//release key

if(key_left==true){

key_left=false;

//deal your one press-one job code here

//System.out.println("left release");

//deal your one press-one job code end

}

}

if((keystate & RIGHT_PRESSED)!=0){//right

key_right=true;keyevent=true;

//deal your unstop job code here

//System.out.println("right press");

//deal your unstop job code end

}else if((keystate & RIGHT_PRESSED)==0){//release key

if(key_right==true){

key_right=false;

//deal your one press-one job code here

//System.out.println("right release");

//deal your one press-one job code end

}

}

if((keystate & FIRE_PRESSED)!=0){//fire

key_fire=true;keyevent=true;

//deal your unstop job code here

//System.out.println("fire press");

//deal your unstop job code end

}else if((keystate & FIRE_PRESSED)==0){//release key

if(key_fire==true){

key_fire=false;

//deal your one press-one job code here

//System.out.println("fire release");

//deal your one press-one job code end

}

}

if(!keyevent){

//no keyevent here

//System.out.println("NO KEY press");

//no keyevent end

}

}

}

public static void cleanJob(){

instance=null;

}

}

从发展趋势上说midp2.0是趋势,最便宜的midp2.0手机如ot735i,已经1700元左右;而西门子一年前的高端机cx65,现在也只有2500左右;并且2500-3000这个价位的midp2.0手机有多种选择,西门子、se、N机都有。我个人挺喜欢cx65,如果将来手机制造商成本不断降低,相信1500元的midp将不是梦

…当然还要看应用是否丰富了。

言归正传,我们将使用midp 2.0 来开发我们的游戏,代号fly。开发工具jbulider。等文章全写完了,会提供src下载。

目录:

一、游戏的框架

二、完善周边工具类(图象、GameObject、Font)

三、控制飞机的移动

四、加入子弹群,实现碰撞运算

五、实现爆炸效果、并加入道具导弹

六、不足多多,你认为呢?

七、源码

一、游戏的框架 我们的游戏需要一个通用的游戏框架,也方便以后的开发,但实现一个引擎是复杂的。作为初学者如果要你考虑太多的问题,恐怕会让你偏离主线,这里只给出canvas的代码,不理解可以参看本站的另外一篇系列文章《使用MIDP2.0开发游戏》。

使用singlon实现,因为每个gamecanvas都需要很多的内存空间。另外对我们来说,只要改写gameInit(),gameMain(),一次性初始化的代码写在构造函数中。

public class MyGameCanvas extends GameCanvas

implements Runnable, CommandListener{

private static MyGameCanvas instance;

Graphics g;

boolean running;

Thread t;

Command startcmd,exitcmd,restartcmd;

int keystate;

boolean keyevent;

boolean key_up,key_down,key_left,key_right,key_fire;

private boolean allowinput;

public int screenwidth;

public int screenheight;

boolean gameover;

//define your variable here

//define your variable end

protected MyGameCanvas() {

super(true);

g=getGraphics();

running=false;

t=null;

addCommand(startcmd=new Command("start",Command.OK,1));

addCommand(exitcmd=new Command("exit",Command.EXIT,1));

setCommandListener(this);

screenwidth=getWidth();

screenheight=getHeight();

//put your init once code here

//put your init once code end

}

synchronized public static MyGameCanvas getInstance() {

if (instance == null) {

instance = new MyGameCanvas();

System.out.println("new MyGameCanvas");

}

return instance;

}

public void run(){

System.out.println("MyGameCanvas run start");

long st=0,et=0,diff=0;

int rate=50;//16-17 frame per second

while(running){

st=System.currentTimeMillis();

gameinput();

gameMain();

et=System.currentTimeMillis();

diff=et-st;

if(diff<rate){

//System.out.println("Sleep "+(rate-diff));

try {

Thread.sleep(rate - diff);

}

catch (InterruptedException ex) {}

}else{

//System.out.println("rush , and the frame using time: á"+diff);

}

}

System.out.println("MyGameCanvas run end");

}

public void start(){

if(!running){

running=true;

t=new Thread(this);

t.start();

}

}

private void gameMain() {

g.setColor(0,0,0);//clear screen

g.fillRect(0,0,getWidth(),getHeight());

background.paint(g);//draw background

//g.setColor(255,255,255);

//g.drawString("hello",1,1,g.TOP|g.LEFT);

flushGraphics();

}

private void gameInit() {

gameover=false;

gametime=0;

gametimeoffset=System.currentTimeMillis();

allowinput=true;

key_up=key_down=key_left=key_right=key_fire=false;

}

public void stop(){

if(running){

running = false;

}

}

public void commandAction(Command c, Displayable d) {

String cmdstr=c.getLabel();

if(cmdstr.equals("start")){

gameInit();

start();

removeCommand(startcmd);

addCommand(restartcmd=new Command("restart",Command.OK,1));

}else if(cmdstr.equals("restart")){

stop();

while(t.isAlive());

gameInit();

start();

}else if(cmdstr.equals("exit")){

stop();

Navigate.midlet.destroyApp(false);

Navigate.midlet.notifyDestroyed();

}

}

private void gameinput() {

if(allowinput){

keystate=getKeyStates();

keyevent=false;

if((keystate & UP_PRESSED)!=0){//up

key_up=true;keyevent=true;

//deal your unstop job code here

//System.out.println("up press");

//deal your unstop job code end

}else if((keystate & UP_PRESSED)==0){//release key

if(key_up==true){

key_up=false;

//deal your one press-one job code here

//System.out.println("up release");

//deal your one press-one job code end

}

}

if((keystate & DOWN_PRESSED)!=0){//down

key_down=true;keyevent=true;

//deal your unstop job code here

//System.out.println("down press");

//deal your unstop job code end

}else if((keystate & DOWN_PRESSED)==0){//release key

if(key_down==true){

key_down=false;

//deal your one press-one job code here

//System.out.println("down release");

//deal your one press-one job code end

}

}

if((keystate & LEFT_PRESSED)!=0){//left

key_left=true;keyevent=true;

//deal your unstop job code here

//System.out.println("left press");

//deal your unstop job code end

}else if((keystate & LEFT_PRESSED)==0){//release key

if(key_left==true){

key_left=false;

//deal your one press-one job code here

//System.out.println("left release");

//deal your one press-one job code end

}

}

if((keystate & RIGHT_PRESSED)!=0){//right

key_right=true;keyevent=true;

//deal your unstop job code here

//System.out.println("right press");

//deal your unstop job code end

}else if((keystate & RIGHT_PRESSED)==0){//release key

if(key_right==true){

key_right=false;

//deal your one press-one job code here

//System.out.println("right release");

//deal your one press-one job code end

}

}

if((keystate & FIRE_PRESSED)!=0){//fire

key_fire=true;keyevent=true;

//deal your unstop job code here

//System.out.println("fire press");

//deal your unstop job code end

}else if((keystate & FIRE_PRESSED)==0){//release key

if(key_fire==true){

key_fire=false;

//deal your one press-one job code here

//System.out.println("fire release");

//deal your one press-one job code end

}

}

if(!keyevent){

//no keyevent here

//System.out.println("NO KEY press");

//no keyevent end

}

}

}

public static void cleanJob(){

instance=null;

}

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有