游戏的基本结构文档格式.docx
- 文档编号:15725560
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:10
- 大小:23.96KB
游戏的基本结构文档格式.docx
《游戏的基本结构文档格式.docx》由会员分享,可在线阅读,更多相关《游戏的基本结构文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
从整体上看,游戏就是一系列的帧不断播放着,像动画片一样,不过玩家可以通过交互改变播放的内容。
而我们开发游戏的主要任务就是安排每一帧的内容。
在每一次游戏循环中,我们需要搜集玩家的输入、运行逻辑以更新游戏的数据、根据更新后的数据安排下一帧显示的内容。
所以一个最简单的游戏结构就是:
0初始化游戏
1是否结束游戏(Yes:
转到6)
2搜集玩家输入信息
3运行游戏逻辑
4更新下一帧,显示下一帧
5回到1
6
清理,结束游戏
这是一个最基本的结构,特别对于比较简单的J2ME游戏来说,这个结构更加有代表性。
下面我们将分别讲述专业手机游戏如何实现这个结构中的各个内容。
游戏循环的实现
我们需要一个进入后就一直循环下去直到游戏结束的结构。
线程正好可以实现。
最通常的做法是让Canvas实现Runnable接口。
于是我们就可以实现run方法。
下面是一个run方法简化版:
publicvoidrun()
{
exitMidlet=false;
longstartTime=0;
longtimeCount=0;
gameInit();
intcurKey=0;
while(!
exitMidlet){
startTime=System.currentTimeMillis();
//acquirekey
acquireKey();
//callgameloop
gameLoop();
//repaintthescreen
repaint();
serviceRepaints();
frameCount++;
//lockfps
timeCount=MIN_DELAY-(System.currentTimeMillis()-startTime);
timeCount=(timeCount<
1)?
1:
timeCount;
try{
Thread.sleep(timeCount);
}catch(InterruptedExceptionex){}
}
endMidlet();
}
看到我们的while循环了吗?
除非在程序逻辑中设定exitMidlet为true-那是当玩家选择了退出游戏,我们的游戏将一直运行下去。
在while循环之前,gameInit方法的作用是进行游戏初始化-比如初始化变量值,载入全局数据,生成全局对象等。
在while循环中,我们先是调用了acquireKey方法,这个方法将键盘输入信息进行缓冲以便逻辑中判断按键状态,下面讲会讲到键盘缓冲。
gameLoop是我们游戏的主体,每帧中的逻辑运算,图形处理都在这里面进行。
然后是repaint和serviceRepaints,刷新屏幕-新的一帧呈现在屏幕上。
最后当跳出while之后,我们执行endMidlet结束这个Midlet。
endMidlet的内容只是调用了destroyApp和notifyDestroyed方法。
好了整个游戏循环就是这样了,下面讲分别讲述键盘缓冲和gameLoop如何组织。
不过再这之前先让我解释下lockfps。
FPS就是Framepersecond。
为了防止游戏在不同的机器上速度变化太大,我们设定一个最大的FPS值,或者说设置一个每帧至少要花费的时间(这里的MIN_DELAY)。
比如我们设置MIN_DELAY=50,那么maxFPS=1000/50=20帧/秒。
锁定FPS有多种方法,这里的方法是判断如果一帧所有的时间还没达到最大时间,那么就让线程sleep一会儿。
顺便在说一下FPS的计算,顾名思义用1000除以一帧所有时间即可,不过要注意的是,一般计算的FPS是平均FPS,所以FPS=累计帧数*1000/累计花费时间。
键盘缓冲
搜集玩家输入信息是一个很重要的内容,我们知道J2ME中可以在keyPressed和keyReleased事件中处理按键内容,但这样势必将逻辑代码分散与gameLoop和keyPressed中。
如果你说将所有逻辑代码放在keyPressed中,那可不行,因为keyPressed只有在按键的时候才产生,而即使没有按键游戏也有很多逻辑运算要做。
所以专业游戏开发中采用键盘缓冲将按键信息存起来,然后在gameLoop中就可以判断这一帧按键的状态,利用按键缓冲,除了可以判断一个键是否按下松开,还可以判断一个键是否一直被按住了,甚至可以判断组合键。
不过在这里,我只介绍一种最简单的按键缓冲。
由于篇幅所限,只讲述原理并不给出具体代码。
首先我们需要一个数据结构存储按键信息。
你可以为每个键用一个bool值存储它的状态,不过专业一点的做法是用一个位表示一个键的状态,一个int有32个位,足够表示大多数手机的所有按键了。
因为我们要判断键是否按下或松开,为了方便,我们再用2个整数记录这两种状态。
所以现在我们一共有三个int了:
staticintkey,pressedKey,releasedKey;
OK!
有了存储的地方,我们还需要一些常量表示每个位,我们设定key中某个位为0表示某键没有按下,为1表示按下。
如果用第1位表示0键,第2位表示1键,那么可以这样设置常量:
finalstaticintGKEY_0=1<
<
0,GKEY_1=1<
1;
明白了吗?
这些常量是用来指定某个位用的,比如GKEY_1其实就是第2为1其它位均为0的一个整数。
如果还不明白,先看下面的。
keyPressed和keyReleased里将分别将按下的键和松开的键进行记录。
publicvoidkeyPressed(intkeyCode)
{
intvalue=getKeyValue(keyCode);
key|=value;
pressedKey|=value;
publicvoidkeyReleased(intkeyCode)
key^=value;
releasedKey|=value;
}
在keyPressed里面,我们先将keyCode转换成我们的按键常量,就是上面的GKEY_0等。
因为keyCode可不是像我们的常量那样可以用某个位表示的,而且不同手机的keyCode是有可能不一样的,所以我们必须用一个函数getKeyValue进行转化。
得到常量后key|=value的作用是将key里面常量所代表的位置1,现在你应该明白常量的作用了吧!
pressedKey|=value同理。
不过keyReleased有些不同,由于releasedKey只记录这一帧里哪些键“被松开”了,所以仍然用或运算。
但key是记录整个按键的状态,所以用异或。
接下来就是如何判断按键状态了:
privatestaticvoidacquireKey()
{
frameKey=key;
framePressedKey=pressedKey;
frameReleasedKey=releasedKey;
pressedKey=0;
releasedKey=0;
publicstaticbooleankeyHold(intgameKey)
return((frameKey&
gameKey)!
=0);
publicstaticbooleankeyDown(intgameKey)
return((framePressedKey&
gam
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 基本 结构