2014-01-17 3 views
0

잠시 동안 Shoot Em Up 게임에 문제가있어 정말 답을 찾지 못하는 것 같습니다. 스페이스 바를 누르고 있어도 총알 1 개만 쏘고 싶습니다. 현재 코드에서는 총알을 전혀 발사하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?C# - 한 번만 쏴 - IsKeyUp & IsKeyDown

 KeyboardState newState = Keyboard.GetState(); 
     KeyboardState oldState = Keyboard.GetState(); 

     if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space)) 
     { 
      bulletList.Add(new Bullet(content.Load<Texture2D>(@"bullet"), new Vector2(initialPos.X, initialPos.Y - 28), new Vector2(2, 4), spriteBatch)); 
     } 

     oldState = newState; 
+0

[다음은 예입니다 (http://msdn.microsoft.com/en-us/library/bb203902.aspx) –

답변

1

문제는 스페이스 바가 위아래인지 확인하는 것입니다. 불가능합니다.

bool readytofire = true; 
public override void Update() 
{ 
    KeyboardState newState = Keyboard.GetState(); 

    readytofire = !newState.IsKeyDown(Keys.Space); 

    if (newState.IsKeyDown(Keys.Space) && readytofire) 
    { 
     bulletList.Add(new Bullet(content.Load<Texture2D>(@"bullet"), new Vector2(initialPos.X, initialPos.Y - 28), new Vector2(2, 4), spriteBatch)); 
    } 
} 
+0

감사합니다, 그 생각을 결코 : 나는 당신이 이런 식으로 뭔가를 시도해야한다고 생각 ! –

+0

확실히 도움이 되었기 때문에 기쁩니다. 방금 ift ... then 문 앞에 'readytofire'를 업데이트해야한다는 것을 알았습니다 (스페이스 바가 올라가면'readytofire'가 업데이트 호출에 해당합니다). – davidsbro

+0

이것은 재미있는 방법입니다. op는 루프 밖에서 oldState를 정의한 다음 null이 아닌 경우에만 할당합니다. if (oldState == null) oldState = Keyboard.GetState(); 그럼 나머지 코드는 괜찮을거야. – naed21

0

이전 상태를 확인하기 전에 설정하기 때문에 항상 newState와 동일합니다. 이 줄을 제거하십시오. KeyboardState oldState = Keyboard.GetState();

루프를 처음 실행할 때 oldState에 값을 지정해야 할 수 있습니다.

0
KeyboardState newState = Keyboard.GetState(); 
KeyboardState oldState = Keyboard.GetState(); 

이들은 동일한 값을 갖습니다.

if (oldState.IsKeyUp(Keys.Space) && newState.IsKeyDown(Keys.Space)) 

이것은 스페이스 키가 모두 UP 및 DOWN인지 확인합니다.

두 코드 조각은 의미가 없습니다. 이 코드가 루프 안에 있습니까? 그렇다면 공백을 확인하고 부울 플래그를 사용하여 한 번만 발사하는지 확인하십시오. 그런 다음 깃발을 뒤집어 놓고 공간을 확인하십시오.