1、D5PowerAS入门教程随机移动的敌人D5POWER 个人网站 官方网站 第二篇 随机移动的敌人在上一篇教程中,我们搭建了一个简单的程序结构,并编写了程序,通过键盘的控制,让游戏场景中的一个方块根据我们的要求移动。对于一个游戏来讲,只有主角是不够的,我们需要敌人。敌人和主角拥有相同的属性:他们都有长相(外表,虽然现在只是一个方块。),有控制器进行控制。所以,我们可以从ActionObject来进行扩展,产生两个不同的分支来实现他们。我们先来构建整个程序的结构:可以看出,ActionObject是不具备“长相”这个特征的,而不管是主角或敌人,都有自己不同的样式。在上一篇的教程中,我们把黑色的方
2、框直接指定为了ActionObject类,这样扩展性显然不好。因此,我们单独建立一个具备长相特征的类,继承自ActionObject。具体的操作方法可以参考上一篇教程。注意,因为ActionObject的构造函数是有参数的,所以我们勾选匹配基类的构造函数,让FD自动帮我们生成构造函数。1. package D5Power.Objects 2. 3. import flash.display.Sprite;4. import D5Power.Controller.basicController;5. /*6. * 具备外表皮肤的ActionObject7. * author D5Power8.
3、*/9. public class FaceObject extends ActionObject10. 11. protected var _face:Sprite;12. /*13. * 14. * param ctrl 控制器15. * param face 外观16. */17. public function FaceObject(ctrl:basicController,face:Sprite) 18. 19. super(ctrl);20. _face = face;21. addChild(_face);22. 23. 24. 25. 26. FaceObject在Action
4、Object的基础上,增加了_face属性,并在构造函数中,通过addChild把_face显示了出来,这样,我们就可以给他赋予不同的外观了。接下来来实现主角类和敌人类。继承自我们刚刚写好的FaceObject类。暂时直接继承就可以了,不用写其他的代码。1. package D5Power.Objects 2. 3. import flash.display.Sprite;4. import D5Power.Controller.basicController;5. /*6. * 主角类7. * author D5Power8. */9. public class Player extends
5、 FaceObject10. 11. 12. public function Player(ctrl:basicController, face:Sprite) 13. 14. super(ctrl, face);15. 16. 17. 18. 19. 20. /-1. package D5Power.Objects 2. 3. import flash.display.Sprite;4. import D5Power.Controller.basicController;5. /*6. * 敌人类7. * author D5Power8. */9. public class Monster
6、extends FaceObject10. 11. 12. public function Monster(ctrl:basicController, face:Sprite) 13. 14. super(ctrl, face);15. 16. 17. 18. 19. 20. 既然结构改变了,那我们在上一篇教程中使用的黑色方块就没必要再定义为ActionObject了,我们现在只把它作为皮肤使用,在库中右键选择,在弹出菜单中选择属性,把类名改为Skin1。由于我们并没有编写Skin1,FLASH会帮我们自动生成一个Skin1类,以后就可以通过new Skin1()来进行声明了。用同样的办法,我
7、们再重新绘制一个红色的方块,作为敌人的皮肤。定义类名为Skin2而主场景中,我们原来的代码就需要做一下修改了:1. .2. var obj:Player = new Player(ctrl,new Skin1();3. .当然,也可以试一下用敌人的皮肤: 1. .2. var obj:Player = new Player(ctrl,new Skin2();3. .这样,大体的结构就已经建好了。接下来。我们来针对问题进行不同的处理。首先,既然敌人和主角都可以移动。那么,我们就有必要增加限制。因为它们势必只能在允许的范围内移动。就我们目前的需求来看,他们只能在屏幕的区域范围内移动(因为我们暂时没
8、有任何障碍物)。因此,在移动前,我们要检查它的下一个目标点是否可以移动。很显然,这个检查是同时针对敌人和主角的,因此,我们在ActionObject上进行扩展,修改ActionObject的代码,增加nextCanMove方法:1. /*2. * 下一目标点是否可以移动3. */4. public function get nextCanMove():Boolean5. 6. / 下一X位置7. var nx:uint = 0;8. / 下一Y位置9. var ny:uint = 0;10. / 根据移动方向进行处理,计算出下一目标点位置11. switch(walkDirection)12.
9、 13. case UP:14. ny = y-speed;15. break;16. case DOWN:17. ny = y+speed;18. break;19. case LEFT:20. nx = x-speed;21. break;22. case RIGHT:23. nx = x+speed;24. break;25. default:break;26. 27. 28. / 如果下一目标点超出屏幕范围,则不能移动29. if (nx Global.stage.stageWidth - width | nx Global.stage.stageHeight - height | n
10、y 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所规定的运行时间,则运
11、行程序,并把当前日期设置为最后一次运行的日期。在这里,我们调用可控制器的AutoRun方法。这样,所有的前期准备都准备完了,我们回到主场景Main来实现实际的功能。我们生成一个敌人,并把他放入列表:1. var ctrl2:MonsterControler = new MonsterControler();2. var monster:Monster = new Monster(ctrl2, new Skin2();3. scene.addObject(monster);这时,运行程序,我们可以看到场景里有了一红一黑两个方块,其中红色的将在场景内的边缘随机游荡。不过,主角和敌人在同一地点出现,
12、这很难看的清楚,所以,我们可以进一步修改代码。把主角放到200,200的位置,而利用for循环,生成3个敌人,并随机放到场景中500*300这个范围内: 1. var scene:gameScene = new gameScene(stage); / 声明游戏舞台2. var ctrl:KeyController = new KeyController(); / 定义控制器3. var obj:Player = new Player(ctrl, new Skin1();4. obj.x = 200;5. obj.y = 200;6. scene.addObject(obj);/ 将对象添加到舞台中7. 8. for (var i:uint = 0; i 3; i+)9. 10. var ctrl2:MonsterControler = new MonsterControler();11. var monster:Monster = new Monster(ctrl2, new Skin2();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