game over sequence

Started by
5 comments, last by Toolmaker 19 years, 7 months ago
ok i want my program to display a game over message and pause until the F2(new game) key is pressed but when the statement is fuffiled nothing happens it just keeps going on its way heres what i got (i dont really need anyone critiquing my code unless it pertains to my problem i cause this code hasnt been edited or optimized or whatever you want to call it) thx. [smile]

#include "breakout.h"
#include <string>
    

BOOL GameInitialize(HINSTANCE hInstance)
{
    _pGame = new GameEngine(hInstance , TEXT("breakout"), TEXT("breakout"), IDI_UFO, IDI_UFO_SM,500, 650);
        if (_pGame == NULL)
        {
            return FALSE;
        }; 
    _pGame->SetFrameRate(40);
    
        _hInstance =hInstance;
        return TRUE;
}
void GameStart(HWND hWindow)
{   RECT BallBounds =  { 0 , 0 , _pGame->GetWidth() , _pGame->GetHeight()};
    Offscreenbitmap = CreateCompatibleBitmap(GetDC(hWindow),_pGame->GetWidth(), _pGame->GetHeight());
    OffscreenDC = CreateCompatibleDC(GetDC(hWindow));
    RECT BlockBounds = { 0,0,_pGame->GetWidth(), _pGame->GetHeight()};
    for(int j = 0; j<30; j++)
    {
        blockbits[j] = new Bitmap(hDC, IDB_BLOCK , _hInstance);
    };    
    for(int i = 0; i<30; i++)
    {
        blocks = new Sprite(blockbits , BlockBounds , SA_NONE);
        _pGame->AddSprite(blocks);    
    };
    for (int l = 0; l <30; l++)
    { 
        blocks[l]->SetPosition(rand()%500, rand()%450);
        for(int s=0; s < 30; s++)
          if( blocks[l]->TestCollision(blocks) == <span class="cpp-keyword">TRUE</span>)
          {
              <span class="cpp-keyword">if</span> (blocks != blocks[l])
               blocks[l]-&gt;SetPosition(rand()%<span class="cpp-number">500</span>, rand()%<span class="cpp-number">450</span>);
          };
                      
    };    
        
    RECT PaddleBounds = { <span class="cpp-number">0</span> , <span class="cpp-number">0</span> , _pGame-&gt;GetWidth() , _pGame-&gt;GetHeight()};
    srand(GetTickCount());
    HDC hDC = GetDC(hWindow);
    BackGround = <span class="cpp-keyword">new</span> Bitmap(hDC, IDB_BACKGROUND , _hInstance);
    ballbit = <span class="cpp-keyword">new</span> Bitmap(hDC , IDB_BALL , _hInstance);
    paddlebit = <span class="cpp-keyword">new</span> Bitmap(hDC , IDB_PADDLE , _hInstance);
    ball = <span class="cpp-keyword">new</span> Sprite( ballbit , BallBounds , BA_BOUNCE);
    paddle = <span class="cpp-keyword">new</span> Sprite (paddlebit , PaddleBounds , BA_WRAP);
    ball-&gt;SetVelocity(<span class="cpp-number">0</span>,<span class="cpp-number">5</span>);
    paddle-&gt;SetVelocity(PaddleSpeed,<span class="cpp-number">0</span>);
    paddle-&gt;SetPosition(<span class="cpp-number">250</span>,<span class="cpp-number">600</span>);
    ball-&gt;SetPosition(<span class="cpp-number">250</span>,<span class="cpp-number">400</span>);
    _pGame-&gt;AddSprite(ball);
    _pGame-&gt;AddSprite(paddle);
    
}  
<span class="cpp-keyword">void</span> GameEnd()
{
    _pGame-&gt;CleanupSprites();
    <span class="cpp-comment">//_pGame-&gt;CloseMIDIPlayer();</span>
    <span class="cpp-keyword">delete</span> _pGame;
}
<span class="cpp-keyword">void</span> GameActivate (HWND hWindow)
{
    
}   
<span class="cpp-keyword">void</span> GameDeactivate  (HWND hWindow)
{
    
}  
<span class="cpp-keyword">void</span> GamePaint( HDC hDC)
{
   <span class="cpp-comment">// TCHAR szGameover[64];</span>
      
    TCHAR szText[<span class="cpp-number">64</span>];
    RECT rect = { <span class="cpp-number">600</span>, <span class="cpp-number">10</span>, <span class="cpp-number">301</span> };
    wsprintf(szText, <span class="cpp-literal">"%d"</span>, score);
    BackGround-&gt;Draw(hDC, <span class="cpp-number">0</span> , <span class="cpp-number">0</span> , <span class="cpp-keyword">TRUE</span>);
    _pGame-&gt;DrawSprites(hDC);
   <span class="cpp-keyword">switch</span> (ballnum)
    {
        <span class="cpp-keyword">case</span> <span class="cpp-number">0</span>:
            {
                DrawText(hDC, gameover, -<span class="cpp-number">1</span>, &amp;rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); 

                  totalblocks = <span class="cpp-number">0</span>; 
                    ball-&gt;SetPosition(<span class="cpp-number">250</span>,<span class="cpp-number">400</span>);
                    score = <span class="cpp-number">0</span> ;
                    <span class="cpp-comment">//ball-&gt;SetVelocity(0,5);</span>
                    pause = <span class="cpp-keyword">true</span>;
                    _pGame-&gt;SetSleep(pause);
                    <span class="cpp-keyword">if</span> (GetAsyncKeyState(VK_F2) &lt; <span class="cpp-number">0</span>)
                    pause = <span class="cpp-keyword">false</span>;   
            };
    };        
    <span class="cpp-keyword">switch</span> (totalblocks)
    {
        <span class="cpp-keyword">case</span>  <span class="cpp-number">0</span>: 
        {
        
            <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> l = <span class="cpp-number">0</span>; l &lt;<span class="cpp-number">30</span>; l++)
              { 
                blocks[l]-&gt;SetPosition(rand()%<span class="cpp-number">500</span>, rand()%<span class="cpp-number">450</span>);
		<span class="cpp-keyword">bool</span> IsNotSet=<span class="cpp-keyword">true</span>;                
		<span class="cpp-keyword">while</span> (<span class="cpp-number">1</span>)
		{
			<span class="cpp-keyword">bool</span> Failed=<span class="cpp-keyword">false</span>;
	        	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> s=<span class="cpp-number">0</span>; s &lt; <span class="cpp-number">30</span>; s++)
	                {
                             <span class="cpp-keyword">if</span>( blocks[l]-&gt;TestCollision(blocks) == <span class="cpp-keyword">TRUE</span>)
                             {
                              	<span class="cpp-keyword">if</span> (blocks != blocks[l])
                              	{
                               	blocks[l]-&gt;SetPosition(rand()%<span class="cpp-number">500</span>, rand()%<span class="cpp-number">450</span>);
				                               	Failed=<span class="cpp-keyword">true</span>;
                                };   	
                             }
                        }
			<span class="cpp-keyword">if</span> (!Failed) <span class="cpp-keyword">break</span>;
		}
             }      
          <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> y = <span class="cpp-number">0</span>; y &lt;<span class="cpp-number">30</span>; y++)
          {
              blocks[y]-&gt;SetHidden(<span class="cpp-keyword">false</span>);
          }
             
                      
       }
       totalblocks=<span class="cpp-number">29</span>; 
  
   <span class="cpp-keyword">case</span> -<span class="cpp-number">1</span>:
        {
        
            <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> l = <span class="cpp-number">0</span>; l &lt;<span class="cpp-number">30</span>; l++)
              { 
                blocks[l]-&gt;SetPosition(rand()%<span class="cpp-number">500</span>, rand()%<span class="cpp-number">450</span>);
		<span class="cpp-keyword">bool</span> IsNotSet=<span class="cpp-keyword">true</span>;                
		<span class="cpp-keyword">while</span> (<span class="cpp-number">1</span>)
		{
			<span class="cpp-keyword">bool</span> Failed=<span class="cpp-keyword">false</span>;
	        	<span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> s=<span class="cpp-number">0</span>; s &lt; <span class="cpp-number">30</span>; s++)
	                {
                             <span class="cpp-keyword">if</span>( blocks[l]-&gt;TestCollision(blocks) == <span class="cpp-keyword">TRUE</span>)
                             {
                              	<span class="cpp-keyword">if</span> (blocks != blocks[l])
                              	{
                               	blocks[l]-&gt;SetPosition(rand()%<span class="cpp-number">500</span>, rand()%<span class="cpp-number">450</span>);
				                               	Failed=<span class="cpp-keyword">true</span>;
                                };   	
                             }
                        }
			<span class="cpp-keyword">if</span> (!Failed) <span class="cpp-keyword">break</span>;
		}
             }      
          <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> y = <span class="cpp-number">0</span>; y &lt;<span class="cpp-number">30</span>; y++)
          {
              blocks[y]-&gt;SetHidden(<span class="cpp-keyword">false</span>);
          }
             
                      
       }
       totalblocks=<span class="cpp-number">29</span>; 
   }  

    wsprintf(szText, <span class="cpp-literal">"%d"</span>, score);
     DrawText(hDC, szText, -<span class="cpp-number">1</span>, &amp;rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
   
  
}
<span class="cpp-keyword">void</span> GameCycle ()
{
    <span class="cpp-keyword">if</span> (ballnum == <span class="cpp-number">0</span>)
    GAMEOVER = <span class="cpp-number">1</span>; 
    <span class="cpp-keyword">if</span>(ballposition &lt; <span class="cpp-number">0</span> +<span class="cpp-number">12</span>)
    {
        direct = down;
    };    
        
          
    <span class="cpp-keyword">if</span>(GetAsyncKeyState(VK_F2) &lt; <span class="cpp-number">0</span> )
    {
    totalblocks = <span class="cpp-number">0</span>; 
    ball-&gt;SetPosition(<span class="cpp-number">250</span>,<span class="cpp-number">400</span>);
    score = <span class="cpp-number">0</span> ;
    ball-&gt;SetVelocity(<span class="cpp-number">0</span>,<span class="cpp-number">5</span>);
    ballnum = <span class="cpp-number">3</span>;
    };    
     InvalidateRect(_pGame-&gt;GetWindow(), NULL, <span class="cpp-keyword">FALSE</span>);
    _pGame-&gt;UpdateSprites();
    HWND hWIndow =_pGame-&gt;GetWindow();
    HDC hDC = GetDC(hWindow);
    GamePaint(OffscreenDC);
    BitBlt(hDC, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, _pGame-&gt;GetWidth(), _pGame-&gt; GetHeight(), OffscreenDC, <span class="cpp-number">0</span>, <span class="cpp-number">0</span>, SRCCOPY);
    ReleaseDC(hWindow, hDC);
    <span class="cpp-keyword">if</span>(PaddleSpeed != <span class="cpp-number">0</span> &amp;&amp; PaddleSpeed &lt; <span class="cpp-number">0</span>)
    PaddleSpeed++;
    <span class="cpp-keyword">if</span>(PaddleSpeed != <span class="cpp-number">0</span> &amp;&amp; PaddleSpeed &gt; <span class="cpp-number">0</span>)
    PaddleSpeed–;
    paddle-&gt;SetVelocity(PaddleSpeed,<span class="cpp-number">0</span>);
    ballposition +=direct;
    <span class="cpp-keyword">if</span>(ballposition &gt; <span class="cpp-number">650</span> - <span class="cpp-number">12</span>)
    {
    ball-&gt;SetPosition(<span class="cpp-number">250</span>,<span class="cpp-number">400</span>);
    ballposition = <span class="cpp-number">400</span>;
    direct = down;
    ball-&gt;SetVelocity(<span class="cpp-number">0</span>,<span class="cpp-number">5</span>);
    }; 
    <span class="cpp-keyword">if</span> (pause == <span class="cpp-keyword">true</span>)
    {
        _pGame-&gt;SetSleep(pause);
    };
    <span class="cpp-comment">//_pGame-&gt;UpdateSprites();     </span>
    
   
}
<span class="cpp-keyword">void</span> HandleKeys()
{
    <span class="cpp-keyword">if</span>(GetAsyncKeyState(VK_LEFT) &lt; <span class="cpp-number">0</span>)
    {
        PaddleSpeed = -<span class="cpp-number">7</span>;
        paddle-&gt;SetVelocity(PaddleSpeed, <span class="cpp-number">0</span>);
    };  
    <span class="cpp-keyword">if</span>(GetAsyncKeyState(VK_RIGHT) &lt; <span class="cpp-number">0</span>)
    {
        PaddleSpeed = <span class="cpp-number">7</span>;
        paddle-&gt;SetVelocity(PaddleSpeed, <span class="cpp-number">0</span>);
    };      
    
}
<span class="cpp-keyword">void</span> MouseButtonDown(<span class="cpp-keyword">int</span> x, <span class="cpp-keyword">int</span> y, <span class="cpp-keyword">BOOL</span> bLeft)
{}
<span class="cpp-keyword">void</span> MouseButtonUp(<span class="cpp-keyword">int</span> x, <span class="cpp-keyword">int</span> y, <span class="cpp-keyword">BOOL</span> bLeft)
{}
<span class="cpp-keyword">void</span> MouseMove(<span class="cpp-keyword">int</span> x, <span class="cpp-keyword">int</span> y)
{} 
<span class="cpp-keyword">BOOL</span> SpriteCollision(Sprite* pSpriteHitter, Sprite* pSpriteHittee)
{
  <span class="cpp-keyword">if</span>(pSpriteHitter-&gt;GetBitmap() == blockbits[<span class="cpp-number">1</span>] &amp;&amp; pSpriteHittee-&gt;GetBitmap() == blockbits[<span class="cpp-number">1</span>])
  {
      pSpriteHitter-&gt;SetPosition(rand()% <span class="cpp-number">500</span>, rand()%<span class="cpp-number">500</span>);
  };    
  <span class="cpp-keyword">if</span>(pSpriteHitter-&gt;GetBitmap() == ballbit &amp;&amp; pSpriteHittee-&gt;GetBitmap() == paddlebit)
  {
      <span class="cpp-keyword">if</span>(PaddleSpeed != <span class="cpp-number">0</span>)
      {
      ball-&gt;SetVelocity(-PaddleSpeed,-<span class="cpp-number">5</span>);
      direct = up;
      }    
      <span class="cpp-keyword">else</span> ball-&gt;SetVelocity(<span class="cpp-number">0</span>,-<span class="cpp-number">5</span>); 
      direct = up;
  }
  <span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i &lt; <span class="cpp-number">30</span>; i++)
  {
      <span class="cpp-keyword">if</span>(pSpriteHitter-&gt;GetBitmap() == ballbit &amp;&amp; pSpriteHittee-&gt;GetBitmap() == blockbits<span style="font-weight:bold;"> &amp;&amp; pSpriteHittee-&gt;IsHidden() != <span class="cpp-keyword">TRUE</span>)
      {
      
           ball-&gt;SetVelocity(<span class="cpp-number">0</span>,<span class="cpp-number">5</span>);
           pSpriteHittee-&gt;SetHidden(<span class="cpp-keyword">TRUE</span>);
           score += <span class="cpp-number">5</span>;
           totalblocks–;
           direct = down;
      };    
  }; 
  <span class="cpp-keyword">return</span> <span class="cpp-keyword">false</span>;

}              

</pre></div><!–ENDSCRIPT–>

HEADER

<!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre>
Sprite* ball;
Bitmap* ballbit;
Sprite* paddle;
Bitmap* paddlebit;
GameEngine* _pGame;
HINSTANCE _hInstance;
<span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> PaddleSpeed;
Bitmap* BackGround;
Sprite * blocks[<span class="cpp-number">30</span>];
Bitmap * blockbits[<span class="cpp-number">30</span>];
HDC OffscreenDC;
HDC hDC;
HWND hWindow;
HBITMAP Offscreenbitmap;
<span class="cpp-keyword">int</span> score = <span class="cpp-number">0</span>;
<span class="cpp-keyword">short</span> <span class="cpp-keyword">int</span> totalblocks = <span class="cpp-number">29</span>;
 
<span class="cpp-keyword">float</span> down = <span class="cpp-number">5</span>;
<span class="cpp-keyword">int</span> ballposition = <span class="cpp-number">400</span>;
<span class="cpp-keyword">int</span> up = -<span class="cpp-number">5</span>;
<span class="cpp-keyword">int</span> ballnum = <span class="cpp-number">3</span>;
<span class="cpp-keyword">int</span> direct = down;
<span class="cpp-keyword">int</span> GAMEOVER = <span class="cpp-number">0</span>;
<span class="cpp-keyword">char</span> gameover[<span class="cpp-number">64</span>] = <span class="cpp-literal">"GAME OVER"</span>;
<span class="cpp-keyword">bool</span> pause = <span class="cpp-keyword">false</span>;

</pre></div><!–ENDSCRIPT–> 
____________________________"This just in, 9 out of 10 americans agree that 1 out of 10 americans will disagree with the other 9"- Colin Mochrie
Advertisement
In my Tetris game I did something like this:
enum GAMESTATE{    Playing = 0,    BlinkLine = 1    Paused = 2,    GameOver = 3};


Then, when I reached the point where it went game over, I did this:
m_GameState = GameOver;


For me you had to use the menu before you could restart playing, but in this case, you can do it like this:
switch (m_GameState){    case Playing:        NormalChecks();        break;    case Paused:        if (KeyPressed(P))            Pause(FALSE);        break;    case GameOver:        if (KeyPressed(F2))            NewGame();        break;}


Toolmaker

Using switch statements is a way to go, but I personally prefer function pointers to regulate my games. Basically I have a some code like:
-------------------
int (*Game_Stage) ();// <--this is a function pointerint Game_Init();int Game_Main();int Game_Over();...int main(){Game_Stage = Game_Init;while(Game_Stage() );//keeps running the current game stagereturn 0;}...//its time to go to the game over stageGame_Stage = Game_Over;//next time we enter main(), Game_Over will be run until the Game_Stage is switched...//user press that F2 key, well lets go back to the main gameif( F2 )  Game_Stage = Game_Main;//now, keep running the main game

Function pointers Look complex, but they are actually pretty easy. This way, you don't need to add an extra case to a switch statement for every new stage.
Quote:
void GameCycle (){    if (ballnum == 0)    GAMEOVER = 1;     if(ballposition < 0 +12)    {        direct = down;    };

and so forth...

There's your problem - even after you set the GAMEOVER = 1 it's still going through all your update procedures.

So even after you lose, its still going. You should put exit the function if the game is no longer going, but still render to the screen. That way, you get a "freeze frame".

And even though you didn't ask for advice... I'd suggest the same thing as Toolmaker - a gamestate flag. It makes life easier.

Mushu - trying to help those he doesn't know, with things he doesn't know.
Why won't he just go away? An question the universe may never have an answer to...
sence this is still an active thread and i dont feel like cluttering up the board how come when i call

switch (VIEW)
{
case 1:
{
if (show != false)
{
while(GetAsyncKeyState(VK_ESCAPE) >= 0 && GAMEOVER != TRUE)
{
wsprintf(HISCORE, "%d", hiscore);
DrawText(hDC, HISCORE , -1, &rect5, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
DrawText(hDC, szHighScore, -1, &rect6, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
if(GetAsyncKeyState(VK_SPACE) < 1)
{
show = false;
break;
}
};
}
};
};

it wont show at all but when i take show = false ou of the if state ment then it works i dont get it though because show only = false if i press the space key right or am i going about this wrong

____________________________"This just in, 9 out of 10 americans agree that 1 out of 10 americans will disagree with the other 9"- Colin Mochrie
Well, haven´t really used GetAsyncKeyState() rather than recently tested it and for me it looks like the return value will be 0, if the key haven´t been pressed and that would mean that this statement will be always true:

if(GetAsyncKeyState(VK_SPACE) < 1)
{
show = false;
break;
}

and that could be the reason why you never will see the stuff when you have "show = false" line included (in this case, the stuff inside the while-loop will be run only ones).

And I could imagine that the reason why without the line (show = false) you will see the stuff is that the code you showed will be looped through every frame and because you won´t do any changes that would prevent the while loop from working, the code will be ran every frame.

So, possibly by changing the if statement to something like this could lead to better result:

if(GetAsyncKeyState(VK_SPACE) != 0)
{
show = false;
break;
}
ACtually,to be exact, GetAsyncKeyState works like this:

if (GetAsyncKeyState(VK_ESCAPE) >> 8){    // Escape Pressed}


Toolmaker

This topic is closed to new replies.

Advertisement