快速业务通道

J2ME 2D小游戏入门之旅(三) 控制飞机的移动 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

J2ME 2D小游戏入门之旅(三) 控制飞机的移动

时间:2011-08-09

实在是等不及了吧?加把劲,让我们加入游戏的主角飞机吧。

你可以将这个游戏定位在动作游戏,一个动作游戏需要不断的从用户端获得输入,基本上不间断,所以plane需要不断的改变位置。那么这个基于桢的游戏应该定在多少桢合适呢?这需要在手机中测试,在模拟器上,如果定在15-18桢左右,是比较合适的。听csdn的几位xd说有的游戏仅仅定在12桢,所以不同的游戏是不一定的。基本上动作游戏对机子的要求是要高一点。我们的游戏框架是线性的,即输出显示和接受输入是在同一个线程中,15桢以下的游戏处理输入会显得比较苯,高于20桢如果处理器速度较慢,很容易出现输入卡在缓冲区,处理不过来的情况。现阶段尽量让桢数降下来吧,你不能和pc上用dx编程时,统一30fps的情况相提并论。

在这个以控制精灵移动为主要内容的游戏中,我们不封装任何的游戏事件,我们的程序可能有些稚嫩,没关系,一步一步来吧。

1. 飞机

plane是一个标准的plane。由三桢画面组成,:

在构造函数中,我们加入对飞机的初始化对象语句:

Image img=ImageTools.getImage("/pic/MyPlaneFrames.png");

plane=new GameObject(img,24,24);

在gameInit()中初始化状态,位置居中:

plane.reset();

plane.moveto((screenwidth-plane.sprite.getWidth())/2,(screenheight-plane.sprite.getHeight())/2);

在gameMain中加入:

plane.paint(g);

接下来,让飞机在控制下移动,主要是在gameMain中加入输入处理,如果飞机左移就更新画面到飞机左倾的画面,如果飞机右倾反之,没有输入的时候让飞机处于正常。

if (gameover) { }else{ if (keyevent) { if(key_up){ plane.move(0, -3); plane.sprite.setFrame(0); } if(key_down){ plane.move(0, 3); plane.sprite.setFrame(0); } if(key_left){ plane.move( -3, 0); plane.sprite.setFrame(1); } if(key_right){ plane.move(3, 0); plane.sprite.setFrame(2); } if(key_fire){ } } } else { plane.sprite.setFrame(0); } }

尽管很简单,但这是控制精灵移动的主要方式。可以想象一下,如果往左飞不是简单的一桢画面而是播放动画,该怎么实现呢?我们的GameObject功能有限,没有对spriite的动画序列进行增强,今后我们可以增强GameObject,使其支持多个动画序列,弥补spriite的不足。现在逐渐体会到一个好的游戏引擎是多么重要了吧…

J2ME 2D小游戏入门之旅(三) 控制飞机的移动(2)

时间:2011-08-09

2. 背景

让飞机在海面飞行吧,我们用一个蓝色的背景图片代表海面,我们需要他铺满整个背景。我们使用TiledLayer来绘画背景。

初始化:

img=ImageTools.getImage("/pic/back_water.png"); int backcolumns=screenwidth/img.getWidth()+1;//计算横向 int backrows=screenheight/img.getHeight()+1; background=new TiledLayer(backcolumns,backrows,img,img.getWidth(),img.getHeight()); int x,y; for (int i = 0; i < backcolumns*backrows; i++) { x=i%backcolumns; y=i/backcolumns; System.out.println("x="+x+" y="+y); background.setCell(x,y,1); }

接下来在gameMain中加入绘制语句。

background.paint(g);//draw background

注意,要保证背景的绘制在飞机的绘画之前。如果使用Layermanager可以很方便的的控制绘制层,但是我们的接下来的子弹要求多个子弹对象共用一个sprite的图像,但是Layermanager绘画的时候以Layer为单位,由Layermanager帮助我们调用各个layer的paint,so一次只支持将一个sprite画在一个地方,所以我觉得Layermanager有些鸡肋。一般时候我们还是自己paint吧。当然,层是一个很重要的概念,利用层,屏幕校准将非常方便,震动整个屏幕等特效将很实现。也许你有个好法,可以让我不在Layermanager层与sprite状态对象组之间矛盾…

可喜可贺呀,我们的飞机动起来了,哈哈,让我们期待加入子弹吧,那是本游戏的“精华”。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号