delorie.com/archives/browse.cgi   search  
Mail Archives: djgpp/2000/07/08/09:33:38

From: "K Morrison" <kevin DOT morrison AT xtra DOT co DOT nz>
Newsgroups: comp.os.msdos.djgpp
Subject: Allegro game souce code
Lines: 355
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 5.00.2919.6600
X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6600
Message-ID: <3KC95.603$gho7.5570823@news.xtra.co.nz>
Date: Sat, 8 Jul 2000 21:45:44 +1200
NNTP-Posting-Host: 210.55.34.81
X-Complaints-To: newsadmin AT xtra DOT co DOT nz
X-Trace: news.xtra.co.nz 963049471 210.55.34.81 (Sat, 08 Jul 2000 21:44:31 NZST)
NNTP-Posting-Date: Sat, 08 Jul 2000 21:44:31 NZST
Organization: Xtra
To: djgpp AT delorie DOT com
DJ-Gateway: from newsgroup comp.os.msdos.djgpp
Reply-To: djgpp AT delorie DOT com

I was working on my first program and I have decided nto stop work on the
project and start on something more complex. Thus I am posting my source
code so someone else might wish to borrow my code as crappy as it may be ,
but hey you gotta start somewhere right :P


/*
 *    Game program for the Allegro library, by Kevin Morrison.
 *
 *
 */


#include <stdlib.h>
#include <stdio.h>

#include "allegro.h"

// Globals and Types
const int BOX_SIZE = 12;
const int BOX_SPEED = 100;
int BOX_COLOR = 3;

enum DIRECTION { STOPPED, UP, DOWN, LEFT, RIGHT };

enum MAP_OBJ { EMPTY, WALL , PICKUP_01 };
MAP_OBJ map [50][50];

BITMAP *buffer;

// ProtoTypes
void init_map (void);
void draw_arena (void);
void draw_map (void);

// QUAZAR class declaration
class Quazar
{
public:
  // Constructors
  Quazar ():x(15), y(15), dx(1), dy(0), itsDirection(RIGHT),
itsSpeed(BOX_SPEED){}
  Quazar (int x_position, int y_position, int speed, DIRECTION a_direction);
  ~Quazar (){}

  // Accessors
  void setx (int atx){ x = atx; }
  void sety (int aty){ y = aty; }
  void setxy (int atx, int aty){ x = atx; y = aty; }
  void setdirection (DIRECTION a_direction){ itsDirection = a_direction; }
  void setspeed (int speed){ itsSpeed = speed; }
  int getx (){ return x; }
  int gety (){ return y; }
  int getsx (){ return sx; }
  int getsy (){ return sy; }
  int getdx (){ return dx; }
  int getdy (){ return dy; }
  DIRECTION getdirection (){ return itsDirection; }
  int getspeed (){ return itsSpeed; }

  // Other Methods
  void draw (void);
  void change_direction (DIRECTION a_direction);
  void move (void);

private:

  // Data
  int x, y;                 // map x,y coordinates
  int sx, sy;               // relative screen coordinates of x, y
  int itsSpeed;             // delay in milliseconds
  DIRECTION itsDirection;   // direction object is travelling
  int dx, dy;               //
};

Quazar::Quazar (int x_pos, int y_pos, int speed, DIRECTION a_direction)
{
  x = x_pos;
  y = y_pos;
  itsSpeed = speed;
  itsDirection = a_direction;
  dx = 0;
  dy = 0;
}

void Quazar::draw ()
{

  // convert map x y to screen coordinates.
  sx = (x + 2) * (BOX_SIZE + 1);
  sy = (y + 2) * (BOX_SIZE + 1);



  rectfill (buffer, sx, sy, sx + BOX_SIZE, sy + BOX_SIZE, BOX_COLOR);
}


void Quazar::change_direction (DIRECTION a_direction)
{

  // making sure you cant move backwards
  if ((itsDirection == UP) && (a_direction == DOWN))
    a_direction = UP;
  else if ((itsDirection == DOWN) && (a_direction == UP))
    a_direction = DOWN;
  else if ((itsDirection == LEFT) && (a_direction == RIGHT))
    a_direction = LEFT;
  else if ((itsDirection == RIGHT) && (a_direction == LEFT))
    a_direction = RIGHT;


  // set new direction and
  // reset dx and dy given the direction
  itsDirection = a_direction;
  switch (itsDirection)
  {
    case UP: { dx = 0; dy = -1; }
             break;
    case DOWN: { dx = 0; dy = 1; }
               break;
    case LEFT: { dx = -1; dy = 0; }
               break;
    case RIGHT: { dx = 1; dy = 0; };
                break;
    case STOPPED: { dx = 0; dy = 0; }
    default: break;
  } // end switch
}


void Quazar::move ()
{
  char debug_message[20];
  DIRECTION newdirection;

   // decide which way to move if x y is about to hit wall
   // defaults to moving clock wise .
   if ( map[x+dx][y+dy] == WALL )
     {
       if ( (itsDirection == UP) || (itsDirection == DOWN) )
         {
          //  newdirection = RIGHT;
            for (int lx = (x - 1); lx >= (x - 15); lx-- )
                if ( (lx >= 0) && (map[lx][y] == WALL) )
                  {
                    newdirection = RIGHT;
                    break;
                  }

            for (int rx = (x + 1); rx <= (x + 15); rx++ )
                if ( (rx <= 50) && (map[rx][y] == WALL) )
                  {
                     newdirection = LEFT;
                     break;
                  }

            change_direction (newdirection);

         }
       else if ( (itsDirection == RIGHT) || (itsDirection == LEFT) )
              {
                if (map[x][y-1] == WALL)
                  change_direction (DOWN);
                else if (map[x][y+1] == WALL)
                       change_direction (UP);
                else
                  change_direction (DOWN);
              }


      sprintf (debug_message, "on wall      ");
    }

  // if walls surround x y then game over
  if ( (map[x-1][y] == WALL) && (map[x+1][y] == WALL) &&
       (map[x][y-1] == WALL) && (map[x][y+1] == WALL) )
     { itsDirection = STOPPED; dx = 0; dy = 0; BOX_COLOR = 8; }

  // increase x and y by the direction
  x = x + dx;
  y = y + dy;


  // check to see if collision with wall
  if ( map[x][y] == EMPTY )
     sprintf (debug_message, "empty        ");


  // check to see if collision with pick up item
  if ( map[x][y] == PICKUP_01 )
     sprintf (debug_message, "pickup  01  ");


  // display message.. for debug purposes
  textout (buffer, font, debug_message, 10, 400, 1);


  // update map with wall
  map[x][y] = WALL;


}
// MAIN PROGRAM CODE *******

int main (int argc, char **argv)
{
   PALETTE pal;
   char buf[64];

   allegro_init ();
   install_keyboard ();
   install_timer ();

   if (argc > 1)
   {
     if (set_gfx_mode (GFX_VGA, 320, 200, 0, 0) != 0)
     {
       printf ("error setting VGA 320x200x256\n");
       return 1;
     }
   }
   else
   {
     if (set_gfx_mode (GFX_AUTODETECT, 640, 480, 0, 0) != 0)
     {
       printf ("error setting SVGA 640x480x256\nTry giving a parameter to
set 320x200x256 mode\n");
       return 1;
     }
   }

   // create palette
   pal = desktop_palette;
   pal[0].r = pal[0].g = pal[0].b = 0;  // set 0 to black
   set_pallete (pal);

   // create bitmap to store screen output
   buffer = create_bitmap (SCREEN_W, SCREEN_H);
   clear (buffer);

   // Create Player Quazar Object
   Quazar player;


   // Init Map Array
   init_map ();
   draw_map ();

   // Draw Game Arena
   draw_arena ();

   // main keyboard input loop
   for (;;)
   {
     while (!(keypressed()))
     {

       // draw memory bitmap to screen
       rest (player.getspeed ());
       player.move ();
       player.draw ();
       vsync ();
       blit (buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);


       // *** BEGIN DEBUG
       sprintf (buf, "speed[%i] dx[%i] dy[%i] x[%i] y[%i] sx[%i] sy[%i]
",
                player.getspeed (),
                player.getdx (), player.getdy (),
                player.getx (), player.gety (),
                player.getsx (), player.getsy ());
       textout (buffer, font, buf, 10, 450, 17);
       // *** END DEBUG

     } // end of while loop

     // read in key pressed

     int a_key = readkey ();

     if ((a_key >> 8) == KEY_UP)
        player.change_direction (UP);
     else if ((a_key >> 8) == KEY_DOWN)
        player.change_direction (DOWN);
     else if ((a_key >> 8) == KEY_LEFT)
        player.change_direction (LEFT);
     else if ((a_key >> 8) == KEY_RIGHT)
        player.change_direction (RIGHT);
     else if ((a_key >> 8) == KEY_ESC)
       break;

   } // endof infinite for loop


   destroy_bitmap (buffer);
   return 0;

}  // end Main



void init_map ()
{
   // set entire map to WALL
   for (int x = 0; x <= 40; x++)
      for (int y = 0; y <= 30; y++)
         map[x][y] = WALL;

   // set playing area to EMPTY
   for (int x = 1; x <= 39; x++)
      for (int y = 1; y <= 29; y++)
      map[x][y] = EMPTY;

   for (int i = 0; i <= 5; i++)
     map [(random() % 39) + 1][(random() % 29) + 1] = PICKUP_01;

}


void draw_map ()
{
   // displays map on screen
    for (int x = 0; x <= 50; x++)
      for (int y = 0; y <= 50; y++)
        {
           if (map[x][y] == WALL)
              rectfill (buffer, (x + 2) * (BOX_SIZE + 1),
                          (y + 2) * (BOX_SIZE + 1),
                          (x + 2) * (BOX_SIZE + 1) + BOX_SIZE,
                          (y + 2) * (BOX_SIZE + 1) + BOX_SIZE, 2);
           else if (map[x][y] == PICKUP_01)
              triangle(buffer, (x + 2) * (BOX_SIZE + 1) + (BOX_SIZE/2),
                               (y + 2) * (BOX_SIZE + 1),
                               (x + 2) * (BOX_SIZE + 1),
                               (y + 2) * (BOX_SIZE + 1) + BOX_SIZE,
                               (x + 2) * (BOX_SIZE + 1) + BOX_SIZE,
                               (y + 2) * (BOX_SIZE + 1) + BOX_SIZE, 3);
        }
}


void draw_arena ()
{
   // textout (buffer, font, "Quazar 2 (c) 2000 : Written By Kevin
Morrison", 10, 10, 1);

}






- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019