2016-09-06 5 views
0

나는 매우 기본적인 2D 게임을 달성하려고 노력 중입니다. 적의 위치는 화면에 나타나며 설정 포인트 (50과 500) 사이를왔다 갔다합니다. 우주 침략자 일종의. 내 문제는 내가 제대로 할 수 밖에 없지만 왼쪽으로 돌아와 반복하지 않는다는 것입니다.Monogame/XNA에서 적을 앞뒤로 움직이기

나는 그걸 들여다보기 전에 귀찮아서 실제로 알아낼 수는 없지만 실제로는 잘 될 것이라고 생각했지만 잘 작동하지 않는다고 생각했다. 왜 그런지는 모르겠다. 왜 그런지는 모르겠다. 내 코드는 스위치처럼 작동하도록되어 있습니다. 두 개의 if 문이 Update 루프 내에 있습니다. 하나는 다른 루프로, 다른 하나는 오른쪽으로 이동하고 다른 루프는 왼쪽으로 이동합니다. 괜찮 았지만 그렇게하지는 않습니다. 오른쪽으로 움직이면 왼쪽 부분 만 작동하지 않습니다.

그럼 왜 다음 코드가 작동하지 않습니까?

namespace _2D_game_num1 
{ 
    class Enemy 
    { 
     int health; 
     Vector2 enemy_location = new Vector2(50, 50); 
     Vector2 enemy_speed = new Vector2(1, 1); 
     Player player = new Player("dummy"); 

     public Enemy() 
     { 
      health = 100; 
     } 

     public void UpdateLocation() 
     { 
      //Vector2 player_pos = player.GetLocation(); 
      //if (player_pos.X < 200) 
      // Using the players location to figure out where the enemy should move 
      bool right = true; 
      bool left = false; 
      if (right) 
      { 
       enemy_location.X += enemy_speed.X; 
       if (enemy_location.X == 500) 
       { 
        right = false; 
        left = true; 
       } 
      } 

      if (left) 
      { 
       enemy_location.X -= enemy_speed.X; 
       if (enemy_location.X == 50) 
       { 
        right = true; 
        left = false; 
       } 
      } 

     } 

     public Vector2 GetLocation() 
     { 
      return enemy_location; 
     } 


    } 
} 

그리고 기본 게임 클래스에는 enemy1.UpdateLocation(); 업데이트 섹션 내에 올바르게 작동합니다 (잘 작동하는 플레이어 동작과 함께).

+0

'오른쪽'변수와 '왼쪽'변수가 필요하지 않습니다. '올바른'변수 만 있으면 모든 것을 단순화 할 수 있습니다. 그것이 사실이라면, 당신은 올바르게 움직이고 있습니다. 거짓이라면, 당신은 왼쪽으로 움직이고 있습니다. 또한 벡터는 부동 소수점을 기반으로하기 때문에 평등하게 테스트하지 않아야합니다 (두 배로 동일 함). '> = 500'과'<= 50'을 사용하여 "close but not 500 or 50"오류를 피하는 것이 더 좋습니다. – itsme86

+0

또 하나의 문제는, 클래스 멤버에 대해서 이야기하고 있던'right' 변수 하나를 만들고, UpdateLocation()에 로컬 변수를 넣지 말아야한다는 것입니다. 그 방법에 국부적이므로, 그 가치를 유지하지 못합니다. 지금 당장'UpdateLocation() '을 호출 할 때마다'right'를'true'로,'left'를'false'로 재설정합니다. 아마 당신이 가지고있는 주요 문제 일 겁니다. – itsme86

답변

1

이 시도 :

그것을 기반으로 적을 이동 우리가 여기서 뭐하는
public void UpdateLocation() 
    { 
      enemy_location.X += enemy_speed.X; 

      if (enemy_location.X <= 50 || enemy_location.X >= 500) 
      { 
       enemy_speed.X = new Vector2(-enemy_speed.X, enemy_speed.Y); 
      } 
    } 

는 현재 속도입니다. 그런 다음 위치가 화면의 왼쪽 또는 오른쪽에 있으면 방향을 변경하십시오.

때로는 단순하게 유지하는 것이 좋습니다. 그들은 단지 혼란스러운 것들이므로 leftright 플래그를 제거하십시오. Update 메서드를 처리 할 때 일반적으로 무언가의 상태가 변경됩니다. 이전에 가지고 있던 방법 인 UpdateLocation이 호출 될 때마다 leftright 상태가 재설정되었습니다.

Btw의 경우 Update 메서드에 GameTime을 전달하는 것이 좋습니다. 일반적으로 실시간으로 물건을 움직일 때 모든 종류의 물건을 부드럽게 유지하려면 움직임을 여러 종류로 늘려야합니다 (deltaTime). 기본적으로 고정 된 프레임 속도가 될 것이기 때문에 아마도 그걸 가지고 떠날 것입니다.하지만 항상 그런 것은 아닙니다. 따라서 들어가는 것이 좋은 습관입니다.