1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
// include the basic windows header files and the Direct3D header file
#include <windows.h>
#include <windowsx.h>
#include <time.h>
#include <d3d9.h>
#include <d3dx9.h>
// define the screen resolution and keyboard macros
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
// include the Direct3D Library file
#pragma comment (lib, "d3d9.lib")
#pragma comment (lib, "d3dx9.lib")
// global declarations
LPDIRECT3D9 d3d; // the pointer to our Direct3D interface
LPDIRECT3DDEVICE9 d3ddev; // the pointer to the device class
LPD3DXSPRITE d3dspt; // the pointer to our Direct3D Sprite interface
// sprite declarations
LPDIRECT3DTEXTURE9 sprite[7]; // the pointer to the sprite
// function prototypes
void initD3D(HWND hWnd); // sets up and initializes Direct3D
void render_frame(void); // renders a single frame
void initField(void);
void cleanD3D(void); // closes Direct3D and releases memory
// the WindowProc function prototype
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
// the entry point for any Windows program
[deleted to lack of space]
// this is the main message handler for the program
LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
} break;
}
return DefWindowProc (hWnd, message, wParam, lParam);
}
// this function initializes and prepares Direct3D for use
void initD3D(HWND hWnd)
{
d3d = Direct3DCreate9(D3D_SDK_VERSION);
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = FALSE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.hDeviceWindow = hWnd;
d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
d3dpp.BackBufferWidth = SCREEN_WIDTH;
d3dpp.BackBufferHeight = SCREEN_HEIGHT;
// create a device class using this information and the info from the d3dpp stuct
d3d->CreateDevice(D3DADAPTER_DEFAULT,
D3DDEVTYPE_HAL,
hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp,
&d3ddev);
D3DXCreateSprite(d3ddev, &d3dspt); // create the Direct3D Sprite object
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\blue.png", &sprite[0]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\cyan.png", &sprite[1]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\green.png", &sprite[2]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\pink.png", &sprite[3]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\red.png", &sprite[4]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\yellow.png", &sprite[5]);
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\yellow.png", &sprite[6]);//METAL should be here!
D3DXCreateTextureFromFile(d3ddev, L"c:\\pdp\\back.png", &sprite[7]);
return;
}
unsigned char Yoffset[2];//vertical offset. (pixels) 0-32, used for the spawning blocks in bottom.
int YabsoluteOffset[2];//Absolute vertical offset. (pixels)
unsigned char chainpointer[254];//variable containing the chain values.
unsigned short fieldsettings[5] = {
1, //count of fields, 1 or 2
80, //X of top left position of field 1
62, //Y of top left position of field 1
368, //X of top left position of field 2
62, //Y of top left position of field 2
};
unsigned char field[2][255][7];
void initField(void) {
//clear and reset all field variables.
char Xsprite = 0;
char Xpos = 0;
char Ypos = 0;
for(unsigned char x = 0;x < 2;x++) {
for(unsigned char y = 0;y < 255;y++) {
for(unsigned char z = 0;z < 7;z++) {
field[x][y][z] = 0;
}
field[x][y][0]=Xsprite;Xsprite++;if(Xsprite>5){Xsprite=0;}
}
}
//clear and reset all chain pointers
for(unsigned char x = 0;x < 254;x++) {
chainpointer[x] = 0;
}
}
// this is the function used to render a single frame
void render_frame(void)
{
// clear the window to a deep blue
d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, 0xff222222, 1.0f, 0);
d3ddev->BeginScene(); // begins the 3D scene
d3dspt->Begin(NULL); // begin sprite drawing
// set center @ upper-left.
D3DXVECTOR3 center(0.0f, 0.0f, 0.0f); // center at the upper-left corner
D3DXVECTOR3 position(64.0f, -16.0f, 0.0f);
d3dspt->Draw(sprite[7], NULL, ¢er, &position, 0xffffffff);
D3DXVECTOR3 position(fieldsettings[1], fieldsettings[2], 0.0f);
d3dspt->Draw(sprite[0], NULL, ¢er, &position, 0xffffffff);
D3DXVECTOR3 position(fieldsettings[3], fieldsettings[4], 0.0f);
d3dspt->Draw(sprite[0], NULL, ¢er, &position, 0xffffffff);
d3dspt->End(); // end sprite drawing
d3ddev->EndScene(); // ends the 3D scene
d3ddev->Present(NULL, NULL, NULL, NULL);
return;
}
// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
for(unsigned char i = 0;i < 6;i++) {
sprite[i]->Release();
}
d3ddev->Release();
d3d->Release();
return;
}
| |