`
sogotobj
  • 浏览: 619477 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

专业手机游戏开发基础(1)

阅读更多
游戏的基本结构
游戏是什么呢?在游戏中,往往是显示各种各样的画面,玩家可以做一些设定好的控制,画面根据玩家的控制有所变化。从这儿可以看出,游戏至少需要三个功能-显示画面,接受玩家输入和对输入产生反馈。这就是常说的渲染,输入输出和逻辑三个模块。将这三个模块组合在一起有很多方法。比如事件驱动-画面保持不变直到接受到输入事件,程序进行逻辑运算然后改变画面。而游戏往往不是这样,游戏是时间驱动的。也就是说无论有没有输入,游戏都在不停的循环-检查是否有输入,运行逻辑,渲染画面。这里我多说一句,其实什么样的结构并不能区别一个程序是不是游戏,其实只要可以互动娱乐的程序就可以称为游戏,也不一定要用时间驱动,但采用时间驱动是专业游戏的普遍做法,也是很容易接受的方法-因为从一定程度上讲,游戏很像电影,随着时间流逝画面在改变。
既然是时间驱动,游戏中就会有帧的概念。所谓帧就是某个时刻显示在屏幕上的画面。从整体上看,游戏就是一系列的帧不断播放着,像动画片一样,不过玩家可以通过交互改变播放的内容。而我们开发游戏的主要任务就是安排每一帧的内容。在每一次游戏循环中,我们需要搜集玩家的输入、运行逻辑以更新游戏的数据、根据更新后的数据安排下一帧显示的内容。所以一个最简单的游戏结构就是:

0 初始化游戏
1 是否结束游戏(Yes:转到6)
2 搜集玩家输入信息
3 运行游戏逻辑
4 更新下一帧,显示下一帧
5 回到1
6清理,结束游戏
这是一个最基本的结构,特别对于比较简单的J2ME游戏来说,这个结构更加有代表性。下面我们将分别讲述专业手机游戏如何实现这个结构中的各个内容。

游戏循环的实现
我们需要一个进入后就一直循环下去直到游戏结束的结构。线程正好可以实现。最通常的做法是让Canvas实现Runnable接口。于是我们就可以实现run方法。下面是一个run方法简化版:

public void run()

{

exitMidlet = false ;

long startTime = 0 ;

long timeCount = 0 ;

gameInit() ;

int curKey = 0 ;

while (!exitMidlet) {

startTime = System.currentTimeMillis();

//acquire key

acquireKey() ;

//call game loop

gameLoop() ;

//repaint the screen

repaint();

serviceRepaints();

frameCount++ ;

//lock fps

timeCount = MIN_DELAY - (System.currentTimeMillis() - startTime);

timeCount = (timeCount<1)?1:timeCount ;

try {

Thread.sleep(timeCount);

} catch (InterruptedException ex) {}

}

endMidlet() ;

}

看到我们的while循环了吗?除非在程序逻辑中设定exitMidlettrue-那是当玩家选择了退出游戏,我们的游戏将一直运行下去。在while循环之前,gameInit方法的作用是进行游戏初始化-比如初始化变量值,载入全局数据,生成全局对象等。在while循环中,我们先是调用了acquireKey方法,这个方法将键盘输入信息进行缓冲以便逻辑中判断按键状态,下面讲会讲到键盘缓冲。gameLoop是我们游戏的主体,每帧中的逻辑运算,图形处理都在这里面进行。然后是repaintserviceRepaints,刷新屏幕-新的一帧呈现在屏幕上。最后当跳出while之后,我们执行endMidlet结束这个MidletendMidlet的内容只是调用了destroyAppnotifyDestroyed方法。好了整个游戏循环就是这样了,下面讲分别讲述键盘缓冲和gameLoop如何组织。不过再这之前先让我解释下lock fpsFPS就是Frame per second。为了防止游戏在不同的机器上速度变化太大,我们设定一个最大的FPS值,或者说设置一个每帧至少要花费的时间(这里的MIN_DELAY)。比如我们设置MIN_DELAY50,那么max FPS = 1000/50 = 20 /秒。锁定FPS有多种方法,这里的方法是判断如果一帧所有的时间还没达到最大时间,那么就让线程sleep一会儿。顺便在说一下FPS的计算,顾名思义用1000除以一帧所有时间即可,不过要注意的是,一般计算的FPS是平均FPS,所以FPS=累计帧数*1000/累计花费时间。

键盘缓冲
搜集玩家输入信息是一个很重要的内容,我们知道J2ME中可以在keyPressedkeyReleased事件中处理按键内容,但这样势必将逻辑代码分散与gameLoopkeyPressed中。如果你说将所有逻辑代码放在keyPressed中,那可不行,因为keyPressed只有在按键的时候才产生,而即使没有按键游戏也有很多逻辑运算要做。所以专业游戏开发中采用键盘缓冲将按键信息存起来,然后在gameLoop中就可以判断这一帧按键的状态,利用按键缓冲,除了可以判断一个键是否按下松开,还可以判断一个键是否一直被按住了,甚至可以判断组合键。不过在这里,我只介绍一种最简单的按键缓冲。由于篇幅所限,只讲述原理并不给出具体代码。

首先我们需要一个数据结构存储按键信息。你可以为每个键用一个bool值存储它的状态,不过专业一点的做法是用一个位表示一个键的状态,一个int32个位,足够表示大多数手机的所有按键了。因为我们要判断键是否按下或松开,为了方便,我们再用2个整数记录这两种状态。所以现在我们一共有三个int:

static int key , pressedKey, releasedKey ;

OK! 有了存储的地方,我们还需要一些常量表示每个位,我们设定key中某个位为0表示某键没有按下,为1表示按下。如果用第1位表示0键,第2位表示1键,那么可以这样设置常量:

final static int GKEY_0=1<<0, GKEY_1=1<<1 ;

明白了吗?这些常量是用来指定某个位用的,比如GKEY_1其实就是第21其它位均为0的一个整数。如果还不明白,先看下面的。

keyPressedkeyReleased里将分别将按下的键和松开的键进行记录。

public void keyPressed(int keyCode)

{

int value = getKeyValue(keyCode) ;

key |= value ;

pressedKey |= value ;

}

public void keyReleased(int keyCode)

{

int value = getKeyValue(keyCode) ;

key ^= value ;

releasedKey |= value ;

}

keyPressed里面,我们先将keyCode转换成我们的按键常量,就是上面的GKEY_0等。因为keyCode可不是像我们的常量那样可以用某个位表示的,而且不同手机的keyCode是有可能不一样的,所以我们必须用一个函数getKeyValue进行转化。得到常量后key|=value的作用是将key里面常量所代表的位置1,现在你应该明白常量的作用了吧!pressedKey|=value同理。不过keyReleased有些不同,由于releasedKey只记录这一帧里哪些键“被松开”了,所以仍然用或运算。但key是记录整个按键的状态,所以用异或。

接下来就是如何判断按键状态了:

private static void acquireKey()

{

frameKey = key ;

framePressedKey = pressedKey ;

frameReleasedKey = releasedKey ;

pressedKey = 0 ;

releasedKey = 0 ;

}

public static boolean keyHold(int gameKey)

{

return ((frameKey & gameKey)!=0) ;

}

public static boolean keyDown(int gameKey)

{

return ((framePressedKey & gameKey)!=0) ;

}

public static boolean keyUp(int gameKey)

{

return ((frameReleasedKey & gameKey)!=0) ;

}

还记得acquireKey吧,我们在while循环中首先要调用它,其作用就是记录下这一帧的按键状态,所有我们用了三个新int变量记录他们,分别是frameKeyframePressedKeyframeReleasedKeyacquireKey所做的就是将按键状态记录在这3个变量中,其实framePressedKeyframeReleasedKey不是必须的,只是这样看上去比较清楚。记录完后我们将pressedKeyreleasedKey清空,以便下次有键按下或松开时记录新的信息。关键的三个函数登场了,keyDown判断某个键是否在这一帧里被按下,参数gameKey是我们定义的按键常量中的某个值。如果对位运算还算明白的话,很容易看懂这3个函数。唯一要说明的就是keyHoldkeyDown的区别,keyHold表示某个键一直被按着,也就是至少从前一帧开始它就被按下了,而不是在这一帧里被按下的。现在你应该明白我们为什么要清空pressedKeyreleasedKey了。

说到这里也差不多了,有了这个按键缓冲我们就可以在gameLoop中调用keyDown等方法判断按键的状态了。不过我还是要说一句,这只是最简单的按键缓冲,只能缓冲一次按键,如果一个键被多次按下就不行啦。更专业的内容需要你在实际工作中探索。

分享到:
评论

相关推荐

    J2ME手机程序Eclipse开发基础 源码

    本书以Eclipse开发环境为背景,以J2ME手机程序开发为线索,对J2ME的基本知识、... 本书可供各大专院校电子类、计算机类专业及其相关专业师生、从事手机游戏开发的工程技术人员及所有热心编程的编程爱好者参考使用。

    Unity3D\2D手机游戏开发 第2版

    下载地址:http://pan.baidu.com/s/1c0kvOMs 《Unity3D\2D手机游戏开发(第2版)》适用于广大游戏开发人员、游戏开发爱好者、软件培训机构,以及计算机专业的学生等。 是第2版,文件大小95M共422页,彩色清晰版带...

    unity3d手机游戏开发 金玺曾 完整版(上卷)

    另外,《Unity 3D手机游戏开发》最后附有C#语言的快速教程,帮助缺乏程序开发基础的读者快速入门。  《Unity 3D手机游戏开发》适合广大游戏开发人员,也面向游戏开发爱好者、软件培训机构,以及计算机专业的学生等...

    Unity3D手机游戏开发

    Unity,也称Unity3D,是近几年非常流行的一个3D游戏开发引擎,跨平台能力强,使用它开发的手机游戏数不胜数。 本书通过三个部分循序渐进地介绍了Unity在游戏开发方面的不同功能。第1~5章,由零开始,引导读者从基本...

    Unity 3D手机游戏开发( 金玺曾)

    另外,《Unity 3D手机游戏开发》最后附有C#语言的快速教程,帮助缺乏程序开发基础的读者快速入门。 《Unity 3D手机游戏开发》适合广大游戏开发人员,也面向游戏开发爱好者、软件培训机构,以及计算机专业的学生等。 ...

    unity3d手机游戏开发 金玺曾 完整版(下卷)

    另外,《Unity 3D手机游戏开发》最后附有C#语言的快速教程,帮助缺乏程序开发基础的读者快速入门。  《Unity 3D手机游戏开发》适合广大游戏开发人员,也面向游戏开发爱好者、软件培训机构,以及计算机专业的学生等...

    Java毕业设计-JAVA基于J2ME的手机游戏开发(论文+源代码).rar

    本资源适合有一定JAVA编程基础的读者,特别是那些对手机游戏开发感兴趣的学生和开发者。通过学习和实践本项目,你将能够掌握JAVA和J2ME技术在手机游戏开发中的应用,提升你的编程技能和游戏开发经验。

    基于Unity的3D闯关类手机游戏开发源码+项目说明(matlab).zip

    1、该资源内项目代码经过严格调试,下载即用确保可以运行! 2、该资源适合计算机相关专业(如计科、人工智能、大数据、数学、电子信息等)正在做课程设计...基于Unity的3D闯关类手机游戏开发源码+项目说明(matlab).zip

    游戏开发入门教程详细版.zip

    例如,对于手机游戏,可能需要使用Unity或Unreal Engine等游戏引擎;对于PC或主机游戏,则可能需要使用更专业的开发工具。 三、制定开发计划 制定一个详细的开发计划至关重要。这个计划应该包括游戏的设计、美术、...

    Java《MIDP手机游戏设计》全书代码.rar

    Java 《MIDP手机游戏设计》全书代码,这是一本运用MIDP进行J2ME手机游戏开发的专业JAVA书籍,随书附带的源码中有很多J2me游戏实例,包括了很多从事J2ME游戏开发的基础知识,因此些源码对于Java手机游戏编程的初学者...

    Android实训报告基于Android游戏开发.docx

    通信与电子信息专业实训报告项目名称:基于Android的游戏开发班级通信班姓名学号指导教师成绩实训时间:2013年X月17日—2013年X月28日目录一、实训目的及其意义31.1、目的及意义31.2、研究现状3二、实训主要任务、...

    指向对象的C++指针、对象的大小

    二、注重手机游戏开发基础,全程项目贯穿 三、Android4.3游戏开发基础、Cocos2D-X,Unity2D,Unity3D一个都不能少 四、课程首次涉及跨平台游戏引擎技术,国内独家(AndEngine引擎、libGDX引擎) 五、跨平台技术...

    Android 3D游戏开发技术宝典(高清带目录)

    随着智能手机移动嵌入式平台硬件性能的不断提升,3D游戏...《Android 3D游戏开发技术宝典:OpenGL ES 2.0》适合Android程序员、游戏开发者及Android爱好者学习,也可以作为相关培训学校和大专院校相关专业的教学用书。

    Cocos2d-JS开发之旅+完整版

    《Cocos2d-JS开发之旅——从HTML 5到原生手机游戏》适合所有对2D 游戏开发感兴趣的人群,尤其是计算机专业学生、Flash/JS 开发者,因为Cocos2d-JS简单易懂,读者会发现自己已有的基础能快速应用或转移到Cocos2d-JS ...

    [多媒体/3D 动画/游戏] Unity3D游戏编程基础入门班 by 泰课在线(价值200元)[高清完整版][AVI+TS][1.43GB]

    Unity3D是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。 Unity3D的PC插件安装量达到2 亿...

    Android应用开发揭秘 源码 part2

    本书内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用...

    Android应用开发揭秘 源码 part1

    本书内容全面,不仅详细讲解了Android框架、Android组件、用户界面开发、游戏开发、数据存储、多媒体开发和网络开发等基础知识,而且还深入阐述了传感器、语音识别、桌面组件开发、Android游戏引擎设计、Android应用...

    毕业论文—基于android手机平台的吃豆人游戏设计与开发 01016.doc.zip

    该教程包括了基础知识、数据库设计、网站架构设计、界面设计、功能实现等方面。该教程提供了大量的实例和练习,帮助读者掌握网站开发中的应用。 适合人群:该毕业论文适合计算机科学与技术、软件工程等相关专业的...

    python开发

    可以做网络游戏的后台,很多在线游戏的后台都是Python开发的。总之就是能干很多很多事啦。 Python当然也有不能干的事情,比如写操作系统,这个只能用C语言写;写手机应用,只能用Swift/Objective-C(针对iPhone)和...

    Google Android SDK开发范例大全(第3版) 1/5

    余志龙、陈昱勋、郑名杰、陈小风,分别来自手机制造业、电视媒体业、网络、电信产业、软件开发等领域,擅长嵌入式系统软件设计、J2ME游戏开发、Android开发,以及12EE、JSP、Servlet、Java Bean、PHP、C#等程序语言...

Global site tag (gtag.js) - Google Analytics