从零开始学AS3游戏开发.docx
- 文档编号:4904654
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:55
- 大小:108.04KB
从零开始学AS3游戏开发.docx
《从零开始学AS3游戏开发.docx》由会员分享,可在线阅读,更多相关《从零开始学AS3游戏开发.docx(55页珍藏版)》请在冰豆网上搜索。
从零开始学AS3游戏开发
从零开始学AS3游戏开发【一】响应键盘移动的方块
注:
本系列教程每周一篇,旨在引导刚刚接触FLASH的新手通过实例进行游戏开发的学习。
在过程中逐步说明涉及到的类及对应的使用方法。
从一个光秃秃的方块开始,根据不同的控制方式、玩法产生不同的分支,最终完善成一个个可玩的游戏。
希望对各位入门的朋友有所帮助!
在教程涉及的各种处理方法,可能不够完善,也希望各位高手指正:
)
转载请注名来源于天地会。
第一篇响应键盘事件的方块
准备工作:
FLASHCS3/4/5,FlashDevelop(http:
//www.flashdevelop.org/community/viewforum.php?
f=11)
开发目标:
实现一个受键盘控制的方块
相关API:
Sprite,KeyboradEvent
我们即将开始构建一个游戏世界……
任何属于这个世界的物体,我们都叫它游戏对象(gameObject)。
它是游戏的基本元素,所有的一切都是从它衍生而来。
有的游戏对象可以被我们操作,因此,我们需要分配给它一个控制器(controller),并通过这个装置来控制它。
我们一次不可能看遍全部世界,所以,我们必须有一个舞台(gameScene),让我们想看到的游戏对象来到这个舞台上表演。
所有的一切。
都通过这个舞台开始……
首先,做一下准备工作:
首先打开FlashDevelop,新建一个项目。
选择FLASHIDE项目,选择一个保存目录,并选择一个你喜欢的名字。
在项目名上点右键,选择Add->NewClass,输入文件名Main,选择baseClass后面的Browse按钮,输入Sprite
这样,我们就建立了一个继承自Sprite类的对象Main。
Sprite是FLASH的一个基本显示元素,它没有时间轴的概念。
打开FLASHCS3,新建一个ActionScript3.0文件,并把它保存到刚才建立的项目的目录中。
在属性栏里,把帧频改成30,文档类输入Main。
这样,我们就建立了一个可以由Main.as控制的FLASH文件。
把刚才生成的Main.as改成像下面这样:
1.package
2.{
3. importflash.display.Sprite;
4.
5. publicclassMainextendsSprite
6. {
7.
8. publicfunctionMain()
9. {
10. trace('我运行咯!
');
11. }
12.
13. }
14.
15.}
复制代码
回到FLASHCS里,按下ctrl+enter进行测试:
看到输出框里出现的输出,说明程序已经可以运行了。
trace是FLASH中的消息输出命令,我们在今后的开发过程中会经常使用的。
至此,准备工作完成。
开始我们的创建之旅吧。
首先来建立游戏时间里的“亚当”——gameObject。
在我们的项目里新建文件夹D5Power(起个自己喜欢的名字),并在D5Power下面再建一个文件夹Objects,最后,在Ojbects里Add一个NewClass,输入文件名gameObject,同样,baseclass选择Sprite。
建立完成后,我们的项目看起来应该像这样了:
在FlashDevelop给我们生成的代码中,我们看到了packageD5Power.Objects这样的字眼。
package即是包,我们的源代码可以存放在不同的包中,这样可以保持代码的结构清晰。
包的名字实际上就是对应目录的名字。
如packageD5Power.Objects这样,我们就可以知道gameObject文件是保存在D5Power/Objects/这个目录下面,如果package后面没有任何内容(比如我们刚才建立的Main),那么这个文件就是在项目的默认包(源代码的顶级目录)中。
不同层级的包之间的访问,必须通过improt进行包含,而同级,以及访问默认包内的文件,是不需要的。
这个我们以后会再继续详细的说明
回来考虑一下我们的“亚当”——gameObject,它是最基础的元素,所以,我们只给他定义最简单的可以做的事情,首先,他可以做一些事(至于做什么,我们先不考虑),另外,他会死亡。
既然他可以产生在这个游戏世界里,那么他就必须可以从这个世界里消失的无影无踪:
1.packageD5Power.Objects
2.{
3. importflash.display.Sprite;
4.
5. /**
6. *基础游戏对象
7. *@authorD5Power
8. */
9. publicclassgameObjectextendsSprite
10. {
11.
12. publicfunctiongameObject()
13. {
14.
15. }
16. /**
17. *做些什么
18. */
19. publicfunctionDo():
void{}
20. /**
21. *死亡
22. */
23. publicfunctiondie():
void{}
24.
25. }
26.
27.}
复制代码
我们定义了一个空的die函数,它什么也没做,我们将在以后慢慢的去补足它。
现在,gameObject除了活着,就是死了。
这显然不能满足我们的要求。
所以我们必须让他繁衍下一代,并产生进化。
在Objects里再新建一个类,命名为actionObject,把它的baseclass输入gameObject。
现在,我们获得了一个“亚当的儿子”。
他继承了亚当的全部特性(可以死亡),并可以有自己独特的事情可以做。
我们决定教他如何行走:
1.packageD5Power.Objects
2.{
3. /**
4. *可活动的游戏对象
5. *@authorD5Power
6. */
7. publicclassActionObjectextendsgameObject
8. {
9. /**
10. *移动速度
11. */
12. protectedvarspeed:
Number=1.2;
13. /**
14. *移动方向
15. */
16. protectedvarwalkDirection:
uint=0
17.
18. publicstaticconstUP:
uint=1;
19. publicstaticconstDOWN:
uint=2;
20. publicstaticconstLEFT:
uint=3;
21. publicstaticconstRIGHT:
uint=4;
22.
23. publicfunctionActionObject()
24. {
25.
26. }
27. /**
28. *修改移动方向
29. */
30. publicfunctionsetdirection(dir:
uint):
void
31. {
32. walkDirection=dir;
33. }
34. /**
35. *移动
36. */
37. protectedfunctionmove():
void
38. {
39. //根据不同的方向进行移动
40. switch(walkDirection)
41. {
42. caseUP:
43. y-=speed;
44. break;
45. caseDOWN:
46. y+=speed;
47. break;
48. caseLEFT:
49. x-=speed;
50. break;
51. caseRIGHT:
52. x+=speed;
53. break;
54. default:
break;
55. }
56. }
57.
58. /**
59. *覆盖父类的Do方法
60. */
61. overridepublicfunctionDo():
void
62. {
63. if(walkDirection!
=0)move();
64. super.Do();
65. }
66. }
67.}
复制代码
在这段代码中,我们第一次接触到了一些关键字,下面对他们进行说明
varFLASH中定义变量用的前缀,比如varnum:
int=5;定义一个整型变量num,默认值为5
functionFLASH中定义函数的前缀,比如functiontest():
void{}定义一个名为test的函数,没有返回值
public这个关键字之后的定义是公有的,可以被外部的类访问。
比如,大家都知道你的名字,所以你的名字是public的。
private这个关键字之后的定义是完全私有的,只能被类自己访问。
比如,你银行的密码只有你自己知道,所以他是private的。
protected这个关键字之后的定义,是私有的,但家族成员可以访问。
比如,你儿子知道你屁股上有一颗痣,其他人不知道。
。
。
笑,所以这个痣是protected的
override覆盖父级类的定义
set在上例代码中,可以通过某actionObject.direction这样来访问这个函数,而不是.direction(),和它类似的还有get关键字。
你可以用他们来生成一个只读或只写的“变量”
现在,“亚当的儿子”可以行走了。
但是,我们不知道怎样才能通知他走,怎样走。
我们必须有一个控制他的方法,让他来听从我们的指挥。
因为,我们必须创建一个控制器来控制它。
在这之前,我们要学习一些操作这个世界的方法和技巧(上帝也需要学习么,呵呵)
从零开始学AS3游戏开发【二】随机移动的敌人
注:
本系列教程每周一篇,旨在引导刚刚接触FLASH的新手通过实例进行游戏开发的学习。
在过程中逐步说明涉及到的类及对应的使用方法。
从一个光秃秃的方块开始,根据不同的控制方式、玩法产生不同的分支,最终完善成一个个可玩的游戏。
希望对各位入门的朋友有所帮助!
在教程涉及的各种处理方法,可能不够完善,也希望各位高手指正:
)
转载请注名来源于天地会。
第二篇随机移动的敌人
在上一篇教程中,我们搭建了一个简单的程序结构,并编写了程序,通过键盘的控制,让游戏场景中的一个方块根据我们的要求移动。
对于一个游戏来讲,只有主角是不够的,我们需要敌人。
敌人和主角拥有相同的属性:
他们都有长相(外表,虽然现在只是一个方块。
。
。
),有控制器进行控制。
所以,我们可以从ActionObject来进行扩展,产生两个不同的分支来实现他们。
我们先来构建整个程序的结构:
可以看出,ActionObject是不具备“长相”这个特征的,而不管是主角或敌人,都有自己不同的样式。
在上一篇的教程中,我们把黑色的方框直接指定为了ActionObject类,这样扩展性显然不好。
因此,我们单独建立一个具备长相特征的类,继承自ActionObject。
具体的操作方法可以参考上一篇教程。
注意,因为ActionObject的构造函数是有参数的,所以我们勾选匹配基类的构造函数,让FD自动帮我们生成构造函数。
1.packageD5Power.Objects
2.{
3. importflash.display.Sprite;
4. importD5Power.Controller.basicController;
5. /**
6. *具备外表皮肤的ActionObject
7. *@authorD5Power
8. */
9. publicclassFaceObjectextendsActionObject
10. {
11. protectedvar_face:
Sprite;
12. /**
13. *
14. *@param ctrl 控制器
15. *@param face 外观
16. */
17. publicfunctionFaceObject(ctrl:
basicController,face:
Sprite)
18. {
19. super(ctrl);
20. _face=face;
21. addChild(_face);
22. }
23.
24. }
25.
26.}
复制代码
FaceObject在ActionObject的基础上,增加了_face属性,并在构造函数中,通过addChild把_face显示了出来,这样,我们就可以给他赋予不同的外观了。
接下来来实现主角类和敌人类。
继承自我们刚刚写好的FaceObject类。
暂时直接继承就可以了,不用写其他的代码。
1.packageD5Power.Objects
2.{
3. importflash.display.Sprite;
4. importD5Power.Controller.basicController;
5. /**
6. *主角类
7. *@authorD5Power
8. */
9. publicclassPlayerextendsFaceObject
10. {
11.
12. publicfunctionPlayer(ctrl:
basicController,face:
Sprite)
13. {
14. super(ctrl,face);
15.
16. }
17.
18. }
19.
20.}
复制代码
1.packageD5Power.Objects
2.{
3. importflash.display.Sprite;
4. importD5Power.Controller.basicController;
5. /**
6. *敌人类
7. *@authorD5Power
8. */
9. publicclassMonsterextendsFaceObject
10. {
11.
12. publicfunctionMonster(ctrl:
basicController,face:
Sprite)
13. {
14. super(ctrl,face);
15.
16. }
17.
18. }
19.
20.}
复制代码
既然结构改变了,那我们在上一篇教程中使用的黑色方块就没必要再定义为ActionObject了,我们现在只把它作为皮肤使用,在库中右键选择,在弹出菜单中选择属性,把类名改为Skin1。
由于我们并没有编写Skin1,FLASH会帮我们自动生成一个Skin1类,以后就可以通过newSkin1()来进行声明了。
用同样的办法,我们再重新绘制一个红色的方块,作为敌人的皮肤。
定义类名为Skin2
而主场景中,我们原来的代码就需要做一下修改了:
1....
2.varobj:
Player=newPlayer(ctrl,newSkin1());
3....
复制代码
当然,也可以试一下用敌人的皮肤:
1....
2.varobj:
Player=newPlayer(ctrl,newSkin2());
3....
复制代码
这样,大体的结构就已经建好了。
接下来。
我们来针对问题进行不同的处理。
首先,既然敌人和主角都可以移动。
那么,我们就有必要增加限制。
因为它们势必只能在允许的范围内移动。
就我们目前的需求来看,他们只能在屏幕的区域范围内移动(因为我们暂时没有任何障碍物)。
因此,在移动前,我们要检查它的下一个目标点是否可以移动。
很显然,这个检查是同时针对敌人和主角的,因此,我们在ActionObject上进行扩展,修改ActionObject的代码,增加nextCanMove方法:
1./**
2. *下一目标点是否可以移动
3. */
4. publicfunctiongetnextCanMove():
Boolean
5. {
6. //下一X位置
7. varnx:
uint=0;
8. //下一Y位置
9. varny:
uint=0;
10. //根据移动方向进行处理,计算出下一目标点位置
11. switch(walkDirection)
12. {
13. caseUP:
14. ny=y-speed;
15.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 从零开始 AS3 游戏 开发