2014-12-17 1 views
3

좋아요, 플레이어가 적을 따라 다니는 javascript/html canvas 게임을 만들고 싶습니다. 그리고 '연구'를 조금 해보니 그녀가 내 괴물의 가장 중요한 부분입니다. (적) 클래스 : 그래서적을 움직이는 플레이어를 따라 다니는 데 문제가 있음

this.UpdateAngle = function() { 
    this.dx = this.x - player.x; 
    this.dy = this.y - player.y; 
    this.angle = Math.atan2(this.dy, this.dx) * 180/Math.PI; 
    if (this.angle < 0) { 
     this.angle += 2 * Math.PI; 
    } 
    } 
    this.UpdateSpeed = function() { 
    this.speedX = this.speed * Math.cos(this.angle); 
    this.speedY = this.speed * Math.sin(this.angle); 
    } 
    this.Move = function() { 
    this.UpdateAngle(); 
    this.UpdateSpeed(); 
    this.x += this.speedX; 
    this.y += this.speedY; 
    } 

내가 여기서 뭘 무엇을 의미하는지는 atan2()으로 플레이어에게 적을에서 각도를 계산하고 cos()를 사용하여 내가 x 및 y 축에서 이동해야합니다 얼마나 계산했다 그리고 sin(), 속도와 각도 I를 계산 한 다음 계산 된 픽셀을 방금 이동했습니다.

이 모든 것이 잘 작동하는 것처럼 보입니다. 플레이어를 움직이면 적들은 이상한 방향으로 움직이기 시작합니다. 나는 무엇이 잘못 됐는지 전혀 모른다. 누군가가 나를 어떻게 할 수 있는지를 알 수 있다면 그것은 굉장 할 것이다. : D

조치 : here에서 확인할 수 있습니다. * PremierBromanov의 제안으로 코드를 업데이트했습니다.

+0

나는 그 해결책을 알지 못한다. (나는 오랫동안 삼각법을 잊어 버렸다.) 그러나 디버깅 수단으로서 나는 각 엔티티 현재 속도를 보여주는 텍스트와 함께 현재 이동 방향으로 이동합니다. –

+0

나는 너를 도울 수 없다 ... 대신에 나는 또 다른 결점을 발견했다. 죄송합니다! : D 적과 정확히 같은 높이에있을 때 (각도 재 계산을 강제로) 움직이면 _ 대신에 _에서 당신을 시작합니다 : – AJPerez

+0

왜 그들이 이상한 행동을하는지 찾기 위해 플레이어는 키를 누르는 중입니다 ... 나는 많은'console.log()'호출을 각 함수에 적어도 한 번은 추가 할 것이며, 아마도 speedX, speedY 또는 angle을 다시 계산할 때마다 하나씩 호출 할 것입니다. 추적 로그를 분석하고 이동시 발생하는 상황을 비교하십시오. – AJPerez

답변

0

확인로 변경합니다, 그래서이, 감사 대답 실제로 프리미어 Bromanov했지만, 나는 그것이 코멘트를 받아 들일 수 없다, 그래서 난 그냥 것 누구든지 와서 대답을 원한다면 더 명확하게하기 위해이 일을하십시오. 내가 한 수학이 조금 잘못됐다, 여기에 내 코드처럼 보이는 결국 방법은 다음과 같습니다 프리미어 Bromanov에 다시

this.UpdateAngle = function() { 
    this.dx = player.x - this.x; 
    this.dy = player.y - this.y; 
    this.distance = Math.sqrt((this.dx*this.dx) + (this.dy*this.dy)); 
    this.angle = Math.atan2(this.dy,this.dx) * 180/Math.PI; 
} 
    this.UpdateSpeed = function() { 
    this.speedX = this.speed * (this.dx/this.distance); 
    this.speedY = this.speed * (this.dy/this.distance); 
} 
this.Move = function() { 
    this.UpdateAngle(); 
    this.UpdateSpeed(); 
    this.x += this.speedX; 
    this.y += this.speedY; 
} 

감사합니다, 이것이 그의 대답, 또한 다른 사람에,이 내 첫 번째 게시물이었다 그리고 내가 얼마나 빨리 응답을 얻었는지 기쁘다! (내가 가장 느린 것) : D

1

그것은 당신이 그것의 있는지 확인하고 당신은 라디안 각도를 출력 Math.atan2를 사용하는

this.angle = Math.atan2(this.dy,this.dx) * 180/Math.PI; 
    if (this.angle < 0) { 
     this.angle += 2 * Math.PI; 

는, 당신은 그 후 * 180/Math.PI;와 도로 변환하는이 블록 함께 할 수있는 뭔가가있을 수 있습니다 0보다 작고 각도에 2Pi를 추가하여 실제 원의 각도에서 각도를 뺀 값을 올바르게 계산하는지 확인하십시오. 하지만, 각도 대신 라디안을 사용하고 있습니다. 따라서 코드가 음수이면 2Pi를 학위에 추가합니다.이 정도는 그리 많지 않지만 때로는 양의 값이됩니다. 이것이 당신이 움직일 때 당신의 점들이 돌고있는 이유입니다. 눈에 띄면 점이 더 멀리 떨어져있을 때 점은 더 느리게 회전합니다. 즉, 음의 각도가 2Pi보다 커서 즉각 돌아 서지 않음을 의미합니다. 짧은

if (this.angle < 0) { 
     this.angle += 360; 
    } 
+1

곱셈과 나눗셈에 순서가 맞지 않습니까? num1 * (num2/num3) = (num1 * num2)/num3 – NewbornCodeMonkey

+1

아니요, 맞아요, 그건 무의미합니다. 내가 생각하기에 습관 일뿐입니다.대부분의 컴파일러는 물건을 추가하기 전에 곱셈하고 나눌만큼 똑똑하지만 코드에서 조작 순서가 잘못 될 가능성을 배제하고 있습니다. 따라서 코드가 깨지는 경우 정확하게 이유를 알고 –

+0

고마워요, 그게 도움이 되긴하지만 가끔은 원과 이상한 방향으로 간다. (사이트의 코드를 업데이트했습니다) –