2017-05-22 4 views
0

그래서 게임을 만들려고합니다. (적어도 시도하려고합니다.) 임의의 위치에 산란하는 일부 엔네임을 가지고 있습니다. 정렬. 그런 다음 루프 enterframe의 함수가 해당 배열의 엔비들을 무작위로 맵 주위로 이동시킵니다. 그래서 그들의 움직임은 무작위이지만 모두 동기화되어 같은 동작을 반복합니다. 나는 그들을 다르게 움직이게 만드는 방법을 알아 내려고하고있다. 적어도 랜덤 딜레이로 산란 시켜서 모두 동기화하지는 않는다. 그것은 기본적인 질문 일지 모르지만 나는 현재 이해하고 설명 할 수있는 게임을 만들려고 노력하고 있습니다. 그래서 나는 당신의 설명과 충고에 진심으로 감사 할 것입니다. 여기 플래시 as3 : 동일한 IA로 된 ennemies가 서로 다르게 이동합니다.

내 코드 (미안 그것은 내 프랑스어 노트의 일부와,하지만 난 시험에서 그들을 설명 할 수 있도록 내가 물건을 기억해야합니다 : D)

는 그래서 ennemies가 아즈카반부터입니다 ennemy 스프라이트의 다른 방향

여기

대향 포함 된 동영상 클립 "DementorAllSprite"은 루프 기능

01,235,164 루프를 enterFrame 여기

//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; 
      } 
     } 
    } 

} 

또한 배열에 넣은 이후로 dementors 운동이 꽤 짧습니다. (원래 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--; 
    } 
} 
+0

빠른 답변을 보내 주셔서 감사 드리며, 초보자 실수로 유감스럽게 생각합니다. 배우고 있습니다. 그래서 내가 좀 당신의 코드를 이해하지만, 매우 진보 된 방식으로 일하는 것, 내가 나중에 시험 하하에서 설명 할 수 있도록 이해하려고 노력할 것입니다. 그 동안 나는 그것을 실행하려고 시도했다. 그리고 다음과 같은 오류가 발생했다 : "target.direction = DList [int (DList.length * Math.random)"에 대해 "무효 타입의 값을 무명 타입 번호에 암시 적으로 강제 변환")]; ' – Ymines

+0

@Ymines가 수정되었습니다. 함수 호출을해야합니다 : ** Math.random() ** – Organis

+0

모든 것이 작동합니다. 만약 당신이 몇 번이나 논리를 설명 할 수 있을까요? 아니면 예를 들어'DHash : Object'와 같은 코드의 일부 고급 부분을 설명 할 수 있습니까? 나는 당신이 그것을 참조 할 때 어떻게 사용되는지를 모호하게 이해하지만, 왜 그리고 어떻게 사용 하는지를 설명 할 수 없을 것입니다. 그러나 당신이하지 않으면 그것은 당신이 나를 많이 도와 줬던 모든 신이다 즐거운 하루 보내라. D – Ymines