lgame入门教程Word格式.docx
《lgame入门教程Word格式.docx》由会员分享,可在线阅读,更多相关《lgame入门教程Word格式.docx(45页珍藏版)》请在冰点文库上搜索。
2011-11-20
LGame-0.3.2-Update:
1、LGame-0.3.2版延续0.3.1,使用OpenGL作为游戏渲染核心,早前的AWT与Canvas实现版本现已更名为LSE与LAE(延续0.3)。
2、LGame-0.3.2版极大扩展了LGame核心包功能,新增工具、特效、精灵、接口以数百计(具体细节正在完善文档中,此处不再详述)。
3、LGame-0.3.2版在核心包基础上,新增了STG开发模块,作为游戏框架的额外补充(目前默认支持(可以基本用脚本完成)的游戏类型已含STG、SRPG、AVG,预计0.3.3提供RTS支持)。
4、LGame-0.3.2版的C#(WP7)版已经构建完毕,不久后也将发布。
PS:
LSE和LAE包是针对LGame在0.3.1改版前旧版框架的延续,相对0.3.1及0.3.2版使用的OpenGL渲染方式而言,它们继续采用JavaSE环境所提供的AWT(特指LSE版)以及Android环境所提供的Canvas(特指LAE版)作为游戏绘图核心,并且仅在LGame的Java版中出现,其它语法环境下无对应版本提供(比如很快会发布的C#(WP7)版)。
LSE与LAE包与标准LGame包的主要差别有如下几点:
1、标准LGame自0.3.2起彻底重构了原有的geom包,已经不再附带OpenJDK中的geom包,但LSE与LAE版继续使用该包。
2、标准LGame使用GLEx类作为引擎的最基本渲染器,允许使用JavaSE、JavaME的常用绘图API,以及OpenGL、OpenGLES的常用绘图API,而LSE与LAE包仅模拟有JavaSE、JavaME的Graphics类常用接口(这意味着完全不支持OpenGL)。
3、标准LGame包由于使用OpenGL编程,在不同屏幕手机中进行缩放时,可以较为有效的减少甚至消除画面失真,而LSE与LAE包则难以避免这种现象的产生(特别是大画面的游戏,在较小屏幕的手机上运行时)。
4、LSE与LAE版基本不受硬件环境限制,在大多数微机或手机中都能产生较为一致的刷新速度(当然,这并不意味着没有浮动,而是指不会出现某些机器上跑几帧,某些机器上跑数十、数百帧的极端情况),而LGame标准版的速度则受到硬件条件制约,对于某些不支持OpenGL硬件渲染的环境而言(比如ADT模拟器以及部分低端真机),它的速度甚至不如LSE与LAE版。
因此从某种情况上讲,LSE与LAE版的兼容性要超过目前的标准LGame。
5、标准LGame包已经不再支持JavaME游戏组件的模拟,并删除了相关类。
而在LSE与LAE版中,相关类依旧被保留了下来。
6、LSE与LAE版的主体结构虽与标准LGame一致,但辅助类明显较LGame标准版本为少(缺少几乎全部工具类以及很多特效类),而各类中提供的API也没有标准版完整。
也就是说LEA是一个不使用硬件加速的引擎,使用的是Canvas画布。
本人对OpenGL是99.9%的不懂,因此我选择学习LEA版本的LGame引擎。
只有两步:
导入LAE-1.1Jar包
导入so库文件,so库文件有两种,一种是armeabi文件夹下的so文件,一种是armeabi-v7a文件夹下的so文件。
区别是前者使用与所有Android版本的系统,后者仅支持Android2.2及以上版本的系统,只是前者的文件比较大,个人按需选择。
3.
好吧,太术语话了,导入就理解成复制吧。
OK,环境好了。
啰嗦一下:
记得项目右键à
BuildPathà
ConfigureBuildPathà
AddJARs,把项目libs文件夹下的LAE1.1.jar包导入到项目中(这次真的是导入了)。
再啰嗦一下:
在AndroidManifest.xml中配置新的Activity时,一定要加入android:
configChanges="
orientation|keyboardHidden"
属性,否则游戏无法强制横屏或者竖屏。
暂时还不知道原因,以后再研究,我们的宗旨是,先学会使用,再探究原理。
源码(文档和libs包)下载:
原文第一次发布于Android-Fans论坛:
http:
//www.android-
最终效果:
这个很简单的,看Activity的代码:
[java]
viewplaincopyprint?
1.public
class
LGameStudyActivity
extends
LGameAndroid2DActivity
{
2.
3.
@Override
4.
5.
public
void
onGamePaused()
6.
7.
}
8.
9.
10.
11.
12.
onGameResumed()
13.
14.
15.
16.
17.
18.
19.
onMain()
20.
21.
/*
设置游戏是否横屏
*/
22.
23.
this.initialization(true);
24.
25.
26.
给Activity赋予一个画面,有点类似于View
27.
28.
this.setScreen(new
ScreenExample());
29.
30.
31.
这个厉害了,指定游戏的帧速率,每秒30帧
32.
33.
this.setFPS(30);
34.
35.
36.
是否显示游戏帧数(当然显示喇)
37.
38.
this.setShowFPS(true);
39.
40.
41.
不显示Logo(这个没试过显示,先不管,我们要的是HelloWorld)
42.
43.
this.setShowLogo(false);
44.
45.
46.
OK,一切准备就绪,显示游戏画面
47.
48.
this.showScreen();
49.
50.
51.
52.}
53.
54.注:
这个是由官方文档里的一个例子里修改得到的代码。
引擎自己封装了一个Activity,叫做LGameAndroid2DActivity。
代码很简单,我已经注释得很清楚了~希望大家能看懂我的文字~
这里啰嗦一下:
为什么要在onMain()函数里做初始化呢?
其实没有为什么,我们完全可以在onCreate()函数里初始化的,不信?
看看LGameAndroid2DActivity类里onCreate函数的源码:
onCreate(Bundle
icicle)
super.onCreate(icicle);
LSystem.gc();
Log.i("
Android2DActivity"
"
2D
Engine
Start"
);
//
构建整个游戏使用的最底层FrameLayout
this.frameLayout
=
new
FrameLayout(LGameAndroid2DActivity.this);
当此项为True时,Back键无法退出游戏(默认为False)
this.isBackLocked
false;
当此项为False时,Activity在onDestroy仅关闭当前Activity,而不关闭整个程序(默认为True)
this.isDestroy
true;
this.onMain();
23.}
嘿嘿,其它的代码不管,看最后那行:
好了,很清楚了吧?
实际上还是调用了onCreate函数进行初始化操作的,最后调用了onMain函数。
那咱们就在onMain()函数里做初始化操作吧,一样的。
现在来看看咱们的Screen,画面:
ScreenExample
Screen
ScreenExample()
*
官方解释:
与J2SE版相同,draw中LGraphics会根据设定的FPS自动刷新,使用上与标准的J2SE
Graphics以及J2MEGraphics接口没有区别(API为二者的综合)
draw(LGraphics
g)
简单吧?
就是咱们的canvas.drawColor(Color.GRAY)
g.drawClear(LColor.gray);
来了,我们的最爱——HelloWorld!
太简单了,我都不想解释了,绘制"
HelloWorld"
字符串到屏幕的(100,100)位置
g.drawString("
100,
100);
alter(LTimerContext
arg0)
onTouchDown(LTouch
52.
onTouchMove(LTouch
54.
55.
56.
57.
58.
59.
60.
onTouchUp(LTouch
61.
62.
63.
64.}
65.
66.
67.注:
代码由官方文档中的实例修改。
这个也很简单,在draw函数里加上我们的绘制操作就好了:
g.drawClear(LColor.gray);
也就是我们常常做的清屏
g.drawString("
100,100);
和canvas的drawText类似的,实际上就是调用了drawText函数。
OK,运行程序,你会看到HelloWorld~!
这里再啰嗦一下:
如:
1.<
application
android:
icon="
@drawable/icon"
label="
@string/app_name"
>
<
activity
name="
.LGameStudyActivity"
intent-filter>
action
android.intent.action.MAIN"
/>
category
android.intent.category.LAUNCHER"
/intent-filter>
/activity>
/application>
1.private
LImage
bgImg
null;
背景图片
3.private
tipImg
文字图片
7.public
GameScreen()
加载资源方式1:
加载Assets目录的资源,必须制定assets目录名称
LImage.createImage("
assets/bgImg.jpg"
加载资源方式2:
加载res目录的资源,必须制定res目录名称,包括子目录
res/drawable/tip.png"
21.}
LGame加载资源的方式当然也离不开Android的限制喇,也是两种:
加载Assets目录的资源
加载Res目录的资源
啰嗦一下:
这里要注意喇,资源路径必须要完整,比如要加载assets目录的资源,那给出的路径必须包含“assets”,同理,要加载res目录里drawable目录的资源,必须给出“res/drawable”路径..这个有点郁闷,不过没什么大影响。
关于资源加载,初步探索就是这样喇~以后有新发现再和大家分享~
精灵,按照个人的理解,就是游戏中的生物,生物嘛,当然是要能懂的。
跑来跑去的主角是精灵,和主角打架的怪物也是精灵~还有好多好多精灵,好吧,精灵不神秘,它也不过是一个被封装的动画。
从代码中可以看出,精灵由一个精灵管理器管理,所有精灵的绘制都通过精灵管理器来调用。
哎吖,由于这个例子实在是有点过于简单,实在是不知道说些啥~
好吧,那就不说了~
-
好吧,还是有些话想说~Sprite就是一个LGame默认提供的精灵类,如果你不喜欢它,你可以自己创造一个精灵(好吧,多个也行)~怎么创造?
只要你的类实现了ISprite接口,那它就被认为是一个精灵类,其它的,自由发挥~
看看Sprite的构造器:
这个构造器有三个参数:
filename资源路径
row每一帧截取图片资源的上的宽
col每一帧截取图片资源上的高
第2、第3个参数稍微解释一下,这个构造器需要一种这样的图片资源:
所有的动作都在一张图片里,相信大部分朋友都知道了。
参数row就是图片宽除以每个动作的宽,参数col就是图片的高。
好吧,啰嗦完毕~
最后的啰嗦:
也许有人已经发现了,我每次用的GameScreen类都是继承Screen的,其实LGame还有一个CanvasScreen的,但是我暂时还不知道什么时候用Screen什么时候用CanvasScreen~等我弄懂了再和大家分享哈,嘿嘿~
本章来聊聊精灵传说之我是定时器~
木头惯例,先上图:
实现的效果就是一个精灵不断地在跑,不断地跑?
你想累死她吗?
~
所以,当然要让她休息一下喇~于是...
她每隔2秒钟休息一次...
太懒了点吧...
说了这么多,先上代码,再听我解释,主要要解释两样东西:
LGame的定时器,LTimer类
钩子函数
代码里有一个LMessage控件,关于它的所有操作,请大家忽略,不要被影响了,它不是本文的研究对象,以后学到控件的时候再一起探讨~
1.定时器。
创建定时器很简单:
LTimerrestTimer=newLTimer(2000);
这样就创建了一个每隔两秒执行一次的定时器。
有一点一定要注意,定时器什么时候开始启动?
当然是由我们来控制喇。
这样启动:
resTimer.start();
OK,很简单吧?
虽说LTimer是定时器,但是它实际上是不会定做执行任务的。
说得实在一点,它只是一个计时器,唯一能做的就是,告诉你是否到时间了。
比如我们在早上8点50分40秒的时候启动了上面创建的定时器,在8点50分42秒或之后,你再去问问这个定时器,它就是告诉