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

控制

实在是等不及了吧?加把劲,让我们加入游戏的主角飞机吧。
你可以将这个游戏定位在动作游戏,一个动作游戏需要不断的从用户端获得输入,基本上不间断,所以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的不足。现在逐渐体会到一个好的游戏引擎是多么重要了吧…

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状态对象组之间矛盾…

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

时间: 2024-12-11 12:06:19

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

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

响应www.j2medev.com站长mingjava的号召,我也和大家一起分享一下我的经验,希望大家指教.同时www.j2medev.com 欢迎各位高手的原创文章. 前几天看到tony在csdn上发布自己的学习作品"是男人就坚持60s",觉得创意虽然简单但是却很耐玩,是学习手机游戏制作的入门经典,于是一时兴起,clone了一下,图片依然使用的是tony的图片,纯粹学习之用.如果大家对这个游戏感兴趣可以与tony联系或访问他的blog. 从发展趋势上说midp2.0是趋势,最便宜的m

J2ME 2D小游戏入门之旅(七) 不足多多,你认为呢?

七.不足多多,你认为呢? 游戏已经成型了,冲杯咖啡犒劳一下自己吧.呵呵还是算了,咖啡因对下一代不好. 当你看完以上的所有,你有什么想法呢?不要说没有.你一定是像我一样揣着一份完成clone作品的兴奋和无数的疑问吧.关于游戏性.游戏引擎等种种的问题接踵而来,甚至你可能还会想到这么个游戏有没有市场?让我们在睡前一起苦恼一下吧. 系统构架方面 我们将来的游戏不会像现在这样直来直去,需要有欢迎界面,loading等待,帮助,画面切换等等,那时候我们的Navigate就不是现在这副空架子了. 顺便再谈一个

J2ME 2D小游戏入门之旅(二)完善周边工具类

二.完善周边工具类(图象.GameObject.Font) 虽然我们有了midp2.0的支持,但是有时还是需要一些辅助工具,方便我们使用.这怕是在进行真正的游戏设计之前最有趣的了. 1,首先是一个ImageTools工具类,提供一个方法帮助调用Imagepublic class ImageTools { protected ImageTools() { } public static Image getImage(String str){ Image img=null; try { img =

J2ME 2D小游戏入门之旅(四) 加入子弹群,实现碰撞运算

运算 飞机类游戏中子弹是必不可少的,他们数量很多且充斥着整个屏幕,这些随机或者有着一定AI的小物体,实现起来不是总那么容易,有时候你不得不考虑很多和效能有关的问题.我们之前定义了GameObject,很大程度上就是为了方便的重用Sprite,因为我们有很多的子弹,不可能没增加一个子弹都是一个Sprite,我需要共享同一个Sprite.我们通过继承GameObject来实现. 下面分析一下这个子弹类: 它将继承自GameObject: 记录子弹的个数: 一个子弹的状态数组,记录各个子弹的类型typ

J2ME 2D小游戏入门之旅(五) 实现爆炸效果、并加入道具导弹

五.实现爆炸效果.并加入道具导弹 大多数游戏都有着丰富的效果类,在精灵移动类游戏中曾一度以此为一个重要的卖点,.光光是一些丰富的特效是不能够产生一个好的游戏的,但是一个好的游戏是万万不能缺少好的效果的. 很多人认为游戏的效果层有时和跟游戏逻辑本身并没有太大的关系,往往就是在最终屏幕上再画上一层效果层.但是游戏逻辑和效果层之间的通信是很重要的.这种通信往往体现在延时与等待上.比如飞机爆炸时,不接受任何用户输入,并且爆炸效果还要继续跟随飞机坠落,甚至爆炸的范围会影响周围的物体,要等待爆炸结果结束了才

J2ME 2D小游戏入门之旅(六) 计时器和奖惩与评价

评价 六.计时器和奖惩与评价 我们该加入我们的计时器了,我要从游戏开始时刻开始计时,并不断的更新到屏幕上,在游戏结束后计时器要停止工作. 首先在初始化的时候将当前时刻记录下来: gametime=0; gametimeoffset=System.currentTimeMillis(); 以后只要游戏不gameover就在每个更新周期都进行一次计算: gametime=(System.currentTimeMillis()-gametimeoffset)/1000; //转换为秒 下面要做的就是将

Cocos2D:塔防游戏制作之旅(三)

整合炮塔资源 为了快速开始,我们为你创建了开始的项目.它包括了一个空白的Cocos2D项目以及大多数你将在教程中使用到的资源. 所以首先下载该 开始项目 并且解压缩到你指定的位置中去. 注意:该项目的艺术资源来有Vicki制作的自免费艺术包中,它基于Oray Studios的其他免费的艺术包.如果你喜欢它们,你可以雇佣Oray Studios中的艺术家们! 开始项目基于Cocos2D 2.1(RC1)的基础模板而创建,他提供你一个可工作的项目:包含一个在屏幕上带有居中标签的HelloWorldL

求j2me小游戏源代码

问题描述 本人急需一个j2me小游戏源代码,希望可以共享一下 解决方案 解决方案二:importjava.util.*;importjavax.microedition.lcdui.*;/***贪吃蛇游戏*/publicclassSnakeCanvasextendsCanvasimplementsRunnable{/**存储贪吃蛇节点坐标,其中第二维下标为0的代表x坐标,第二维下标是1的代表y坐标*/int[][]snake=newint[200][2];/**已经使用的节点数量*/intsna

游戏编程入门莫里森那本书类似的小游戏

问题描述 游戏编程入门莫里森那本书类似的小游戏 有没有大神可以帮忙做一个莫里森编写的游戏编程入门那本书中的用到GameEngine的c++小游戏 解决方案 很急的.求好心大神帮忙