Help Animating Pacman
Hi, Im finished the book Windows Game Programming for Dummies(Andre Lamothe). Im trying to create pacman clone and my first step is animating pacman. It compiles and builds error-free and ive included all the necessary files but nothing shows up in my program and i know theres something wrong. I dont care about collision or nothing as long as i can get him on the screen with the maze background ill be happy. Heres the fairly long source using his engine. Ignore the comments, as im just tweaking his skelaton animation program.
// Pacman.cpp - The actual game
// INCLUES //////////////////////////
#define WIN32_LEAN_AND_MEAN
#define INITGUID
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include // directdraw header file
#include // direct input header file
#include "gpdumb1.h" // the engine
// DEFINES///////////////////////////////////////
#define WINDOW_CLASS_NAME "WINXCLASS"
#define WINDOW_WIDTH 64
#define WINDOW_HEIGHT 48
// directions
#define PACMAN_EAST 0
#define PACMAN_WEST 1
#define PACMAN_NORTH 2
#define PACMAN_SOUTH 3
// game console
int Game_Init(void *parms = NULL);
int Game_Shutdown(void *parms=NULL);
int Game_Main(void *parms=NULL);
// globals
HWND main_window_handle = NULL; // save the window handle
HINSTANCE main_instance = NULL; // save the instance
char buffer[80]; // used to print text
// directinput globals
LPDIRECTINPUT lpdi = NULL; // dinput object
LPDIRECTINPUTDEVICE lpdikey = NULL; // dinput keyboard
LPDIRECTINPUTDEVICE lpdimouse = NULL; // dinput mouse
LPDIRECTINPUTDEVICE lpdijoy = NULL; // dinput joystick
LPDIRECTINPUTDEVICE2 lpdijoy2 = NULL; // dinput joystick
GUID joystickGUID; // guid for main joystick
char joyname[80]; // name of joystick
// these contain the target records for all di input packets
UCHAR keyboard_state[256]; // contains keyboard state table
DIMOUSESTATE mouse_state; // contains state of mouse
DIJOYSTATE joy_state; // contains state of joystick
// demo globals
BOB pacman;
BITMAP_IMAGE maze;
// animation sequences for the bob
int pacman_anims[4][1] = {{0},
{1},
{2},
{3}, };
// FUNCTIONS //////////////////////////////////////////////
LRESULT CALLBACK WindowProc(HWND hwnd,
UINT msg,
WPARAM wparam,
LPARAM lparam)
{
// this is the main message handler of the system
PAINTSTRUCT ps; // used in WM_PAINT
HDC hdc; // handle to a device context
// what is the message
switch(msg)
{
case WM_CREATE:
{
// do initialization stuff here
return(0);
} break;
case WM_PAINT:
{
// start painting
hdc = BeginPaint(hwnd,&ps);
// end painting
EndPaint(hwnd,&ps);
return(0);
} break;
case WM_DESTROY:
{
// kill the application
PostQuitMessage(0);
return(0);
} break;
default:break;
} // end switch
// process any messages that we didn''t take care of
return (DefWindowProc(hwnd, msg, wparam, lparam));
} // end WinProc
// WINMAIN ////////////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hinstance,
HINSTANCE hprevinstance,
LPSTR lpcmdline,
int ncmdshow)
{
// this is the winmain function
WNDCLASS winclass; // this will hold the class we create
HWND hwnd; // generic window handle
MSG msg; // generic message
HDC hdc; // generic dc
PAINTSTRUCT ps; // generic paintstruct
// first fill in the window class stucture
winclass.style = CS_DBLCLKS | CS_OWNDC |
CS_HREDRAW | CS_VREDRAW;
winclass.lpfnWndProc = WindowProc;
winclass.cbClsExtra = 0;
winclass.cbWndExtra = 0;
winclass.hInstance = hinstance;
winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
winclass.lpszMenuName = NULL;
winclass.lpszClassName = WINDOW_CLASS_NAME;
// register the window class
if (!RegisterClass(&winclass))
return(0);
// create the window, note the use of WS_POPUP
if (!(hwnd = CreateWindow(WINDOW_CLASS_NAME, // class
"WinX Game Console", // title
WS_POPUP | WS_VISIBLE,
0,0, // x,y
WINDOW_WIDTH, // width
WINDOW_HEIGHT, // height
NULL, // handle to parent
NULL, // handle to menu
hinstance,// instance
NULL))) // creation parms
return(0);
// save the window handle and instance in a global
main_window_handle = hwnd;
main_instance = hinstance;
// perform all game console specific initialization
Game_Init();
// enter main event loop
while(1)
{
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
// send the message to the window proc
DispatchMessage(&msg);
} // end if
// main game processing goes here
Game_Main();
} // end while
// shutdown game and release all resources
Game_Shutdown();
// return to Windows like this
return(msg.wParam);
} // end WinMain
///////////////////////////////////////////////////////////
int Game_Init(void *parms)
{
int index; // looping var
char filename[80]; // used to build up file names
// initialize directdraw
DD_Init(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP);
// first create the direct input object
if (DirectInputCreate(main_instance,DIRECTINPUT_VERSION,&lpdi,NULL)!=DI_OK)
return(0);
// create a keyboard device //////////////////////////////////
if (lpdi->CreateDevice(GUID_SysKeyboard, &lpdikey, NULL)!=DI_OK)
return(0);
// set cooperation level
if (lpdikey->SetCooperativeLevel(main_window_handle,
DISCL_NONEXCLUSIVE | DISCL_BACKGROUND)!=DI_OK)
return(0);
// set data format
if (lpdikey->SetDataFormat(&c_dfDIKeyboard)!=DI_OK)
return(0);
// acquire the keyboard
if (lpdikey->Acquire()!=DI_OK)
return(0);
// load background
Load_Bitmap_File(&bitmap8bit, "ANDRE9.BMP");
Set_Palette(bitmap8bit.palette);
// create and load the reactor bitmap image
Create_Bitmap(&maze,0,0,640,480);
Load_Image_Bitmap(&maze, &bitmap8bit, 0,0,BITMAP_EXTRACT_MODE_ABS);
Unload_Bitmap_File(&bitmap8bit);
// create pacman
if (!(Create_BOB(&pacman,0,0,46,62,22,
BOB_ATTR_VISIBLE | BOB_ATTR_MULTI_ANIM, DDSCAPS_SYSTEMMEMORY)))
return(0);
for (int direction = 0; direction < 8; direction++)
{
// build up file name
sprintf(filename,"PACMEN.BMP",direction);
// load in new bitmap file
Load_Bitmap_File(&bitmap8bit,filename);
Load_Frame_BOB(&pacman,&bitmap8bit,0+direction*4,0,0,BITMAP_EXTRACT_MODE_CELL);
Load_Frame_BOB(&pacman,&bitmap8bit,1+direction*4,1,0,BITMAP_EXTRACT_MODE_CELL);
Load_Frame_BOB(&pacman,&bitmap8bit,2+direction*4,2,0,BITMAP_EXTRACT_MODE_CELL);
Load_Frame_BOB(&pacman,&bitmap8bit,3+direction*4,0,1,BITMAP_EXTRACT_MODE_CELL);
// unload the bitmap file
Unload_Bitmap_File(&bitmap8bit);
// set the animation sequences for skelaton
Load_Animation_BOB(&pacman,direction,2,pacman_anims[direction]);
} // end for direction
// set up stating state of skelaton
Set_Animation_BOB(&pacman, 0);
Set_Anim_Speed_BOB(&pacman, 4);
Set_Vel_BOB(&pacman, 0,0);
Set_Pos_BOB(&pacman, 0, 128);
// set clipping rectangle to screen extents so mouse cursor
// doens''t mess up at edges
RECT screen_rect = {0,0,screen_width,screen_height};
lpddclipper = DD_Attach_Clipper(lpddsback,1,&screen_rect);
// hide the mouse
ShowCursor(FALSE);
// return success
return(1);
} // end Game_Init
///////////////////////////////////////////////////////////
int Game_Shutdown(void *parms)
{
// this function is where you shutdown your game and
// release all resources that you allocated
// kill the reactor
Destroy_Bitmap(&maze);
// kill skelaton
Destroy_BOB(&pacman);
// release keyboard
lpdikey->Unacquire();
lpdikey->Release();
lpdi->Release();
// shutdonw directdraw
DD_Shutdown();
// return success
return(1);
} // end Game_Shutdown
///////////////////////////////////////////////////////////
int Game_Main(void *parms)
{
// this is the workhorse of your game it will be called
// continuously in real-time this is like main() in C
// all the calls for you game go here!
int index; // looping var
int dx,dy; // general deltas used in collision detection
static int player_moving = 0; // tracks player motion
static PALETTEENTRY glow = {0,0,0,PC_NOCOLLAPSE}; // used to animation red border
// check of user is trying to exit
if (KEY_DOWN(VK_ESCAPE) || KEY_DOWN(VK_SPACE))
PostMessage(main_window_handle, WM_DESTROY,0,0);
// start the timing clock
Start_Clock();
// clear the drawing surface
DD_Fill_Surface(lpddsback, 0);
// lock the back buffer
DD_Lock_Back_Surface();
// draw the background reactor image
Draw_Bitmap(&maze, back_buffer, back_lpitch, 0);
// unlock the back buffer
DD_Unlock_Back_Surface();
// get player input
// get the keyboard data
lpdikey->GetDeviceState(256, (LPVOID)keyboard_state);
// reset motion flag
player_moving = 0;
if (keyboard_state[DIK_RIGHT])
{
// move skelaton
pacman.x+=2;
dx=2; dy=0;
// set motion flag
player_moving = 1;
// check animation needs to change
if (pacman.curr_animation != PACMAN_EAST)
Set_Animation_BOB(&pacman,PACMAN_EAST);
} // end if
else
if (keyboard_state[DIK_LEFT])
{
// move skelaton
pacman.x-=2;
dx=-2; dy=0;
// set motion flag
player_moving = 1;
// check animation needs to change
if (pacman.curr_animation != PACMAN_WEST)
Set_Animation_BOB(&pacman,PACMAN_WEST);
} // end if
else
if (keyboard_state[DIK_UP])
{
// move skelaton
pacman.y-=2;
dx=0; dy=-2;
// set motion flag
player_moving = 1;
// check animation needs to change
if (pacman.curr_animation != PACMAN_NORTH)
Set_Animation_BOB(&pacman,PACMAN_NORTH);
} // end if
else
if (keyboard_state[DIK_DOWN])
{
// move skelaton
pacman.y+=2;
dx=0; dy=+2;
// set motion flag
player_moving = 1;
// check animation needs to change
if (pacman.curr_animation != PACMAN_SOUTH)
Set_Animation_BOB(&pacman,PACMAN_SOUTH);
} // end if
// only animate if player is moving
if (player_moving)
{
// animate skelaton
Animate_BOB(&pacman);
// see if skelaton hit a wall
// lock surface, so we can scan it
DD_Lock_Back_Surface();
// done, so unlock
DD_Unlock_Back_Surface();
} // end if
// draw the skelaton
Draw_BOB(&pacman, lpddsback);
// flip the surfaces
DD_Flip();
// sync to 3o fps
Wait_Clock(30);
// return success
return(1);
} // end Game_Main
//////////////////////////////////////////////////////////
Any help would be greatly appreciated.
Try to narrow down the problem yourself. Take out everything except creating the window, and a blitting and flipping loop.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement