Flash as3:使具有相同AS的敌人移动方式不同
Posted
技术标签:
【中文标题】Flash as3:使具有相同AS的敌人移动方式不同【英文标题】:Flash as3: Making ennemies with the same IA move differently from each other 【发布时间】:2017-10-22 14:57:06 【问题描述】:所以我正在制作一款游戏(至少尝试这样做),并且我有一些在随机位置生成的敌人,然后我将它们放入一个数组中。然后循环输入框中的一个函数使该数组中的敌人在地图上随机移动。所以它们的动作是随机的,但它们都是同步的,所以它们同时做出相同的动作模式。我正在尝试弄清楚如何使它们以不同的方式移动,或者至少以随机延迟产生,以使它们不完全同步。这可能是一个基本问题,但我正在尝试用我目前理解并能够解释的内容制作游戏,所以我非常感谢您的解释和建议。
这是我的代码(其中包含我的一些法语笔记,对此我感到抱歉,但我需要记住一些东西,以便我可以在测试中解释它们:d)
所以敌人是摄魂怪,来自一个电影剪辑“DementorAllSprite”,其中包含面向不同方向的敌人的精灵
这是循环输入框外的代码
//set up var Dementor and array
//duration: random number between 0 et 150
//Facing: random number arrondi en dessous, donc entre 0 et 3
var DementorTimer = 0;
var DementorDuration = Math.random() * 150;
var DementorFacing: Number = Math.floor(Math.random() * 4);
var DementorSpeed: Number = 13;
var enemies_arr:Array = [];
这里是循环函数
PlayContainer.addEventListener(Event.ENTER_FRAME, PlayLoop);
function PlayLoop(loopEvent:Event):void
addDementor();
moveDementor();
function addDementor():void
//max number of ennemies
if(enemies_arr.length < 20)
//add le dementor if conditions check
var Dementor:DementorAllSprite = new DementorAllSprite();
//positions random on a grass container
var startX:int = Math.random() * 5760;
var startY:int = Math.random() * 3600 ;
Dementor.x = startX;
Dementor.y = startY;
//add Dementor to grass container and set their transparency (they gain alpha when they hit the Player )
GrassContainer.addChild(Dementor);
Dementor.alpha=0.4;
//store the object in an array
enemies_arr.push(Dementor);
//---Mouvements Dementors---//
//Timer = 0, Duration entre 0 et 25, chaque loop rajoute 1 au timer (DementorTimer ++;)
//jusqu'a ce que le if ne match plus, puis reset
//Facing mvmt: 0= back / 1= front / 2= right / 3= left
//Frames Dementor: 1= front / 2= back / 3= left / 4= right
//switch = if, else if, else if, ....
function moveDementor():void
//check les dementors de l'array (de 0 a leur nombre)
for (var j:int = 0; j < enemies_arr.length; j++)
if (DementorTimer < DementorDuration)
switch (DementorFacing)
case 0 :
enemies_arr[j].y-=DementorSpeed;
enemies_arr[j].gotoAndStop(2)
break;
case 1 :
enemies_arr[j].y+=DementorSpeed;
enemies_arr[j].gotoAndStop(1)
break;
case 2 :
enemies_arr[j].x+=DementorSpeed;
enemies_arr[j].gotoAndStop(4)
break;
case 3 :
enemies_arr[j].x-=DementorSpeed;
enemies_arr[j].gotoAndStop(3)
DementorTimer++;
//reset
else
DementorDuration = Math.random() * 150;
DementorFacing = Math.floor(Math.random() * 4);
DementorTimer = 0;
此外,摄魂怪的移动非常短,因为我将它们放在一个数组中(最初只有 1 个,他在改变方向之前确实移动了很多,现在它们改变位置非常快,我将持续时间增加到 150(它是之前下降)并且有一点变化,但这仍然很奇怪)
无论如何感谢您的帮助和关注
【问题讨论】:
【参考方案1】:嗯,我想你需要一些调整和改变。
var DList:Array = ["up", "down", "left", "right"];
var DHash:Object =
"up": "frame":2, "x": 0, "y":-1,
"down": "frame":1, "x": 0, "y": 1,
"left": "frame":3, "x":-1, "y": 0,
"right": "frame":4, "x": 1, "y": 0
// Decides how many steps Dementor should take before next reset.
function resetDementor(target:DementorAllSprite):void
target.stepsLeft = int(10 + 10 * Math.random());
// Turns Dementor to a random direction.
function randomDirection(target:DementorAllSprite):void
target.direction = DList[int(DList.length * Math.random())];
target.gotoAndStop(DHash[target.direction]['frame']);
PlayContainer.addEventListener(Event.ENTER_FRAME, PlayLoop);
// First of all, for goodness sake, don't define functions inside functions.
function PlayLoop(e:Event):void
if (enemies_arr.length < 20) addDementor();
moveDementor();
function addDementor():void
//add le dementor if conditions check
var Dementor:DementorAllSprite = new DementorAllSprite();
//positions random on a grass container
var startX:int = Math.random() * 5760;
var startY:int = Math.random() * 3600 ;
Dementor.x = startX;
Dementor.y = startY;
// I guess DementorAllSprite is a MovieClip.
// Otherwise you need to add stepsLeft:int and direction:String to the class definition.
randomDirection(Dementor);
resetDementor(Dementor);
//add Dementor to grass container and set their transparency (they gain alpha when they hit the Player )
GrassContainer.addChild(Dementor);
Dementor.alpha=0.4;
//store the object in an array
enemies_arr.push(Dementor);
function moveDementor():void
//check les dementors de l'array (de 0 a leur nombre)
for (var j:int = 0; j < enemies_arr.length; j++)
// Get the reference to Dementor.
var Dementor:DementorAllSprite = enemies_arr[j];
// Check if Dementor needs a reset.
if (Dementor.stepsLeft < 0)
randomDirection(Dementor);
resetDementor(Dementor);
// Get the directions object with regard to Dementor's direction.
var aDir:Object = DHash[Dementor.direction];
// Move the Dementor.
Dementor.x += aDir['x'] * DementorSpeed;
Dementor.y += aDir['y'] * DementorSpeed;
// Reduce the number of steps to go.
Dementor.stepsLeft--;
【讨论】:
感谢您的快速回答,是的,对于我的新手错误,我很抱歉,我正在学习。所以我有点理解你的代码,但你似乎以一种非常先进的方式工作,我会试着理解,以便稍后在测试中解释哈哈。与此同时,我尝试运行它,但出现以下错误:target.direction = DList[int(DList.length * Math.random)];
的“将 void 类型的值隐式强制转换为不相关的类型号”
@Ymines 已修复。应该是一个函数调用:Math.random()
一切正常,非常感谢!如果您有时间可以解释一下逻辑,或者代码的一些高级部分,例如DHash:Object
?我隐约了解您何时提及它以及它的用途,但我无法解释您为什么以及如何使用它。但如果你不这样做,那都是上帝你帮了我很多,祝你有美好的一天:D
@Ymines 没有什么先进的。我将 Dementor.direction 设置为 4 个可能值中的 1 个:“up”、“down”、“left”、“right”。 DHash 包含 4 个具有以下信息的对象:“frame”表示各个摄魂怪的帧编号,其图形(或动画,可能)对应于 Dementor.direction,并且 (x ,y) 允许在没有大量 switch 子句的情况下将摄魂怪移动到正确方向的值。 DHash中的这4个对象中的每一个都可以通过它们的名字来访问,分别是“up”、“down”、“left”和“right”,记录在Dementor.direction.
我的意思是我的水平高级,现在你解释清楚了谢谢!以上是关于Flash as3:使具有相同AS的敌人移动方式不同的主要内容,如果未能解决你的问题,请参考以下文章