Help Animating Pacman

Started by
2 comments, last by CannoN346 22 years, 7 months ago
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.
Advertisement
Try to narrow down the problem yourself. Take out everything except creating the window, and a blitting and flipping loop.
Ok, ill try that. Anything else?
Nevermind, i got it.

This topic is closed to new replies.

Advertisement