2013-05-08 3 views
0

빠른 작업을 위해 플레이어와 적들이있는 타일 배열이 있습니다.적의 무작위 이동

public static var floor1:Array = new Array(7); 
     floor1[0] = [0,1,1,1,1,1,0]; 
     floor1[1] = [1,1,1,1,1,1,1]; 
     floor1[2] = [1,1,1,0,1,1,1]; 
     floor1[3] = [1,1,0,0,0,1,1]; 
     floor1[4] = [1,1,1,0,1,1,1]; 
     floor1[5] = [1,1,1,1,1,1,1]; 
     floor1[6] = [0,1,1,1,1,1,0]; 
     public function Main() 
     { 

      var tilew:int = 60; 
      var tileh:int = 60; 

      for (var i:int=0; i<floor1.length; i++) 
      { 
       for (var u:int=0; u<floor1[i].length; u++) 
       { 
        var cell:MovieClip = new Tile(); 
        cell.gotoAndStop(floor1[i][u]); 
        cell.x = ((u-i)*tileh); 
        cell.y = ((u+i)*tilew/2); 
        addChild(cell); 


        cell.addEventListener(MouseEvent.ROLL_OVER, mouseover); 
        cell.addEventListener(MouseEvent.ROLL_OUT, mouseout); 
        cell.addEventListener(MouseEvent.CLICK, mouseclick); 
        cell.addEventListener(Event.ENTER_FRAME, beginfloor1); 


       } 
      } 

      var player:Player = new Player(); 
     addChild(player); 
     player.mouseEnabled = false; 
     player.x = 5 * (tileh); 
     player.y = 5 * (tilew/2); 


     var enemy:Enemy = new Enemy(); 

     addChild(enemy); 
     enemy.mouseEnabled = false; 
     enemy.x = 9 * (tileh); 
     enemy.y = 9 * (tileh/2); 

내 목표는 적을 자신의 범위에서 타일에 무작위로 이동시키는 것입니다. 내가 한 것은 enemyVisionArea라고 불리는 정사각형 그래픽을 작성하여 어느 타일이 적을 때리는지를 확인하는 것이 었습니다. 타일은 기본적으로 타일을 둘러 쌉니다.

저는 플레이어가 근처에 없거나 그가 사용할 수있는 타일 옆에 있다면 5 초마다 움직이는 적을 알려주는 타이머 기능을 가지고 있습니다.

function timerenemy (event:TimerEvent){ 
       if (enemy.enemyVisionArea.hitTestObject(enemyMover) && !player.visionPoint.hitTestObject(enemyMover.tileMiddle)) 
        { 
         enemy.x = (enemyMover.x)+55; 
         enemy.y = (enemyMover.y)+20; 
         trace("moved"); 

        } 
      } 

enemyMover 내가 타일 오브젝트 같게 변수이다.

function beginfloor1(event:Event) 
      { 
       enemyMover = event.currentTarget as Tile; 

      } 

그냥 그대로 있습니다. 나는 적의 VisionArea가 타격을받는 타일 위에 적을 이동시키고 싶을뿐입니다. 가까운 타일을 테스트하십시오. beginfloor1 함수가 작동하지 않는 것 같습니다. enemyMover = event.currentTarget을 타일로 선언하고 enemyVisionArea가 타격을 치는 임의의 타일로 적을 이동시킬 수있는 방법이 있습니까? 테스트 중입니까?

혼란스러운 경우 전체 코드를 게시 할 수 있습니다.

답변

1

순차적으로 호출되는 49 개의 enterframe 리스너를 지정하고 ALL은 하나의 단일 변수를 연결된 셀로 변경합니다. 물론 마지막 타일은 항상 할당 된 것입니다.

이동할 수있는 타일이 있는지 적에게 확인시켜주기를 기대합니다. 본질적으로 하나의 타일이 enemyMover인지 확인하고 있습니다. 타일은 어떻게 결정합니까? 적의 주위에있는 모든 타일을 확인하고 목록을 작성한 다음 현재 타일이 아닌 목록에서 하나를 선택한 다음 거기에서 적을 이동해야합니다.

그래서 먼저 어딘가에서 주소 지정이 가능한 완전한 타일 세트가 필요합니다. 가장 좋은 방법은 클래스 전체에 var tileset:Array을 선언하고 새 타일을 작성하는 곳을 채우는 것입니다. 쓸모가 없으므로 코드에서 Event.ENTER_FRAME 청취자를 삭제하십시오. 그런 다음 적의 경우 timerevent에서 tileset이 모두 적의 시력 영역 내에 있다면 확인하십시오 (hitTestObject을 사용하면 그리드 방식 또는 좌표 방식으로 명확한 거리를 사용합니다. 훨씬 빠릅니다). 그렇다면, 그 함수 내에서 만든 TEMPORARY 배열에 추가하십시오. 물론, 적군이 현재 처리 된 셀에 있다면, 당신은 그것을 무시합니다. 적을 움직여야합니다. 그런 다음 적을 어떤 칸으로 이동시켜야하는지 (어떤 식 으로든 그것은 당신에게 달렸습니다)을 선택하고 이동을 실행하십시오. 네, 적을 무작위로 이동 시키길 원한다면, 색인에 의해 무작위로 셀을 선택하십시오 : Math.floor(Math.random()*selectedcells.length).

+0

답변 해 주셔서 감사합니다. enemyMover를 배열로 바꾸는 것은 의미가 있습니다. 타일이 1 개 이상이므로 배열을 사용하는 것이 좋습니다. psuedo tileset 배열 변수에 관해서는 floor1 변수 배열과 동일합니까? – Bindlestick

+0

'floor1'은 색인 집합 일 뿐이지 만 참조 할 해당'Tile' 객체가 필요합니다. 그러나 tileset과 함께'floor1'을 사용하면 불안정한 타일을 필터링하는 데 도움이됩니다. – Vesper

+0

타일셋을 타일 오브젝트와 어떻게 같습니까? 이전에 할당하려고했는데 배열이 MovieClips와 같을 수 없다고 말합니다. – Bindlestick