Flash入门必备Flash开发AS代码之游戏制作过程例子.docx
《Flash入门必备Flash开发AS代码之游戏制作过程例子.docx》由会员分享,可在线阅读,更多相关《Flash入门必备Flash开发AS代码之游戏制作过程例子.docx(27页珍藏版)》请在冰豆网上搜索。
Flash入门必备Flash开发AS代码之游戏制作过程例子
As3游戏制作
郑重声明这不是什么教程,说教对我来说还太遥远,本人只是个菜鸟,老鸟们不要见笑。
这里是一个简单的游戏的制作过程(谈不上开发),在这里我把一些简单的知识做个总结;
这是本人第一次在网上写一些东西,我会努力做到最好的;好了,废话不说了(*^__^*)嘻嘻……进入正题。
。
。
。
。
。
(本内容部分素材和知识来自风云II系列丛书)
概述:
本游戏涉及的主要知识点:
1,游戏控制:
本人大胆的把游戏控制分为了鼠标控制和键盘控制,本游戏中只涉及到了鼠标控制,但在整个游戏制作完成后,本人会补充键盘控制的内容。
2,物件的创建和销毁:
在游戏中,不可能所用的角色都事先拖放到舞台,大多数情况需要用代码随机的产生并加入到舞台;当然,我们有时候并不希望我们加入的元素一直存在在舞台上,我们希望在特定的时间和特定的条件下删掉我们的元素。
3,碰撞检测:
几乎所有的游戏都需要用到碰撞检测,本游戏用的是Object.hitTestObject(Object);还有一个常用的是object.hitTestPoint(x,y,Boolean);
4,事件:
As3的事件不是一两句话可以说的清楚的,本游戏用到的事件都是一些常用的事件,如计时器Timer,
还有一些零碎的知识,这里就不一一的列举出来;详细的内容见下。
一:
游戏介绍
开始画面
游戏进行中
结束画面
二:
游戏类的分析与设计:
经过上面对游戏的介绍,我们很清楚的知道游戏中的元素,它们是:
1,飞机Plan;;2,导弹Missle;3,生命球AddLife
游戏的元素比较简单,下面分别加以分析并设计它们;
(在你的磁盘中新建一个flash文档,重命名为”死里逃生.fla”,在该flash文档的同一目录下新建一个文件夹,重命名为“classes”;如下图:
)
1.飞机应该有的属性:
速度speed;生命:
life;他还应该能跟随鼠标移动;
具体做法如下,新建一个ActionScript文件,代码如下:
将上面的actionscript文件保存在classes文件夹中,文件命名为Plan.as,注意,文件名一点要与类名相同;
2,导弹应该有的属性和方法:
角速度:
omega,速度:
speed,导弹还要求能跟踪飞机。
代码如下:
将上面的as文件也保存在classes文件夹中,并把该as文件命名为Missle.as
注:
这些代码有些复杂,希望大家仔细看,理解了就好了。
在实现跟踪飞机这一代码块(即onTimerHandler函数),希望大家仔细把flash的坐标系统和Math的三角函数这些知识温习一下。
在这里我不太想讲像if语句,swich语句,while,do。
。
。
while。
。
。
语句,基本的表达式那些基本的内容,相信学过C的人都会这些的。
关于面向对象的一些核心内容:
类,属性,方法,接口,继承,多态。
我也不想讲,也不能讲,因为我不想误人子弟,我也只是了解这些知识,希望想了解的同学去看看有关java或c++的教程。
那下面接着第三个类:
3,生命球应该有的属性和方法:
所含的生命值,也就是能给主角加多少生命lifeValue;
所显示的时间,也就是生命球能在舞台上显示多久timed;
代码如下:
将上面的as文件也保存在classes文件夹中,并把该as文件命名为AddLife.as;
5,有关元素的类文件都写好了,就差一个文档类了,有关文档类的代码我们稍后再说,上面我们一直是写代码,现在我们来搭建主场景:
打开你新建的“死里逃生。
fla”文档,如下图搭建场景:
注:
前面是元素的类型,后面是文件的实例名。
“重新开始”按钮下面还覆盖了一个“开始”按钮,实例名为“start_btn”。
6:
类库的组成:
上图只显示出了与类库连接的原件;分别与我们上面写的类连接在一起;
库中还有声音文件,是个爆炸的声音,这个声音的连接属性设置为:
与“死里逃生.fla”文档在同一目录下的还有一个背景音乐,背景音乐的名字为:
mySong.mp3;
注意文件名一定要是mySong.mp3,因为在下面的代码中我用的是这个名字;
7:
最后我们来写文档类,把整个的代码和元件组织起来。
文档类的代码:
(此文件比较的繁琐,import语句可以简写,如:
import.flash.display.*;importflash.display.event.*;在这里没有采用简写,好让大家方便查阅API);
至此:
整个游戏的制作就结束了。
结束的目录结构应该如下:
Classes文件夹里的文件如下:
将上面的as文件也保存在classes文件夹中,并把该as文件命名为Test.as;
然后在“死里逃生.fla”文档的文档类后面的方框中填入:
classes.Test
如下图:
修正:
在Test类中的第63和第64之间加入如下语句:
if(myPlan.life<=0){
myPlan.life=0;
}
此条语句修正了血条死亡时显示不正常;
整个的游戏的制作过程算是写完了,现在我把刚开始罗列的4条知识点分别再详细的讲一下:
一.游戏控制:
讲到控制,就得有控制的对象,不管是鼠标控制还是键盘控制都有控制的对象(或说是控制的目标,比如上面游戏中的飞机),有两种方法将控制的对象加入舞台,一种是用代码addChild()在运行时加入舞台,另一种是直接从库中拖入到舞台(上面游戏的主角飞机采用的是这种方法);根据这两种加入舞台方法的不同,控制它们的代码也有所不同,如下:
:
采用代码的方法将被控对象加入舞台(键盘控制):
:
在您的计算机磁盘中新建一个fla文档,重命名为“键盘控制_1.fla”在这个文档的同一目录新建一个文件夹,重命名为“classes”;双击打开“键盘控制_1.fla”文档。
将舞台设置为800*600;在舞台上新建一个影片剪辑(随便画什么,这里就画一个圆),命名为“主角圆”(不是实例名,你可以取其他的名字)。
建好影片剪辑之后,把舞台上的这个影片剪辑的实例删掉。
这时库中会有刚刚建立的影片剪辑元件;保存一下;
b:
点击“键盘控制_1.fla”文档的文件菜单>新建>ActionScript文件。
写下代码如下:
packageclasses{
importflash.display.MovieClip;
publicclassCircleextendsMovieClip{
privatevarspeed:
int;
publicfunctionCircle(){
speed=5;
}
publicfunctionmoveLeft():
void{
this.x+=speed;
}
publicfunctionmoveRight():
void{
this.x-=speed;
}
publicfunctionmoveUp():
void{
this.y-=speed;
}
publicfunctionmoveDown():
void{
this.y+=speed;
}
}
}
将这个as文件保存在“classes”文件夹中,保存名为“Circle.as”;
c:
再点击“键盘控制_1.fla”文档的文件菜单>新建>ActionScript文件。
写下代码如下:
packageclasses{
importflash.display.MovieClip;
importflash.events.KeyboardEvent;
importflash.ui.Keyboard;
publicclassTestextendsMovieClip{
privatevarmyCircle:
Circle;
publicfunctionTest(){
myCircle=newCircle();
myCircle.x=400;
myCircle.y=300;
addChild(myCircle);
stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);
}
privatefunctiononKeyDownHandler(e:
KeyboardEvent):
void{
switch(e.keyCode){
caseKeyboard.LEFT:
myCircle.moveLeft();
break;
caseKeyboard.RIGHT:
myCircle.moveRight();
break;
caseKeyboard.UP:
myCircle.moveUp();
break;
caseKeyboard.DOWN:
myCircle.moveDown();
break;
}
if(myCircle.x>800-myCircle.width/2){
myCircle.x=800-myCircle.width/2;
}elseif(myCircle.xmyCircle.x=myCircle.width/2;
}elseif(myCircle.y>600-myCircle.height/2){
myCircle.y=600-myCircle.height/2;
}elseif(myCircle.ymyCircle.y=myCircle.height/2;
}
}
}
}
注意上面的事件监听器的目标是舞台;
将这个as文件保存在“classes”文件夹中,保存名为“Test.as”;
d:
切换到“键盘控制_1.fla”文档,在库中的影片剪辑“主角圆”上点击鼠标右键,在弹出的菜单中选择“链接”,之后在弹出的对话框中如下图填写相关的项目:
点击确定;
e:
点击“键盘控制_1.fla”文档舞台的空白区,在属性栏中的文档类中填写:
classes.Test;
如下图所示:
f:
测试影片,方向键能控制圆上下左右运动;
:
采用代码的方法将被控对象加入舞台(鼠标控制):
:
在您的计算机磁盘中新建一个fla文档,重命名为“鼠标控制_1.fla”在这个文档的同一目录新建一个文件夹,重命名为“classes”;双击打开“鼠标控制_1.fla”文档。
将舞台设置为800*600;在舞台上新建一个影片剪辑(随便画什么,这里就画一个圆),命名为“主角圆”(不是实例名,你可以取其他的名字)。
建好影片剪辑之后,把舞台上的这个影片剪辑的实例删掉。
这时库中会有刚刚建立的影片剪辑元件;保存一下;
b:
切换到“鼠标控制_1.fla”文档,在库中的影片剪辑“主角圆”上点击鼠标右键,在弹出的菜单中选择“链接”,之后在弹出的对话框中如下图填写相关的项目:
由于我们没有真的去写Circle类,所以会弹出如下对话框:
直接点“确定”就可以了。
c:
点击“鼠标控制_1.fla”文档的文件菜单>新建>ActionScript文件。
写下代码如下:
packageclasses{
importflash.display.MovieClip;
importflash.events.MouseEvent;
importflash.ui.Mouse;
publicclassTestextendsMovieClip{
privatevarmyCircle:
Circle;
publicfunctionTest(){
myCircle=newCircle();
addChild(myCircle);
myCircle.x=400;
myCircle.y=300;
stage.addEventListener(MouseEvent.MOUSE_MOVE,onMouseMoveHandler);
}
privatefunctiononMouseMoveHandler(e:
MouseEvent):
void{
Mouse.hide();
myCircle.x=e.stageX;
myCircle.y=e.stageY;
}
}
}
d:
点击“鼠标控制_1.fla”文档舞台的空白区,在属性栏中的文档类中填写:
classes.Test;
如下图所示:
f:
测试影片,圆能随着鼠标移动;
:
直接从库中将被控对象拖入舞台(键盘控制);
:
在您的计算机磁盘中新建一个fla文档,重命名为“键盘控制_2.fla”在这个文档的同一目录新建一个文件夹,重命名为“classes”;双击打开“键盘控制_2.fla”文档。
将舞台设置为800*600;在舞台上新建一个影片剪辑(随便画什么,这里就画一个圆),命名为“主角圆”(不是实例名,你可以取其他的名字)。
建好影片剪辑之后,(不要删掉舞台上主角圆的实例)这时库中有刚刚建立的影片剪辑元件而库中同时有它的实例;保存一下;
b:
点击“键盘控制_2.fla”文档的文件菜单>新建>ActionScript文件。
写下代码如下:
packageclasses{
importflash.display.MovieClip;
importflash.display.Stage;
importflash.events.KeyboardEvent;
importflash.ui.Keyboard;
publicclassCircleextendsMovieClip{
privatevarspeed:
int;
publicfunctionCircle(){
speed=5;
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,onKeyDownHandler);
}
privatefunctiononKeyDownHandler(e:
KeyboardEvent):
void{
switch(e.keyCode){
caseKeyboard.LEFT:
moveLeft();
break;
caseKeyboard.RIGHT:
moveRight();
break;
caseKeyboard.UP:
moveUp();
break;
caseKeyboard.DOWN:
moveDown();
break;
default:
break;
}
}
privatefunctionmoveLeft():
void{
this,x-=speed;
}
privatefunctionmoveRight():
void{
this.x+=speed;
}
privatefunctionmoveUp():
void{
this.y-=speed;
}
privatefunctionmoveDown():
void{
this.y+=speed;
}
}
}
注意这句:
this.stage.addEventListener(…………);舞台中有this的实例时,才能调用this的stage属性,否则会报错的。
将这个as文件保存在“classes”文件夹中,保存名为“Circle.as”;
c:
切换到“键盘控制_2.fla”文档,在库中的影片剪辑“主角圆”上点击鼠标右键,在弹出的菜单中选择“链接”,之后在弹出的对话框中如下图填写相关的项目:
d:
测试影片,方向键能控制主角圆的移动;
这里就不再啰嗦写”鼠标控制_2.fla”了。
相信大家早以多我的啰嗦忍无可忍了。
O(∩_∩)o…
总结一下:
键盘控制和鼠标控制都需要用stage.addEventListener(………,……..);文档类可以直接用stage属性,而非文档类要用这个类的实例的stage属性(即this.stage),就要求事先有实例放在舞台上;(纯属个人总结,正确与否只是本人认证了一下,没有任何官方的说明。
您认这种说法错误,可直接略过这段,不要被我误导了。
)
二.物件的创建与销毁
物件的创建和销毁比较简单的,大体来说就是在文档类中采用new关键字创建新的对象,然后用addChild()/addChilaAt()加入到容器,当不需要的时候用removeChild()/removeChildAt()从容器中把它删除;
当成批产生物件时,for循环结合数组能很好的解决问题。
看个实例先,
(申明:
这个实例来自风云II系列丛书之Flashcs3ActionScript3.0游戏开发基础与范例,版权都属原作者所有)
这里本人不篡改原作,只做个搬运工。
(1)首先,启动flashcs3;
(2)选择文件>新建菜单命令,选择新建一个ActionScript3.0文档;
(3)保存这个fla文件为Sample7_5.fla;
(4)给主场景添加一个背景。
修改主场景的帧频为30fps,填写文档类为objclasses。
ObjSample,如下图所示;
(5)创建一个金币的影片剪辑,保存到库中,在库中选择它,修改它的连接属性为外部类objclasses.Obj,如下图所示,这个金币将是这个例子中动态创建和删除的对象。
(6)在fla文件存在的目录下创建objclasses文件夹;
(7)在objclasses文件夹中创建Obj.as和ObjSample.as两个as文件
(8)编写如下代码清单Obj.as所示的代码:
packageobjclasses{
importflash.display.MovieClip;
importflash.events.Event;
//对象类
publicclassObjextendsMovieClip{
//速度属性
privatevarspeed:
Number;
functionObj():
void{
speed=0;
this.addEventListener(Event.ENTER_FRAME,onFrameHandler);
}
//在ENTER_FRAME的响应函数中随机产生一个速度
//并使对象按照这个速度向下移动
privatefunctiononFrameHandler(event:
Event):
void{
speed=Math.floor(Math.random()*3)+1;
this.y+=speed;
}
}
}
(9)编写代码清单ObjSample.as所示的代码:
packageobjclasses{
importflash.display.MovieClip;
importflash.utils.Timer;
importflash.events.TimerEvent;
//对象例子的类
publicclassObjSample2extendsMovieClip{
//声明一个1秒间隔的Timer实例
privatevarmytimer:
Timer=newTimer(1000);
//声明一个存储对象的数组
privatevararrObj:
Array=newArray();
//构造函数中添加TIMER事件,并启动该计时器
functionObjSample2():
void{
mytimer.addEventListener(TimerEvent.TIMER,onTimerHandler);
mytimer.start();
}
//TIMER事件响应函数
//每秒创建一个新对象,X坐标随机产生
privatefunctiononTimerHandler(event:
TimerEvent):
void{
varobj:
Obj=newObj();
obj.x=Math.floor(Math.random()*500)+25;
obj.y=0;
addChild(obj);
//添加到对象数组中
arrObj.push(obj);
//消除Y坐标大于200的对象
for(vari:
int=0;iif(arrObj[i].y>200){
//从场景中消除
removeChild(arrObj[i]);
//从数组中消除
arrObj.splice(i,1);
break;
}
}
}
}
}
测试影片
可能很多地方没有说清楚。
欢迎批评指教。