D5PowerAS入门教程随机移动的敌人.docx

上传人:b****6 文档编号:6507754 上传时间:2023-01-07 格式:DOCX 页数:10 大小:64.91KB
下载 相关 举报
D5PowerAS入门教程随机移动的敌人.docx_第1页
第1页 / 共10页
D5PowerAS入门教程随机移动的敌人.docx_第2页
第2页 / 共10页
D5PowerAS入门教程随机移动的敌人.docx_第3页
第3页 / 共10页
D5PowerAS入门教程随机移动的敌人.docx_第4页
第4页 / 共10页
D5PowerAS入门教程随机移动的敌人.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

D5PowerAS入门教程随机移动的敌人.docx

《D5PowerAS入门教程随机移动的敌人.docx》由会员分享,可在线阅读,更多相关《D5PowerAS入门教程随机移动的敌人.docx(10页珍藏版)》请在冰豆网上搜索。

D5PowerAS入门教程随机移动的敌人.docx

D5PowerAS入门教程随机移动的敌人

D5POWER个人网站

官方网站

第二篇随机移动的敌人

在上一篇教程中,我们搭建了一个简单的程序结构,并编写了程序,通过键盘的控制,让游戏场景中的一个方块根据我们的要求移动。

对于一个游戏来讲,只有主角是不够的,我们需要敌人。

敌人和主角拥有相同的属性:

他们都有长相(外表,虽然现在只是一个方块。

),有控制器进行控制。

所以,我们可以从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.*@paramctrl控制器

15.*@paramface外观

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.break;

16.caseDOWN:

17.ny=y+speed;

18.break;

19.caseLEFT:

20.nx=x-speed;

21.break;

22.caseRIGHT:

23.nx=x+speed;

24.break;

25.default:

break;

26.}

27.

28.//如果下一目标点超出屏幕范围,则不能移动

29.if(nx>Global.stage.stageWidth-width||nx<0)returnfalse;

30.if(ny>Global.stage.stageHeight-height||ny<0)returnfalse;

31.

32.//检测通过

33.returntrue;

34.}

同时,修改move方法:

1./**

2.*移动

3.*/

4.protectedfunctionmove():

void

5.{

6.if(!

nextCanMove)return;//增加了这句代码

7.//根据不同的方向进行移动

8.switch(walkDirection)

9.{

10.caseUP:

11.y-=speed;

12.break;

13.caseDOWN:

14.y+=speed;

15.break;

16.caseLEFT:

17.x-=speed;

18.break;

19.caseRIGHT:

20.x+=speed;

21.break;

22.default:

break;

23.}

24.}

这样,只有下一目标点可以移动的前提下,才能进行移动。

移动限制的问题解决了。

其次。

敌人是可以自动移动的,而不是受键盘的控制。

那么控制器应该可以自己运行,所以,我们扩展basicController,增加空的AutoRun方法

1./**

2.*自动运行

3.*/

4.publicfunctionAutoRun():

void{}

之后,在需要实现自动运行的控制器里覆盖它来实现具体的功能就可以了。

既然我们要敌人随机移动,那实际上也就是随机地给于敌人移动方向。

因此我们来修改MonsterController控制器,增加随机修改方向的方法:

1./**

2.*随机修改方向

3.*/

4.privatefunctionchangeDir():

void

5.{

6.varme:

ActionObject=_targetasActionObject;

7.me.direction=1+int(Math.random()*4);

8.}

我们知道,MonsterController的控制对象肯定是ActionObject(Monster是它的子类),因此,我们把_target转换成ActionObject以获得direction属性。

Math.random()将随机产生一个0-1的小数(注意,有可能为0,但永远都不会取到1),我们把他乘以4,就获得了0-4的一个随机数(0-3.99999999...)。

把他转换为整型,实际上我们随机取得了0-3.而我们的方向是1-4,因此,在这个基础上+1,即可随机获得一个正确的方向值。

接下来,我们覆盖实现AutoRun方法,继续修改MonsterController控制器:

1.overridepublicfunctionAutoRun():

void

2.{

3.varme:

ActionObject=_targetasActionObject;

4.if(!

me.nextCanMove)changeDir();

5.}

同样,把_target转换成ActionObject,如果他的下一个移动点无法移动了,则自动转换移动方向,这个方向是随机的。

小提示:

你也可以把_target转换成Monster,如果Monster有属于自己的独特函数需要使用的话,不过,一定要确认你传递进来的的确是Monster类哦:

再来看一下敌人类(Monster),我们在控制器里实现了对敌人的自动控制,但是,必须要他自动运行,也就是说,需要有地方来不停的调用AutoRun方法,来实现控制器根据不同的情况控制目标。

来看一下代码:

1.packageD5Power.Objects

2.{

3.importflash.display.Sprite;

4.importD5Power.Controller.basicController;

5.

6./**

7.*敌人类

8.*@authorD5Power

9.*/

10.publicclassMonsterextendsFaceObject

11.{

12./**

13.*上一次的运行日期对象

14.*/

15.privatevar_lastAction:

Date;

16./**

17.*运行频率

18.*/

19.privatevar_fps:

uint=8;

20.

21.publicfunctionMonster(ctrl:

basicController,face:

Sprite)

22.{

23.super(ctrl,face);

24._lastAction=newDate();

25.}

26.

27.overridepublicfunctionDo():

void

28.{

29.vardate:

Date=newDate();

30.//如果运行时间已经超过频率所指定的时间间隔,那么运行程序

31.if(date.time-_lastAction.time>1000/_fps)

32.{

33._lastAction=date;

34.controller.AutoRun();

35.super.Do();

36.}

37.}

38.

39.}

40.

41.}

我们新增加了两个属性:

_fps和_lastAction。

_fps是运行的频率,也就是每秒内,所运行的次数,而_lastAction则是最后一次运行的日期对象。

来看一下实现按频率运行的方法。

每次Do函数运行的时候,会取一个新的Date对象,我们可以通过它的.time属性,来获取本次运行的毫秒时间(一个时间戳),把这个毫秒时间和上一次运行的毫秒时间做对比,如果超出了_fps所规定的运行时间,则运行程序,并把当前日期设置为最后一次运行的日期。

在这里,我们调用可控制器的AutoRun方法。

这样,所有的前期准备都准备完了,我们回到主场景Main来实现实际的功能。

我们生成一个敌人,并把他放入列表:

1.varctrl2:

MonsterControler=newMonsterControler();

2.varmonster:

Monster=newMonster(ctrl2,newSkin2());

3.scene.addObject(monster);

这时,运行程序,我们可以看到场景里有了一红一黑两个方块,其中红色的将在场景内的边缘随机游荡。

不过,主角和敌人在同一地点出现,这很难看的清楚,所以,我们可以进一步修改代码。

把主角放到200,200的位置,而利用for循环,生成3个敌人,并随机放到场景中500*300这个范围内:

1.varscene:

gameScene=newgameScene(stage);//声明游戏舞台

2.varctrl:

KeyController=newKeyController();//定义控制器

3.varobj:

Player=newPlayer(ctrl,newSkin1());

4.obj.x=200;

5.obj.y=200;

6.scene.addObject(obj);//将对象添加到舞台中

7.

8.for(vari:

uint=0;i<3;i++)

9.{

10.varctrl2:

MonsterControler=newMonsterControler();

11.varmonster:

Monster=newMonster(ctrl2,newSkin2());

12.monster.x=int(Math.random()*500);

13.monster.y=int(Math.random()*300);

14.scene.addObject(monster);

15.}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1