2016-08-17 3 views
0

私はテトリスゲームをプログラミングしています。これまでは、約50ミリ秒の非常に短い間隔のタイマーを実装しました。毎ティックごとに、現在のテロミノがゲームマトリックスの1つ下の位置に移動します。その後、ゲームは衝突があるかどうかをチェックします。そうであれば、テトロミノが「着陸」とマークされ、新しいテトロミノが誕生します。C#他のタイマーの中のタイマーを使用していますか?

いいえ私は、テロミノがすでに着陸しているテロミノの下にテロミノを移動する可能性を持って着陸してから0.5秒後に、テロミノを左右に動かす機会をプレイヤーに与えたいという問題があります。

私の現在のコードでは、衝突が検出され次第、タイマーが継続して次のテトロミノを生成するという問題があります。私のアイデアは、メインタイマーを継続してキーボード入力を追加できるように衝突が検出されるたびに0.5秒間アクティブになる第2のタイマーを実装しようとしていました。したがって、基本的にメインタイマーを0.5秒間一時停止し、その時間中にプログラムがキーボード入力を検出してメインタイマーを続行できるようにします。

これまでに試したことはすべて実際には機能しませんでした。私は2番目のタイマーをアクティブにしている間、最初のタイマーは常に稼動し続けているようです。今、私は何とか私のCollisionCheck()メソッド内のコードはLineCheck()を続行する前に、0.5秒待つための方法を実装する必要が

private void TimerBrick_Tick(object sender, EventArgs e) 
     { 
      ResetGameBoard(jaggedTetrisBricks[rnd-1][rotation], _brickX, _brickY, xLengthBrick, yLengthBrick); 
      _brickX++; 
      CollisionCheck(jaggedTetrisBricks[rnd - 1][rotation], _brickX, _brickY, xLengthBrick, yLengthBrick); 
      LineCheck(); 

      Invalidate(); 
     } 

これが私の最初のタイマーがどのように見えるかです。

私は今見ていない別の方法がありますか?私の以前のコメントに加えて

+0

あなたは ''のThread.sleep(時間)を使用することができますが、それはだ場合、多分これは、全体のプログラムを一時停止しますテロミノのためにタスクを使用することができますが、それはあなたが対処しなければならない他の問題を引き起こします。 – null

+4

あなたのメインタイマーのティックで状態駆動型システムを実装するのはどうでしょうか?通常の状態は "BrickFalling"です。衝突を検出すると、10ティックの "MoveSideways"に状態を変更した後、新しいブリックを作成し、 "BrickFalling "タイマーティックイベントの中では、ifまたはswitchを使うだけです。必要に応じてさらに状態を追加するのは簡単です。 – PaulF

+0

@PaulFが示唆しているのは[ゲームの通常のアプローチ](http://gameprogrammingpatterns.com/state.html)です。また、ゲームループのデフォルト間隔を0.5秒にすることができますので、「Falling」状態では他の種類の処理を利用できます。 – galenus

答えて

1

は - ここにある擬似コードのビット:

enum GameState 
{ 
    Starting, 
    CreateBrick, 
    BrickFalling, 
    MoveSideways 
} 

private GameState curState = Starting; 
private ushort ctSideways; 

private void TimerBrick_Tick(object sender, EventArgs e) 
{ 
    switch (curState) 
    { 
     case Starting: 
      InitialiseGame(); 
      curState = CreateBrick; 
      break; 

     case CreateBrick: 
      CreateNewBrick(); 
      curState = BrickFalling; 
      break; 

     case BrickFalling: 
      ..... 
      ..... 
      if (CollisionCheck()) 
      { 
       ctSideways = 0; 
       curState = MoveSideways; 
      } 
      break; 

     case MoveSideways: 
      ..... 
      ..... 
      ctSidways++; 
      if (ctSideways == 10) 
       curState = CreateBrick; 
      break; 
    } 

} 
+0

私は変数が特定の値に達すると状態を変更するためにカウントアップする変数で同様のアプローチを持っていたので感謝;) –

関連する問題