0

Allegro4とC++を使用して非常に基本的なバージョンのPongを実装しようとしています。しかし、rest()呼び出しと組み合わせてタイミングメカニズムを使用すると、問題が発生します。私のゲームは2人用に設定されており、プレーヤーが7ポイントを獲得すると、プレーヤーは1セットを獲得し、その後、両方とも0からやり直します。2セットを獲得した最初のプレーヤーが勝ちます。セットが当たった後、当選者の名前を表示し、rest(2000)を呼び出して、プレイヤーがメッセージを確認できるようにします。しかし、この後、ボールはどこからともなく出てきたように見え、セットの最初にプレーヤーの1人に自動的にポイントが与えられます。その後、本来の中心から再開します。これは、タイミングメカニズムまたはrest()呼び出しを削除しても発生しません。

スコアとセットの更新をタイミングループの外に移動しようとしましたが、機能しません。また、rest()呼び出しの直後にボールのinit()関数を呼び出すこともありません。問題を解決する方法について、いくつかの情報をいただければ幸いです。

これがコードです。問題に影響を与えない基本的なビットとインクルードは省略しました。 //includes...

Paddle p1, p2;  //paddles for player 1, player 2
Ball b;   //game ball

int main()
{
    setupGame();   //setup allegro and bitmaps
    init();    //initialize paddles and ball

    bool done = false;
    int win, game = 0;

    //game loop
    while(!done)    
    {
     if(key[KEY_X])   //quick exit for debugging
        done = true;

     //timing loop
     while(counter > 0) {
         movePaddles();   
         moveAndCollideBall();
         game = checkCondition(b, p1, p2);  //check if either player 1 or player 2 has won a point
         updateScore(game);   //update score
         updateSets();        //update set if score of either equals 7

         counter --; 
     }

     draw();    //draw paddles and ball
     displayScore();   

     blit(buffer, screen, 0, 0, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);  //draw buffer to screen
     clear_bitmap(buffer);   //clear buffer for next iteration

     checkWinner(done);   //check if either player has won 2 sets, exit loop if so
    }
    exitGame();   //clear bitmaps and exit allegro
    return 0;
}
END_OF_MAIN()

//Returns 1 if player 1 has won a point, 2 for player 2
int checkCondition(Ball b, Paddle p1, Paddle p2)
{
  if(b.x < p1.x)
     return 2;
  else if(b.x > p2.x+PADDLE_WIDTH)
     return 1;
  return 0;
}

//setup allegro and timing variables, load bitmaps
void setupGame()
{
    //allegro, screen setup, etc.

    //timing mechanism
    LOCK_VARIABLE(counter);
    LOCK_FUNCTION(increment_counter);
    install_int_ex(increment_counter, BPS_TO_TIMER(240));

    srand(time(0));

    //other setup stuff
}

//initialize paddles and ball
void init()
{
    p1.init(10, 210);
    p2.init(620, 210);
    b.init();
}

//output score to buffer
void displayScore()
{
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/4, 10, WHITE, -1, "%i", p1.score);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 - SCREEN_WIDTH/3, 450, WHITE, -1, "Sets: %i", p1.sets);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 + SCREEN_WIDTH/4, 10, WHITE, -1, "%i", p2.score);
  textprintf_ex(buffer, gamefont, SCREEN_WIDTH/2 + SCREEN_WIDTH/6, 450, WHITE, -1, "Sets: %i", p2.sets);
}

 //taking the winner of the point as parameter, update the corresponding player's score by 1, reset ball
void updateScore(int game)
{
  if(game > 0)
    {game == 1 ? ++p1.score : ++p2.score;
     b.init();
     game = 0;
    }              
}


//update no of sets won if either player has score of 7, reset scores
void updateSets()
{
if(p1.score == 7 || p2.score == 7)
 {
   if(p1.score == 7)
      {p1.sets++;
       textprintf_ex(screen, gamefont, SCREEN_WIDTH/5, SCREEN_HEIGHT/2,WHITE, -1, "Player 1 wins the set!");
       }         
   else
      {p2.sets++;
       textprintf_ex(screen, gamefont, SCREEN_WIDTH/5, SCREEN_HEIGHT/2,WHITE, -1, "Player 2 wins the set!");

      }
   p2.score = 0;
   p1.score = 0;

   rest(2000);  //THIS SEEMS TO CAUSE THE PROBLEM, AFTER THE REST, THE BALL INSTEAD OF COMING FROM THE CENTER, QUICKLY COMES FROM SOMEWHERE CLOSE TO THE CORNER
  }   
}     

//check if either player has won 2 sets, if so set done to true
void checkWinner(bool& done)
{
if(p1.sets == 2)
  {textprintf_ex(screen, gamefont, SCREEN_WIDTH/4, SCREEN_HEIGHT/2 + 30,WHITE, -1, "Player 1 wins!!");
   rest(2000);
   done = true;
   }
else if(p2.sets == 2)
  {textprintf_ex(screen, gamefont, SCREEN_WIDTH/4, SCREEN_HEIGHT/2 + 30,WHITE, -1, "Player 2 wins!!");
   rest(2000);
   done = true;
  }
}
4

1 に答える 1

0

の後rest(2000)、カウンターを にリセットし0ます。その休憩中に 2 秒間カチカチ音をたてているため、終了後、追いつくために 2 秒間のゲームプレイ バーストが発生します。

適切な修正は、コードをより適切に整理することです。2 秒間の休憩は、通常のタイミング ループの一部として行われる必要があります。

于 2012-11-15T09:08:58.563 に答える