2009-12-04 2 views
1

메신저에는 xna에 테트리스를 쓰고 있습니다. rotateBlocks 메서드가있는 클래스가 있습니다. "Up"화살표 키를 누르면됩니다. 나는 그 버튼을 1 초 이상 누르고 있으면 첫 번째 else에서 인수를 실행한다. (블록을 ​​빠르게 돌림) 현재 아무 일도 일어나지 않는다. 나는 클래스에서 전 세계적으로 oldState를 선언했다. 블록이 빠른 imedietley를 돌릴 경우 먼저 gametime 검사를 제거합니다. 난과 바꿈 코드를 단계별하려고하면 해상도 **** D까지1 초 지연의 C# Xna 키드 다운

공개 무효 RotateBlocks (loadBlock의 LB, KeyboardState newState, GameTime gameTime) { _elapsedSeconds2 + = (플로트) gameTime.ElapsedGameTime을 f를 얻는다. TotalSeconds;

 if (lb._name.Equals("block1")) 
     { 

      if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player just pressed Up 


       if (_rotated) 
       { 
        lb._position[0].X -= 16; 
        lb._position[0].Y -= 16; 
        lb._position[2].X += 16; 
        lb._position[2].Y += 16; 
        lb._position[3].X += 32; 
        lb._position[3].Y += 32; 
        _rotated = false; 
       } 

       else if (!_rotated) 
       { 
        lb._position[0].X += 16; 
        lb._position[0].Y += 16; 
        lb._position[2].X -= 16; 
        lb._position[2].Y -= 16; 
        lb._position[3].X -= 32; 
        lb._position[3].Y -= 32; 
        _rotated = true; 
       } 


      } 
      if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player is holding the key down 
       if (gameTime.ElapsedGameTime.TotalSeconds >=1) 
       { 
        if (_rotated) 
        { 
         lb._position[0].X -= 16; 
         lb._position[0].Y -= 16; 
         lb._position[2].X += 16; 
         lb._position[2].Y += 16; 
         lb._position[3].X += 32; 
         lb._position[3].Y += 32; 
         _rotated = false; 
        } 

        else if (!_rotated) 
        { 
         lb._position[0].X += 16; 
         lb._position[0].Y += 16; 
         lb._position[2].X -= 16; 
         lb._position[2].Y -= 16; 
         lb._position[3].X -= 32; 
         lb._position[3].Y -= 32; 
         _rotated = true; 

        } 
        _elapsedSeconds2 = 0; 
       } 

      } 
+0

같은 것을 할 필요가있다. 내가 winforms 에서이 문제를 발견했기 때문에 이것은 OS 지향적이어야합니다 – Rumplin

답변

1

문제는 gameTime 검사가 이전 틱 이후 경과 한 시간 만 확인한다는 것입니다.

키를 처음 누른 시간을 저장 한 다음 현재 시간과의 차이를 비교해야합니다.

0

ElapsedGameTime은 Game.Update()가 마지막으로 호출 된 이후의 시간입니다. 따라서 게임 루프가 초당 60 회 상수로 실행되는 경우 ElapsedGameTime은 항상 1/60 초가됩니다. 키를 처음 눌렀을 때 TotalGameTime을 기록해야하며 이후 업데이트에서 비교할 때 사용해야합니다. @Michael가 올바른지

+0

당신은 좋은 예제를 제공합니까? 인스턴트 메신저 (xna)에 정말 새로운 메신저 – bld

+0

http://creators.xna.com에는 많은 리소스, 스타터 키트, 샘플 등이 있습니다. – Michael

+0

이전 상태를 저장하는 것과 거의 같은 방식으로 작업을 수행합니다. –

0

, 당신은 내가 같은 문제를 가지고 있지만, Silverlight 응용 프로그램에

// where integertype is int or long etc 
integertype startPress = 0; 

public void RotateBlocks(loadBlock lb, KeyboardState newState, GameTime gameTime) { 

    _elapsedSeconds2 += (float)gameTime.ElapsedGameTime.TotalSeconds; 

    if (lb._name.Equals("block1")) 
     { 
      if (newState.IsKeyDown(Keys.Up) && !oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player just pressed Up 
startPress = GameTime.ElapsedGameTime.TotalSeconds; 

       if (_rotated) 
       { 
        lb._position[0].X -= 16; 
        lb._position[0].Y -= 16; 
        lb._position[2].X += 16; 
        lb._position[2].Y += 16; 
        lb._position[3].X += 32; 
        lb._position[3].Y += 32; 
        _rotated = false; 
       } 

       else if (!_rotated) 
       { 
        lb._position[0].X += 16; 
        lb._position[0].Y += 16; 
        lb._position[2].X -= 16; 
        lb._position[2].Y -= 16; 
        lb._position[3].X -= 32; 
        lb._position[3].Y -= 32; 
        _rotated = true; 
       } 


      } 
      if (newState.IsKeyDown(Keys.Up) && oldState.IsKeyDown(Keys.Up)) 
      { 
       // the player is holding the key down 
       if (gameTime.ElapsedGameTime.TotalSeconds - startPress >=1) 
       { 
        if (_rotated) 
        { 
         lb._position[0].X -= 16; 
         lb._position[0].Y -= 16; 
         lb._position[2].X += 16; 
         lb._position[2].Y += 16; 
         lb._position[3].X += 32; 
         lb._position[3].Y += 32; 
         _rotated = false; 
        } 

        else if (!_rotated) 
        { 
         lb._position[0].X += 16; 
         lb._position[0].Y += 16; 
         lb._position[2].X -= 16; 
         lb._position[2].Y -= 16; 
         lb._position[3].X -= 32; 
         lb._position[3].Y -= 32; 
         _rotated = true; 

        } 
        _elapsedSeconds2 = 0; 
       } 

      }