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的敌人移动方式不同的主要内容,如果未能解决你的问题,请参考以下文章

AS3 Flash:从 1 个类中生成 2 个相同的对象?

来人啊。。。。flash as3.0 box2d停止刚体移动问题。

AS3。如何在动画过程中逐步推动敌人?

[AS3]XMLSocket通讯的安全策略设置

如何在 Flash AIR 和 AS3 中使用触控?

Flash AS3 画线显示文本