demoII8_1.cpp
上传用户:husern
上传日期:2018-01-20
资源大小:42486k
文件大小:12k
源码类别:

游戏

开发平台:

Visual C++

  1. // DEMOII8_1.CPP - texture multiplication demo 
  2. // to compile make sure to include DDRAW.LIB, DSOUND.LIB,
  3. // DINPUT.LIB, WINMM.LIB, and of course 
  4. // T3DLIB1.CPP,T3DLIB2.CPP,T3DLIB3.CPP..T3DLIB6.CPP
  5. // and only run app if desktop is in 16-bit color mode
  6. // INCLUDES ///////////////////////////////////////////////
  7. #define INITGUID
  8. #define WIN32_LEAN_AND_MEAN  
  9. #include <windows.h>   // include important windows stuff
  10. #include <windowsx.h> 
  11. #include <mmsystem.h>
  12. #include <iostream.h> // include important C/C++ stuff
  13. #include <conio.h>
  14. #include <stdlib.h>
  15. #include <malloc.h>
  16. #include <memory.h>
  17. #include <string.h>
  18. #include <stdarg.h>
  19. #include <stdio.h> 
  20. #include <math.h>
  21. #include <io.h>
  22. #include <fcntl.h>
  23. #include <ddraw.h>  // directX includes
  24. #include <dsound.h>
  25. #include <dmksctrl.h>
  26. #include <dmusici.h>
  27. #include <dmusicc.h>
  28. #include <dmusicf.h>
  29. #include <dinput.h>
  30. #include "T3DLIB1.h" // game library includes
  31. #include "T3DLIB2.h"
  32. #include "T3DLIB3.h"
  33. #include "T3DLIB4.h"
  34. #include "T3DLIB5.h"
  35. #include "T3DLIB6.h"
  36. // DEFINES ////////////////////////////////////////////////
  37. // defines for windows 
  38. #define WINDOW_CLASS_NAME "WIN3DCLASS"  // class name
  39. // setup a 640x480 16-bit windowed mode example
  40. #define WINDOW_TITLE      "T3D Graphics Console Ver 2.0"
  41. #define WINDOW_WIDTH      640   // size of window
  42. #define WINDOW_HEIGHT     480
  43. #define WINDOW_BPP        16    // bitdepth of window (8,16,24 etc.)
  44.                                 // note: if windowed and not
  45.                                 // fullscreen then bitdepth must
  46.                                 // be same as system bitdepth
  47.                                 // also if 8-bit the a pallete
  48.                                 // is created and attached
  49. #define WINDOWED_APP      1     // 0 not windowed, 1 windowed
  50. #define TEXTSIZE           128 // size of texture mxm
  51. #define NUM_TEXT           12  // number of textures
  52. // PROTOTYPES /////////////////////////////////////////////
  53. // game console
  54. int Game_Init(void *parms=NULL);
  55. int Game_Shutdown(void *parms=NULL);
  56. int Game_Main(void *parms=NULL);
  57. // GLOBALS ////////////////////////////////////////////////
  58. HWND main_window_handle           = NULL; // save the window handle
  59. HINSTANCE main_instance           = NULL; // save the instance
  60. char buffer[80];                          // used to print text
  61. BITMAP_IMAGE textures[12], // holds our texture library 
  62.              temp_text;    // temporary working texture
  63. // FUNCTIONS //////////////////////////////////////////////
  64. LRESULT CALLBACK WindowProc(HWND hwnd, 
  65.     UINT msg, 
  66.                             WPARAM wparam, 
  67.                             LPARAM lparam)
  68. {
  69. // this is the main message handler of the system
  70. PAINTSTRUCT ps;    // used in WM_PAINT
  71. HDC hdc;    // handle to a device context
  72. // what is the message 
  73. switch(msg)
  74. {
  75. case WM_CREATE: 
  76.         {
  77. // do initialization stuff here
  78. return(0);
  79. } break;
  80.     case WM_PAINT:
  81.          {
  82.          // start painting
  83.          hdc = BeginPaint(hwnd,&ps);
  84.          // end painting
  85.          EndPaint(hwnd,&ps);
  86.          return(0);
  87.         } break;
  88. case WM_DESTROY: 
  89. {
  90. // kill the application
  91. PostQuitMessage(0);
  92. return(0);
  93. } break;
  94. default:break;
  95.     } // end switch
  96. // process any messages that we didn't take care of 
  97. return (DefWindowProc(hwnd, msg, wparam, lparam));
  98. } // end WinProc
  99. // WINMAIN ////////////////////////////////////////////////
  100. int WINAPI WinMain( HINSTANCE hinstance,
  101. HINSTANCE hprevinstance,
  102. LPSTR lpcmdline,
  103. int ncmdshow)
  104. {
  105. // this is the winmain function
  106. WNDCLASSEX winclass; // this will hold the class we create
  107. HWND    hwnd;  // generic window handle
  108. MSG    msg;  // generic message
  109. HDC        hdc;      // graphics device context
  110. // first fill in the window class stucture
  111. winclass.cbSize         = sizeof(WNDCLASSEX);
  112. winclass.style = CS_DBLCLKS | CS_OWNDC | 
  113.                           CS_HREDRAW | CS_VREDRAW;
  114. winclass.lpfnWndProc = WindowProc;
  115. winclass.cbClsExtra = 0;
  116. winclass.cbWndExtra = 0;
  117. winclass.hInstance = hinstance;
  118. winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  119. winclass.hCursor = LoadCursor(NULL, IDC_ARROW); 
  120. winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  121. winclass.lpszMenuName = NULL;
  122. winclass.lpszClassName = WINDOW_CLASS_NAME;
  123. winclass.hIconSm        = LoadIcon(NULL, IDI_APPLICATION);
  124. // save hinstance in global
  125. main_instance = hinstance;
  126. // register the window class
  127. if (!RegisterClassEx(&winclass))
  128. return(0);
  129. // create the window
  130. if (!(hwnd = CreateWindowEx(NULL,                  // extended style
  131.                             WINDOW_CLASS_NAME,     // class
  132.     WINDOW_TITLE, // title
  133.     (WINDOWED_APP ? (WS_OVERLAPPED | WS_SYSMENU | WS_CAPTION) : (WS_POPUP | WS_VISIBLE)), 
  134.       0,0,   // initial x,y
  135.     WINDOW_WIDTH,WINDOW_HEIGHT,  // initial width, height
  136.     NULL,   // handle to parent 
  137.     NULL,   // handle to menu
  138.     hinstance,// instance of this application
  139.     NULL))) // extra creation parms
  140. return(0);
  141. // save main window handle
  142. main_window_handle = hwnd;
  143. if (WINDOWED_APP)
  144. {
  145. // now resize the window, so the client area is the actual size requested
  146. // since there may be borders and controls if this is going to be a windowed app
  147. // if the app is not windowed then it won't matter
  148. RECT window_rect = {0,0,WINDOW_WIDTH-1,WINDOW_HEIGHT-1};
  149. // make the call to adjust window_rect
  150. AdjustWindowRectEx(&window_rect,
  151.      GetWindowStyle(main_window_handle),
  152.      GetMenu(main_window_handle) != NULL,
  153.      GetWindowExStyle(main_window_handle));
  154. // save the global client offsets, they are needed in DDraw_Flip()
  155. window_client_x0 = -window_rect.left;
  156. window_client_y0 = -window_rect.top;
  157. // now resize the window with a call to MoveWindow()
  158. MoveWindow(main_window_handle,
  159.            0, // x position
  160.            0, // y position
  161.            window_rect.right - window_rect.left, // width
  162.            window_rect.bottom - window_rect.top, // height
  163.            FALSE);
  164. // show the window, so there's no garbage on first render
  165. ShowWindow(main_window_handle, SW_SHOW);
  166. } // end if windowed
  167. // perform all game console specific initialization
  168. Game_Init();
  169. // enter main event loop
  170. while(1)
  171. {
  172. if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  173. // test if this is a quit
  174.         if (msg.message == WM_QUIT)
  175.            break;
  176. // translate any accelerator keys
  177. TranslateMessage(&msg);
  178. // send the message to the window proc
  179. DispatchMessage(&msg);
  180. } // end if
  181.     
  182.     // main game processing goes here
  183.     Game_Main();
  184. } // end while
  185. // shutdown game and release all resources
  186. Game_Shutdown();
  187. // return to Windows like this
  188. return(msg.wParam);
  189. } // end WinMain
  190. // T3D GAME PROGRAMMING CONSOLE FUNCTIONS ////////////////
  191. int Game_Init(void *parms)
  192. {
  193. // this function is where you do all the initialization 
  194. // for your game
  195. int index; // looping variable
  196. // initialize directdraw, very important that in the call
  197. // to setcooperativelevel that the flag DDSCL_MULTITHREADED is used
  198. // which increases the response of directX graphics to
  199. // take the global critical section more frequently
  200. DDraw_Init(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BPP, WINDOWED_APP);
  201. // load in the textures
  202. Load_Bitmap_File(&bitmap16bit, "OMPTXT128_24.BMP");
  203. // now extract each 64x64x16 texture from the image
  204. for (int itext = 0; itext < NUM_TEXT; itext++)
  205.     {     
  206.     // create the bitmap
  207.     Create_Bitmap(&textures[itext],(WINDOW_WIDTH/2)-(TEXTSIZE/2),(WINDOW_HEIGHT/2)-(TEXTSIZE/2),TEXTSIZE,TEXTSIZE,16);
  208.     Load_Image_Bitmap16(&textures[itext], &bitmap16bit,itext % 4,itext / 4,BITMAP_EXTRACT_MODE_CELL);
  209.     } // end for
  210. // create temporary working texture (load with first texture to set loaded flags)
  211. Create_Bitmap(&temp_text,(WINDOW_WIDTH/2)-(TEXTSIZE/2),(WINDOW_HEIGHT/2)-(TEXTSIZE/2),TEXTSIZE,TEXTSIZE,16);
  212. Load_Image_Bitmap16(&temp_text, &bitmap16bit,0,0,BITMAP_EXTRACT_MODE_CELL);
  213. // done, so unload the bitmap
  214. Unload_Bitmap_File(&bitmap16bit);
  215. // initialize directinput
  216. DInput_Init();
  217. // acquire the keyboard only
  218. DInput_Init_Keyboard();
  219. // hide the mouse
  220. if (!WINDOWED_APP)
  221.    ShowCursor(FALSE);
  222. // seed random number generate
  223. srand(Start_Clock());
  224. // return success
  225. return(1);
  226. } // end Game_Init
  227. ///////////////////////////////////////////////////////////
  228. int Game_Shutdown(void *parms)
  229. {
  230. // this function is where you shutdown your game and
  231. // release all resources that you allocated
  232. // shut everything down
  233. // shutdown directdraw last
  234. DDraw_Shutdown();
  235. // now directsound
  236. DSound_Stop_All_Sounds();
  237. DSound_Shutdown();
  238. // shut down directinput
  239. DInput_Shutdown();
  240. // return success
  241. return(1);
  242. } // end Game_Shutdown
  243. //////////////////////////////////////////////////////////
  244. int Game_Main(void *parms)
  245. {
  246. // this is the workhorse of your game it will be called
  247. // continuously in real-time this is like main() in C
  248. // all the calls for you game go here!
  249. int          index;              // looping var
  250. static int   curr_texture = 0;   // currently active texture
  251. static float scalef       = 1.0; // texture scaling factor
  252. // start the timing clock
  253. Start_Clock();
  254. // clear the drawing surface
  255. DDraw_Fill_Surface(lpddsback, 0);
  256. // lock back buffer and copy background into it
  257. DDraw_Lock_Back_Surface();
  258. // copy texture into temp display texture for rendering and scaling
  259. Copy_Bitmap(&temp_text,0,0,  &textures[curr_texture],0,0,TEXTSIZE, TEXTSIZE);
  260. ///////////////////////////////////////////
  261. // our little image processing algorithm :)
  262. //Cmodulated = s*C1 = (s*r1, s*g1, s*b1)
  263. USHORT *pbuffer = (USHORT *)temp_text.buffer;
  264. // perform RGB transformation on bitmap
  265. for (int iy = 0; iy < temp_text.height; iy++)
  266.     for (int ix = 0; ix < temp_text.width; ix++)
  267.          {
  268.          // extract pixel
  269.          USHORT pixel = pbuffer[iy*temp_text.width + ix];
  270.    
  271.          int ri,gi,bi; // used to extract the rgb values
  272.          // extract RGB values
  273.          _RGB565FROM16BIT(pixel, &ri,&gi,&bi);
  274.          // perform scaling operation and test for overflow
  275.          if ((ri = (float)ri * scalef) > 255) ri=255;
  276.          if ((gi = (float)gi * scalef) > 255) gi=255;
  277.          if ((bi = (float)bi * scalef) > 255) bi=255;
  278.          // rebuild RGB and test for overflow
  279.          // and write back to buffer
  280.          pbuffer[iy*temp_text.width + ix] = _RGB16BIT565(ri,gi,bi);
  281.          
  282.          } // end for ix     
  283. ////////////////////////////////////////
  284. // draw texture
  285. Draw_Bitmap16(&temp_text, back_buffer, back_lpitch,0);
  286. // unlock back surface
  287. DDraw_Unlock_Back_Surface();
  288. // read keyboard
  289. DInput_Read_Keyboard();
  290. // test if user wants to change texture
  291. if (keyboard_state[DIK_RIGHT])
  292.    {
  293.    if (++curr_texture > (NUM_TEXT-1))
  294.       curr_texture = (NUM_TEXT-1);
  295.    Wait_Clock(100);
  296.    } // end if
  297. if (keyboard_state[DIK_LEFT])
  298.    {
  299.    if (--curr_texture < 0)
  300.       curr_texture = 0;
  301.    Wait_Clock(100);
  302.    } // end if
  303. // is user changing scaling factor
  304. if (keyboard_state[DIK_UP])
  305.    {
  306.    scalef+=.01;
  307.    if (scalef > 10)
  308.       scalef = 10;
  309.    Wait_Clock(10);
  310.    } // end if
  311. if (keyboard_state[DIK_DOWN])
  312.    {
  313.    scalef-=.01;
  314.    if (scalef < 0)
  315.       scalef = 0;
  316.    Wait_Clock(10);
  317.    } // end if
  318. // draw title
  319. Draw_Text_GDI("Use <RIGHT>/<LEFT> arrows to change texture, <UP>/<DOWN> arrows to change scale factor.",10, 10,RGB(255,255,255), lpddsback);
  320. Draw_Text_GDI("Press <ESC> to Exit. ",10, 32,RGB(255,255,255), lpddsback);
  321. // print stats
  322. sprintf(buffer,"Texture #%d, Scaling Factor: %f", curr_texture, scalef);
  323. Draw_Text_GDI(buffer, 10, WINDOW_HEIGHT - 20,RGB(255,255,255), lpddsback);
  324. // flip the surfaces
  325. DDraw_Flip();
  326. // sync to 30ish fps
  327. Wait_Clock(30);
  328. // check of user is trying to exit
  329. if (KEY_DOWN(VK_ESCAPE) || keyboard_state[DIK_ESCAPE])
  330.     {
  331.     PostMessage(main_window_handle, WM_DESTROY,0,0);
  332.     // stop all sounds
  333.     DSound_Stop_All_Sounds();
  334.     } // end if
  335. // return success
  336. return(1);
  337. } // end Game_Main
  338. //////////////////////////////////////////////////////////