www.pudn.com > T3D-3.rar > demoII3_1.cpp
// DEMOII3_1.CPP windowed mode demo based on // artificial intelligence pattern demo from Volume I // to compile make sure to include DDRAW.LIB, DSOUND.LIB, // DINPUT.LIB, WINMM.LIB, and of course // T3DLIB1.CPP,T3DLIB2.CPP,T3DLIB3.CPP // and only run app if desktop is in 16-bit color mode // INCLUDES /////////////////////////////////////////////// #define INITGUID #define WIN32_LEAN_AND_MEAN #include// include important windows stuff #include #include #include // include important C/C++ stuff #include #include #include #include #include #include #include #include #include #include #include // directX includes #include #include #include #include #include #include #include "T3DLIB1.h" // game library includes #include "T3DLIB2.h" #include "T3DLIB3.h" // DEFINES //////////////////////////////////////////////// // defines for windows #define WINDOW_CLASS_NAME "WINXCLASS" // class name // setup a 640x480 16-bit windowed mode example #define WINDOW_TITLE "16-Bit Pattern Demo" #define WINDOW_WIDTH 640 // size of window #define WINDOW_HEIGHT 480 #define WINDOW_BPP 16 // bitdepth of window (8,16,24 etc.) // note: if windowed and not // fullscreen then bitdepth must // be same as system bitdepth // also if 8-bit the a pallete // is created and attached #define WINDOWED_APP 1 // 0 not windowed, 1 windowed #define NUM_PATTERNS 4 // number of patterns in system // pattern instruction opcodes for bot // directional instructions #define OPC_E 0 // move west #define OPC_NE 1 // move northeast #define OPC_N 2 // move north #define OPC_NW 3 // move northwest #define OPC_W 4 // move west #define OPC_SW 5 // move southwest #define OPC_S 6 // move south #define OPC_SE 7 // move southeast // special instructions #define OPC_STOP 8 // stop for a moment #define OPC_RAND 9 // select a random direction #define OPC_END -1 // end pattern // PROTOTYPES ///////////////////////////////////////////// // 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 BITMAP_IMAGE background_bmp; // holds the background BOB bot; // the demo robot ship // patterns in opcode operand format int pattern_1[] = {OPC_W, 10, OPC_NW, 10, OPC_N, 10, OPC_NE, 10, OPC_E, 10, OPC_SE, 10, OPC_S, 10, OPC_SW, 10, OPC_W, 10, OPC_RAND, 10, OPC_W, 20, OPC_NW, 10, OPC_N, 20, OPC_NE, 10, OPC_E, 20, OPC_SE, 10, OPC_S, 20, OPC_SW, 10, OPC_W, 10, OPC_END,0}; int pattern_2[] = {OPC_E, 20, OPC_W, 20, OPC_STOP, 20, OPC_NE, 10, OPC_W, 10, OPC_NW, 10, OPC_SW, 20, OPC_NW, 20, OPC_SW, 20, OPC_NW, 30, OPC_SW, 10, OPC_S, 50, OPC_W, 2, OPC_NW, 2, OPC_N, 2, OPC_NE, 50, OPC_E,2, OPC_SE,2, OPC_S,2, OPC_RAND, 10, OPC_END,0}; int pattern_3[] = { OPC_N, 10, OPC_S, 10, OPC_N, 10, OPC_S, 10, OPC_E, 10, OPC_W, 10, OPC_E, 10, OPC_W, 10, OPC_NW, 10, OPC_N, 10, OPC_NE, 10, OPC_N, 10, OPC_STOP, 20, OPC_RAND, 5, OPC_E, 50, OPC_S, 50, OPC_W, 50, OPC_E, 10, OPC_E, 10, OPC_E, 10, OPC_NW, 100, OPC_STOP, 10, OPC_END,0}; int pattern_4[] = {OPC_W, 100, OPC_NW, 2,OPC_N, 2,OPC_NE, 2, OPC_E, 100, OPC_NE, 2,OPC_N, 2,OPC_NW, 2, OPC_W, 100, OPC_NW, 2,OPC_N, 2,OPC_NE, 2, OPC_E, 100, OPC_NE, 2,OPC_N, 2,OPC_NW, 2, OPC_W, 100, OPC_NW, 2,OPC_N, 2,OPC_NE, 2, OPC_E, 100, OPC_NE, 2,OPC_N, 2,OPC_NW, 2, OPC_RAND, 10, OPC_RAND, 5, OPC_SW, 2,OPC_S, 2,OPC_SE, 2, OPC_E, 100, OPC_SE, 2,OPC_S, 2,OPC_SW, 2, OPC_W, 100, OPC_SW, 2,OPC_S, 2,OPC_SE, 2, OPC_E, 100, OPC_SE, 2,OPC_S, 2,OPC_SW, 2, OPC_W, 100, OPC_SW, 2,OPC_S, 2,OPC_SE, 2, OPC_E, 100, OPC_SE, 2,OPC_S, 2,OPC_SW, 2, OPC_W, 100, OPC_END,0}; // master pattern array int *patterns[NUM_PATTERNS] = {pattern_1, pattern_2, pattern_3, pattern_4}; int *curr_pattern=NULL; // current pattern being processed int bot_ip =0, // pattern instruction pointer for bot bot_counter=0, // counter of pattern control bot_pattern_index; // the current pattern being executed // used as a index to string lookup to help print out char *opcode_names[] = {"OPC_E", "OPC_NE", "OPC_N", "OPC_NW", "OPC_W", "OPC_SW", "OPC_S", "OPC_SE", "OPC_STOP", "OPC_RAND", "OPC_END",}; // sound stuff int engines_id = -1; // engine sound id // 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 WNDCLASSEX winclass; // this will hold the class we create HWND hwnd; // generic window handle MSG msg; // generic message HDC hdc; // graphics device context // first fill in the window class stucture winclass.cbSize = sizeof(WNDCLASSEX); 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; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); // save hinstance in global main_instance = hinstance; // register the window class if (!RegisterClassEx(&winclass)) return(0); // create the window if (!(hwnd = CreateWindowEx(NULL, // extended style WINDOW_CLASS_NAME, // class WINDOW_TITLE, // title (WINDOWED_APP ? (WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION) : (WS_POPUP | WS_VISIBLE)), 0,0, // initial x,y WINDOW_WIDTH,WINDOW_HEIGHT, // initial width, height NULL, // handle to parent NULL, // handle to menu hinstance,// instance of this application NULL))) // extra creation parms return(0); // save main window handle main_window_handle = hwnd; if (WINDOWED_APP) { // now resize the window, so the client area is the actual size requested // since there may be borders and controls if this is going to be a windowed app // if the app is not windowed then it won't matter RECT window_rect = {0,0,WINDOW_WIDTH-1,WINDOW_HEIGHT-1}; // make the call to adjust window_rect AdjustWindowRectEx(&window_rect, GetWindowStyle(main_window_handle), GetMenu(main_window_handle) != NULL, GetWindowExStyle(main_window_handle)); // save the global client offsets, they are needed in DDraw_Flip() window_client_x0 = -window_rect.left; window_client_y0 = -window_rect.top; // now resize the window with a call to MoveWindow() MoveWindow(main_window_handle, 0, // x position 0, // y position window_rect.right - window_rect.left, // width window_rect.bottom - window_rect.top, // height FALSE); // show the window, so there's no garbage on first render ShowWindow(main_window_handle, SW_SHOW); } // end if windowed // 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 // T3D GAME PROGRAMMING CONSOLE FUNCTIONS //////////////// int Game_Init(void *parms) { // this function is where you do all the initialization // for your game int index; // looping variable int bot_anim[2]; // initialize directdraw, very important that in the call // to setcooperativelevel that the flag DDSCL_MULTITHREADED is used // which increases the response of directX graphics to // take the global critical section more frequently DDraw_Init(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BPP, WINDOWED_APP); // load background image Load_Bitmap_File(&bitmap16bit, "TREKB24.BMP"); Create_Bitmap(&background_bmp,0,0,640,480,16); Load_Image_Bitmap16(&background_bmp, &bitmap16bit,0,0,BITMAP_EXTRACT_MODE_ABS); Unload_Bitmap_File(&bitmap16bit); // load the bots bitmaps Load_Bitmap_File(&bitmap16bit, "BOTS24.BMP"); // create bat bob Create_BOB(&bot,320,200,116,60,16,BOB_ATTR_MULTI_ANIM | BOB_ATTR_VISIBLE, DDSCAPS_SYSTEMMEMORY,0,16); Set_Anim_Speed_BOB(&bot, 2); // load the bot in for (index=0; index < 16; index++) Load_Frame_BOB16(&bot, &bitmap16bit, index, index%2, index/2, BITMAP_EXTRACT_MODE_CELL); // unload bot Unload_Bitmap_File(&bitmap16bit); // create animations for bot for (index=0; index<8; index++) { // generate the animation on the fly bot_anim[0] = index*2; bot_anim[1] = bot_anim[0]+1; // load the generated animation Load_Animation_BOB(&bot, index, 2, bot_anim); } // end for index // set the animation to right direction Set_Animation_BOB(&bot,0); // initialize directinput DInput_Init(); // acquire the keyboard only DInput_Init_Keyboard(); // initilize DirectSound DSound_Init(); // load background sounds engines_id = DSound_Load_WAV("ENGINES.WAV"); // start the sounds DSound_Play(engines_id, DSBPLAY_LOOPING); // hide the mouse if (!WINDOWED_APP) ShowCursor(FALSE); // seed random number generate srand(Start_Clock()); // 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 // shut everything down // kill all the bobs Destroy_BOB(&bot); // shutdown directdraw last DDraw_Shutdown(); // now directsound DSound_Stop_All_Sounds(); DSound_Shutdown(); // shut down directinput DInput_Shutdown(); // return success return(1); } // end Game_Shutdown ////////////////////////////////////////////////////////// void Bot_AI(void) { // this function controls the ai of the bot and the pattern // processing static int opcode, // current pattern opcode operand; // current operand // test if it's time to process a new instruction if (curr_pattern==NULL) { // select a random pattern in pattern bank bot_pattern_index = rand()%NUM_PATTERNS; curr_pattern = patterns[bot_pattern_index]; // now reset instuction pointer bot_ip = 0; // reset counter bot_counter = 0; } // end if // process next instruction if it's time if (--bot_counter <= 0) { // get next instruction opcode = curr_pattern[bot_ip++]; operand = curr_pattern[bot_ip++]; // test what the opcode is switch(opcode) { case OPC_E: { // set direction to east Set_Vel_BOB(&bot,6,0); // set animation to east Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_NE: { // set direction to northeast Set_Vel_BOB(&bot,6,-6); // set animation to northeast Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_N: { // set direction to north Set_Vel_BOB(&bot,0,-6); // set animation to north Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_NW: { // set direction to northwest Set_Vel_BOB(&bot,-6,-6); // set animation to northwest Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_W: { // set direction to west Set_Vel_BOB(&bot,-6,0); // set animation to west Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_SW: { // set direction to southwest Set_Vel_BOB(&bot,-6,6); // set animation to southwest Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_S: { // set direction to south Set_Vel_BOB(&bot,0,6); // set animation to south Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_SE: { // set direction to southeast Set_Vel_BOB(&bot,6,6); // set animation to southeast Set_Animation_BOB(&bot,opcode); // set counter to instuction operand bot_counter = operand; } break; case OPC_STOP: { // stop motion Set_Vel_BOB(&bot,0,0); // set counter to instuction operand bot_counter = operand; } break; case OPC_RAND: { // set direction randomly Set_Vel_BOB(&bot,-4+rand()%9,-4+rand()%9); // set animation to south Set_Animation_BOB(&bot,OPC_S); // set counter to instuction operand bot_counter = operand; } break; case OPC_END: { // stop motion Set_Vel_BOB(&bot,0,0); // select a random pattern in pattern bank bot_pattern_index = rand()%NUM_PATTERNS; curr_pattern = patterns[bot_pattern_index]; // now reset instuction pointer bot_ip = 0; // reset counter bot_counter = 0; } break; default: break; } // end switch } // end if // draw stats sprintf(buffer,"Pattern #%d",bot_pattern_index); Draw_Text_GDI(buffer,10, 400,RGB(0,255,0), lpddsback); sprintf(buffer,"Opcode=%s Operand=%d",opcode_names[opcode],operand); Draw_Text_GDI(buffer,10, 416,RGB(0,255,0), lpddsback); sprintf(buffer,"Instruction Ptr=%d ", bot_ip); Draw_Text_GDI(buffer,10, 432,RGB(0,255,0), lpddsback); sprintf(buffer,"Counter=%d ", bot_counter); Draw_Text_GDI(buffer,10, 448,RGB(0,255,0), lpddsback); } // end Bot_AI ////////////////////////////////////////////////////////// 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 // start the timing clock Start_Clock(); // clear the drawing surface DDraw_Fill_Surface(lpddsback, 0); // lock back buffer and copy background into it DDraw_Lock_Back_Surface(); // draw background Draw_Bitmap16(&background_bmp, back_buffer, back_lpitch,0); // unlock back surface DDraw_Unlock_Back_Surface(); // read keyboard DInput_Read_Keyboard(); // do the ai on bot Bot_AI(); // the animate the bot Animate_BOB(&bot); // move bot Move_BOB(&bot); // test if bot is off screen, if so wrap around if (bot.x >= SCREEN_WIDTH) bot.x = -bot.width; else if (bot.x < -bot.width) bot.x = SCREEN_WIDTH; if (bot.y >= SCREEN_HEIGHT) bot.y = -bot.height; else if (bot.y < -bot.height) bot.y = SCREEN_HEIGHT; // draw the bot Draw_BOB16(&bot, lpddsback); // draw title Draw_Text_GDI("(16-Bit Version) I-ROBOT 3D - Pattern Demo",10, 10,RGB(0,255,255), lpddsback); // flip the surfaces DDraw_Flip(); // sync to 30ish fps Wait_Clock(30); // check of user is trying to exit if (KEY_DOWN(VK_ESCAPE) || keyboard_state[DIK_ESCAPE]) { PostMessage(main_window_handle, WM_DESTROY,0,0); // stop all sounds DSound_Stop_All_Sounds(); } // end if // return success return(1); } // end Game_Main //////////////////////////////////////////////////////////