【问题标题】:Flash as3: Making ennemies with the same IA move differently from each otherFlash as3:使具有相同AS的敌人移动方式不同
【发布时间】: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(它是之前下降)并且有一点变化,但这仍然很奇怪)

无论如何感谢您的帮助和关注

【问题讨论】:

    标签: arrays actionscript-3 flash random


    【解决方案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.
    • 我的意思是我的水平高级,现在你解释清楚了谢谢!
    猜你喜欢
    • 2014-05-20
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多