2016-06-08 11 views
0

Platform 클래스의 모든 인스턴스를 Array에 배치하고 각각에 대해 a를 실행하여 AS3에서 플랫폼 게임을 작성하려고합니다. hitTestObject를 루프하여 플레이어가 그 중 하나를 터치하고 있는지 확인하십시오.'for each'루프의 AS3 배열 히트 테스트는 배열의 마지막 객체에서만 제대로 작동합니다.

내 문제는 플레이어가 배열의 각 플랫폼을 만지기 위해 정확하게 반응하는 동안 (즉, 플랫폼의 맨 위로 떨어지는 것을 멈추고 y 위치를 설정하는 것), 나는 점프 기능을 수행 할 수 있습니다. 배열의 마지막 플랫폼.

나는 ActionScript에 상당히 익숙하지 않아 왜 이런 일이 일어나는 지 잘 모릅니다. '각 루프마다'라는 말은 각 플랫폼이 동일한 방식으로 작동해야한다는 것을 의미합니다. 코드 중 일부는 각 플랫폼에서 제대로 작동하지만 어떤 이유로 플레이어가 점프 할 수있는 코드가 아닙니다.

왜 이런 일이 일어나고 있는지 해결책을 제시 할 수 있다면 매우 감사하게 생각합니다. 이것은 며칠 동안 나를 벽으로 몰고왔다.

다음은 관련 코드입니다. 이 함수는 입력 프레임 수신기에서 호출됩니다.

private function collisionTestPlatforms (event:Event) : void { 
     for each (var i:Platform in aPlatforms) { 
      if (player.hitTestObject(i)) { 
       Player.touchingGround = true; 
       player.y = i.y - 25; 
       Player.yVelocity = 0; 
      } else { 
       Player.touchingGround = false; 
      } 
     } 
    } 

대단히 감사합니다. DodgerThud의 제안 @를 유사

+2

Perhaphs을 당신이 collisionTestPlatforms''의 단일 실행을 작성하는 경우이 문제를 해결하는 것이 더 쉽습니다. 2 개의 플랫폼이 있다고 가정하십시오. 플레이어는 플랫폼 1에 선다. 실행이 완료되면 Player.touchingGround가 true 또는 false가 될 것인가? 대답은 거짓입니다. 왜? foreach 루프가 계속 진행되므로 플랫폼 2를 확인하고 플레이어가 플랫폼 1에 서 있기 때문에 else 절로 이동합니다. 플랫폼에 도달하면 반복적으로 루프를 중단시키는 간단한 수정이 필요합니다. – DodgerThud

+0

그것은 작동합니다! 그리고 당신의 설명도 훌륭하게 도움이되었습니다 - 지금 내가 잘못하고있는 것을 이해합니다. 신속하고 유용한 답장을 보내 주셔서 감사합니다. –

답변

1

, 당신은 루프에서 조건 else 걸릴 수 :

private function collisionTestPlatforms (event:Event) : void { 
    //By default, the player is not touching the ground until we find 
    // a collision with one of the platforms 
    Player.touchingGround = false; 
    for each (var i:Platform in aPlatforms) { 
     if (player.hitTestObject(i)) { 
      Player.touchingGround = true; 
      player.y = i.y - 25; 
      Player.yVelocity = 0; 
     } 
    } 
}