home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 2000 May / PCP163A.iso / Runimage / Cbuilder4 / Examples / Games / EarthPng / EP.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1999-01-26  |  6.9 KB  |  231 lines

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4.  
  5. #include "EP.h"
  6. //---------------------------------------------------------------------------
  7. #pragma package(smart_init)
  8. #pragma resource "*.dfm"
  9. TForm1 *Form1;
  10. //---------------------------------------------------------------------------
  11. __fastcall TForm1::TForm1(TComponent* Owner)
  12.     : TForm(Owner)
  13. {
  14.     //Assign idle time function
  15.     Application->OnIdle = IdleLoop;
  16.  
  17.     if(Application->MessageBox("Would you like to play with Earth?", "Hello Earthling", MB_OKCANCEL) == IDOK)
  18.     {
  19.         //load sound effect
  20.         sndPlaySound("Utopia Default.wav", SND_ASYNC | SND_FILENAME);
  21.           x = 0;
  22.         y = 0;
  23.         GameOver = false;
  24.     ShowCursor(false);
  25.         
  26.     }
  27.     else
  28.         Application->Terminate();
  29.  
  30. }
  31. //---------------------------------------------------------------------------
  32.  
  33.  
  34. void __fastcall TForm1::IdleLoop(TObject*, bool &done)
  35. {
  36.     //keeps loop going
  37.      done = false;
  38.     //slows down action
  39.     ::Sleep(1);
  40.  
  41.     changeRect = spriteRect;
  42.     spriteRect.Left = x;
  43.     spriteRect.Top = y;
  44.     spriteRect.Right = x + spriteImage->Picture->Width;
  45.     spriteRect.Bottom = y + spriteImage->Picture->Height;
  46.  
  47.     workCanvas->CopyRect(paddleRect, backgroundCanvas, paddleRect);
  48.  
  49.     changePaddleRect = paddleRect;
  50.     paddleRect.Left = paddleCenter - ((paddle->Picture->Width)/2);
  51.     paddleX = paddleRect.Left;
  52.     paddleRect.Top = paddleY;
  53.     paddleRect.Right = paddleX + paddle->Picture->Width;
  54.     paddleRect.Bottom = paddleY + paddle->Picture->Height;
  55.  
  56.     {
  57.         int SideDef = changeRect.Left - spriteRect.Left;
  58.         // If SideDiff < 0 the paddle is to the right
  59.         if(SideDef < 0) {
  60.             changeRect.Right = spriteRect.Right;
  61.         }
  62.         else {
  63.             changeRect.Left = spriteRect.Left;
  64.         }
  65.  
  66.         int TopDef = changeRect.Top - spriteRect.Top;
  67.         // If SideDiff < 0 the paddle is to the Down
  68.         if(TopDef < 0) {
  69.             changeRect.Bottom = spriteRect.Bottom;
  70.         }
  71.         else {
  72.             changeRect.Top = spriteRect.Top;
  73.         }
  74.     }
  75.  
  76.     workCanvas->CopyRect(spriteRect, backgroundCanvas, spriteRect);
  77.  
  78.  
  79.     //ChangeRectCalcs
  80.     if (y <= 0)
  81.     {
  82.         yDir = 5;
  83.     }
  84.     if (y >= ClientHeight - 16)
  85.     {
  86.         GameOver = true;
  87.         ::SetCursor((HCURSOR)IDC_ARROW);
  88.         ShowCursor(true);
  89.         int choice = MessageBox(Handle, "You lost Earth", "Try Again?", MB_RETRYCANCEL);
  90.         if(choice == IDRETRY)
  91.         {
  92.             x = 0;
  93.             y = 0;
  94.             ShowCursor(false);
  95.  
  96.         }
  97.         else
  98.             Form1->Close();
  99.     }
  100.  
  101.     if ((spriteRect.Bottom - 16) >= (paddleRect.Top) &&
  102.             (spriteRect.Bottom - 16) <= (paddleRect.Top + 5) &&
  103.                 (spriteRect.Right) >= (paddleRect.Left) &&
  104.                     (spriteRect.Left) <= (paddleRect.Right))
  105.     {
  106.         yDir = -5;
  107.         sndPlaySound("Utopia Default.wav", SND_ASYNC | SND_FILENAME);
  108.     }
  109.  
  110.     if (x <= 0)
  111.     {
  112.         xDir = 5;
  113.     }
  114.  
  115.     if(x >= ClientWidth - 16)
  116.     {
  117.         xDir = -5;
  118.     }
  119.  
  120.     x += xDir;
  121.     y += yDir;
  122.  
  123.     int PaddleDifference = changePaddleRect.Left - paddleRect.Left;
  124.     // If PaddleDiff < 0 the paddle is to the right
  125.     if(PaddleDifference < 0) {
  126.         changePaddleRect.Right = paddleRect.Right;
  127.     }
  128.     else {
  129.         changePaddleRect.Left = paddleRect.Left;
  130.     }
  131.  
  132.     //Perform dirty rectangle animation on memory and Form canvas
  133.     workCanvas->Draw(x, y, spriteImage->Picture->Icon);
  134.     workCanvas->Draw(paddleX, paddleY, paddle->Picture->Icon);
  135.     RealizePalette(backgroundCanvas->Handle);
  136.     RealizePalette(workCanvas->Handle);
  137.     Canvas->CopyRect(changeRect, workCanvas, changeRect);
  138.     Canvas->CopyRect(changePaddleRect, workCanvas, changePaddleRect);
  139. }
  140.  
  141. //---------------------------------------------------------------------------
  142. void __fastcall TForm1::FormPaint(TObject *Sender)
  143. {
  144.     RealizePalette(backgroundCanvas->Handle);
  145.     RealizePalette(workCanvas->Handle);
  146.     Canvas->CopyRect(backgroundRect, workCanvas, backgroundRect);
  147. }
  148. //---------------------------------------------------------------------------
  149. void __fastcall TForm1::FormActivate(TObject *Sender)
  150. {
  151.     backgroundImage = new TImage(Owner);
  152.     spriteImage = new TImage(Owner);
  153.     paddle = new TImage(Owner);
  154.     workCanvas = new TCanvas;
  155.     backgroundCanvas = new TCanvas;
  156.  
  157.     Angle = 1;
  158.  
  159.     spriteImage->
  160.         Picture->LoadFromFile("Earth.ico");
  161.     backgroundImage->
  162.         Picture->LoadFromFile("androm.bmp");
  163.     paddle->
  164.         Picture->LoadFromFile("paddle.ico");
  165.  
  166.     WindowState = wsMaximized;
  167.  
  168.     backgroundRect.Top = 0;
  169.     backgroundRect.Left = 0;
  170.     backgroundRect.Right =  ClientWidth;
  171.     backgroundRect.Bottom =  ClientHeight;
  172.  
  173.  
  174.     spriteRect.Top = 0;
  175.     spriteRect.Left = 0;
  176.     spriteRect.Right = spriteImage->Picture->Width;
  177.     spriteRect.Bottom = spriteImage->Picture->Height;
  178.  
  179.     //Set up backgroundCanvas
  180.     HDC backgrounddc = CreateCompatibleDC(Canvas->Handle);
  181.     HBITMAP  bkbmp = CreateCompatibleBitmap(Canvas->Handle, ClientWidth, ClientHeight);
  182.     SelectObject(backgrounddc, bkbmp);
  183.     SelectPalette(backgrounddc, backgroundImage->Picture->Bitmap->Palette, false);
  184.     backgroundCanvas->Handle = backgrounddc;
  185.     backgroundCanvas->StretchDraw( backgroundRect, backgroundImage->Picture->Bitmap);
  186.  
  187.  
  188.     //Set up workCanvas
  189.     HDC workdc = CreateCompatibleDC(Canvas->Handle);
  190.     HBITMAP  bmp = CreateCompatibleBitmap(Canvas->Handle, ClientWidth, ClientHeight);
  191.     SelectObject(workdc, bmp);
  192.     SelectPalette(workdc, backgroundImage->Picture->Bitmap->Palette, false);
  193.     workCanvas->Handle = workdc;
  194.     workCanvas->CopyRect(backgroundRect,  backgroundCanvas, backgroundRect);
  195.     workCanvas->Draw( 0, 0, spriteImage->Picture->Icon);
  196.     paddleX = ClientWidth / 2;
  197.     paddleY = ClientHeight - 50;
  198.     workCanvas->Draw( paddleX, paddleY, paddle->Picture->Icon);
  199.  
  200.     paddleRect.Left = paddleX - paddle->Width;
  201.     paddleRect.Right = paddleX + paddle->Width;
  202.     paddleRect.Top    = paddleY;
  203.     paddleRect.Bottom = paddleY + paddle->Height;
  204.  
  205.  
  206.     RealizePalette(backgroundCanvas->Handle);
  207.     RealizePalette(workCanvas->Handle);
  208.     Canvas->CopyRect(backgroundRect, workCanvas, backgroundRect);
  209. }
  210. //---------------------------------------------------------------------------
  211. void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift, int X,
  212.     int Y)
  213. {
  214.     //Animates and moves paddle
  215.     paddleCenter = X;
  216.     if(paddleCenter < paddle->Picture->Width/2)
  217.         paddleCenter = paddle->Picture->Width/2;
  218.     if(paddleCenter > ClientWidth - (paddle->Picture->Width/2))
  219.         paddleCenter = ClientWidth - (paddle->Picture->Width/2);
  220. }
  221.  
  222. void __fastcall TForm1::SetCursor(TMessage &) {
  223.     //Hides Cursor
  224.         if(!GameOver)
  225.         {
  226.     ::SetCursor(NULL);
  227.         }
  228. }
  229. //---------------------------------------------------------------------------
  230.  
  231.