2013-01-22 1 views
0

나와 내 친구는 위에서 캐릭터를 볼 수있는 RPG 스타일 게임을 만들려고하고 있지만 개체 충돌과 관련하여 문제가 발생했습니다. 플래시 CS6의 객체 지향 AS3 프로젝트에서이 작업을 수행하고 있음을 언급 할 가치가 있습니다.액션 스크립트 3 개체 충돌로 인해 문자가 겹치지 않음

수백만 번 질문했지만 우리는 하루 종일 해결책을 찾고 있었고 지금까지 발견 한 것들이 box2d/nape 나 우리가 이미 알고있는 평범한 충돌 탐지.

우리가 가진 문제는 충돌을 감지하고 주인공이 정지되거나 멈추지 않고 장면의 객체와 겹치지 않게하는 편리한 방법을 원한다는 것입니다. 지금까지 문제를 해결하기위한 모든 시도를 해재했지만, 나머지 코드는 우리가 어디에 있는지 이해하는 데 도움이됩니다 (읽기가 어려울 경우 죄송합니다). 관련 자습서에 대한 어떤 제안이나 추천도 환영합니다.

메인 클래스

package { 

import flash.display.Stage; 
import flash.display.MovieClip; 
import flash.events.Event; 

public class Engine extends MovieClip 
{ 
    private var hero:Hero; 
    private var box1:Box1; 

    public function Engine() 
    { 
     box1 = new Box1(); 
     stage.addChild(box1); 
     box1.x = stage.stageWidth/4; 
     box1.y = stage.stageHeight/2; 

     hero = new Hero(stage, box1); 
     stage.addChild(hero); 
     hero.x = stage.stageWidth/2; 
     hero.y = stage.stageHeight/2; 
    } 

} 
} 

문자 클래스

package 
{ 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.display.Stage; 

public class Hero extends MovieClip 
{ 
    private var box1:Box1; 
    private var stageRef:Stage; 
    private var vy:Number = 0; 
    private var vx:Number = 0; 
    private var limit:Number = 30; 
    private var rad:Number; 
    private var bounce:Number = 0.125; 
    private var _max:Number = 8; 

    public function Hero(stageRef:Stage, box1:Box1) 
    { 
     //box variable was used in previous experiments with hit tests 
     this.box1 = box1; 
     this.stageRef = stageRef; 
     Input.initialize(stageRef); 
     stageRef.addEventListener(Event.ENTER_FRAME, moveHero); 
    } 
    private function moveHero(e:Event):void 
    { 
     if (Input.kd("W","UP")) 
     { 
      vy = vy < 1 - _max ? _max * -1:vy - 1; 
     } 
     if (Input.kd("S","DOWN")) 
     { 
      vy = vy > _max - 1 ? _max:vy + 1; 
     } 
     else if (!Input.kd("W", "UP", "S", "DOWN")) 
     { 
      if (vy > 1) 
      { 
       vy = vy < 1 ? 0:vy - 1; 
      } 
      else 
      { 
       vy = vy > -1 ? 0:vy + 1; 
      } 

     } 
     if (Input.kd("A","LEFT")) 
     { 
      vx = vx < 1 - _max ? _max * -1:vx - 1; 
     } 
     if (Input.kd("D","RIGHT")) 
     { 
      vx = vx > _max - 1 ? _max:vx + 1; 
     } 
     else if (!Input.kd("A", "LEFT", "D", "RIGHT")) 
     { 
      if (vx > 1) 
      { 
       vx = vx < 1 ? 0:vx - 1; 
      } 
      else 
      { 
       vx = vx > -1 ? 0:vx + 1; 
      } 

     } 
     if (x < limit) 
     { 
      x = limit; 
      vx *= - bounce; 
     } 
     if (x > stage.stageWidth - limit) 
     { 
      x = stage.stageWidth - limit; 
      vx *= - bounce; 
     } 
     if (y < limit) 
     { 
      y = limit; 
      vy *= - bounce; 
     } 
     if (y > stage.stageHeight - limit) 
     { 
      y = stage.stageHeight - limit; 
      vy *= - bounce; 
     } 

     x += vx; 
     y += vy; 
     rad = (Math.atan2(stage.mouseY - y,stage.mouseX - x)) * 180/Math.PI; 
     this.rotation = rad; 


    } 
} 
} 

답변

0

충돌 감지를 할 수있는 간단한 방법은 다음과 같습니다 새 위치

에 객체 X를 이동

1) 시도를

2) 게임 Y의 각 오브젝트에 대해 Y와 X가 중첩되면 계산합니다 그들이 겹치는 경우 원 사각형, 사각형의 사각형, 원의 원 등)

3)에 대해 서로 다른 알고리즘을 사용, 1 단계하지만 절반까지 이동을 시도 돌아갑니다. 양자 택일로 : 당신이 충돌 물체가 원형 인 경우,하면서 여기에 접선 방향으로 이동하는 움직임의 각도를 변경 그것은 작은 당신이 90 명도 변경 때문에 0X 각도 변경 (코사인,하여 회전 정도에 따라 (SQRT2/2), 내 머리에서 의미가 있습니다.)

4) 이동이 성공하면, 그것을 유지 0도 변경 45도 변화와 1 배에 대한 X. 운동 길이가 엄청나게 작아지고 여전히 거절 당한다면, 당신이 쉬고 포기했다고 가정하십시오.

더 복잡한 알고리즘을 사용하면 충돌 한 지점에서 멀리 떨어져 나올 수 있으므로 곡선을 그리는 등의 방법으로 걷는 등의 방법으로 곡선을 그릴 수 있지만 배출이 충돌하지 않도록주의해야합니다 당신은 세 번째 대상 Z를 가지고 있으며, 까다로울 수 있습니다. (? 그들은 좋은 이유 코딩하고 당신이 물리 라이브러리를 사용하여 고려 되세요 -. 물리학 제대로하기 어렵다)