question on what this error message means
Compiler Error C2102
'&' requires l-value
The address-of operator (&) must be applied to an l-value expression.
so what is an l-value expression?
i'm trying to figure out way my game won't compile. and this is the error i keep getting.
CJWR,
I believe the error message you're getting is suggesting that the '&' operator, also known as the bit-wise AND operator, can only be used in an expression which has an l-value.
An l-value is an operand to the LEFT of an equal sign. For example:
a = b & c;
Here you can see that B is being AND'd with c, and the result is being stored in the l-value of 'a'.
If this does not provide enough information to be of help to you, post the line of code that's giving the error and I can post back the correct syntax.
Cheers and good luck!
I believe the error message you're getting is suggesting that the '&' operator, also known as the bit-wise AND operator, can only be used in an expression which has an l-value.
An l-value is an operand to the LEFT of an equal sign. For example:
a = b & c;
Here you can see that B is being AND'd with c, and the result is being stored in the l-value of 'a'.
If this does not provide enough information to be of help to you, post the line of code that's giving the error and I can post back the correct syntax.
Cheers and good luck!
//main.cpp// INCLUDES ///////////////////////////////////////////////#define WIN32_LEAN_AND_MEAN // just say no to MFC#define INITGUID#include <windows.h> // include important windows stuff#include <windowsx.h> #include <mmsystem.h>#include <iostream.h> // include important C/C++ stuff#include <conio.h>#include <stdlib.h>#include <malloc.h>#include <memory.h>#include <string.h>#include <stdarg.h>#include <stdio.h> #include <math.h>#include <io.h>#include <fcntl.h>#include <ddraw.h> // include directdraw#include "screen.h"// DEFINES ////////////////////////////////////////////////// defines for windows #define WINDOW_CLASS_NAME "WINCLASS1"// default screen size#define SCREEN_WIDTH 800 // size of screen#define SCREEN_HEIGHT 600#define SCREEN_BPP 8 // bits per pixel#define BITMAP_ID 0x4D42 // universal id for a bitmap#define MAX_COLORS_PALETTE 256//ship defines#define SHIP_SIZE_X 77 //size of ship#define SHIP_SIZE_Y 62 //size of ship#define SHIP_SPEED 10 //speed of ship#define MAX_HEALTH 3 //max health of your ship#define ENGINE_SIZE_X 9 //size of engine#define ENGINE_SIZE_Y 6 //size of engine#define THRUSTER_SIZE_X 5 //size of thruster#define THRUSTER_SIZE_Y 4 //size of thruster//star defines#define NUMBER_OF_STARS 100 //number of stars//missle defines///////////////////////////////#define MAX_MISSLES 10 //max number at one time#define MISSILE_SPEED 10 //speed//PHOTON defines#define PHOTON_SIZE_X 10 //size x#define PHOTON_SIZE_Y 10 //size y//QUANTUM defines#define QUANTUM_SIZE_X 10#define QUANTUM_SIZE_Y 10//ALIEN defines#define MAX_ALIEN 2 // max at a time#define ALIEN_SPEED 5 //speed#define ALIEN_SIZE_X 63 //size x#define ALIEN_SIZE_Y 65 // size y//BEAM defines#define MAX_BEAM 6#define BEAM_SPEED 10#define BEAM_SIZE_X 10#define BEAM_SIZE_Y 10//powerup defines//////////////////////////////#define POWERUP_SPEED 5//SHIELD defines#define SHIELD_SIZE_X 24#define SHIELD_SIZE_Y 24//TORP defines#define TORP_SIZE_X 36#define TORP_SIZE_Y 18#define EX_SIZE_X 84#define EX_SIZE_Y 72// TYPES //////////////////////////////////////////////////////// basic unsigned typestypedef unsigned short USHORT;typedef unsigned short WORD;typedef unsigned char UCHAR;typedef unsigned char BYTE;// container structure for bitmaps .BMP filetypedef struct BITMAP_FILE_TAG { BITMAPFILEHEADER bitmapfileheader; // this contains the bitmapfile header BITMAPINFOHEADER bitmapinfoheader; // this is all the info including the palette PALETTEENTRY palette[256]; // we will store the palette here UCHAR *buffer; // this is a pointer to the data } BITMAP_FILE, *BITMAP_FILE_PTR;// PROTOTYPES //////////////////////////////////////////////int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height);int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename);int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap);int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE4 lpdds,int color);int Scan_Image_Bitmap(BITMAP_FILE_PTR bitmap, LPDIRECTDRAWSURFACE4 lpdds, int cx,int cy);LPDIRECTDRAWSURFACE4 DDraw_Create_Surface(int width, int height, int mem_flags, int color_key);int DDraw_Draw_Surface(LPDIRECTDRAWSURFACE4 source, int x, int y, int width, int height, LPDIRECTDRAWSURFACE4 dest, int transparent); LPDIRECTDRAWCLIPPER DDraw_Attach_Clipper(LPDIRECTDRAWSURFACE4 lpdds, int num_rects, LPRECT clip_list);int Draw_Text_GDI(char *text, int x,int y,COLORREF color, LPDIRECTDRAWSURFACE4 lpdds);//display functionsint Draw_Background();int Draw_Aliens();int Draw_Missles();int Draw_PowerUps();int Draw_BEAM();void update_frames();// MACROS /////////////////////////////////////////////////// tests if a key is up or down#define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)#define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)// initializes a direct draw struct#define DDRAW_INIT_STRUCT(ddstruct) { memset(&ddstruct,0,sizeof(ddstruct)); ddstruct.dwSize=sizeof(ddstruct); }// GLOBALS ////////////////////////////////////////////////HWND main_window_handle = NULL; // globally track main windowint window_closed = 0; // tracks if window is closedHINSTANCE hinstance_app = NULL; // globally track hinstanceSCREEN screen(); //the screen object// directdraw stuff/*LPDIRECTDRAW4 lpdd = NULL; // dd4 objectLPDIRECTDRAWSURFACE4 lpddsprimary = NULL; // dd primary surfaceLPDIRECTDRAWSURFACE4 lpddsback = NULL; // dd back surfaceLPDIRECTDRAWPALETTE lpddpal = NULL; // a pointer to the created dd paletteLPDIRECTDRAWCLIPPER lpddclipper = NULL; // dd clipperPALETTEENTRY palette[256]; // color palettePALETTEENTRY save_palette[256]; // used to save palettesDDSURFACEDESC2 ddsd; // a direct draw surface description structDDBLTFX ddbltfx; // used to fillDDSCAPS2 ddscaps; // a direct draw surface capabilities structHRESULT ddrval; // result back from dd callsDWORD start_clock_count = 0; // used for timing*/BITMAP_FILE bitmap; // holds the bitmapLPDIRECTDRAWSURFACE4 lpddsbackground = NULL; //this will hold the background imageLPDIRECTDRAWSURFACE4 ship[2]; //bitmap images of shipLPDIRECTDRAWSURFACE4 engines[3]; //bitmap images of ship enginesLPDIRECTDRAWSURFACE4 thrusters[2]; //bitmap images of ship thrustersLPDIRECTDRAWSURFACE4 shield[4]; //bitmap images of shieldLPDIRECTDRAWSURFACE4 torp[3]; //bitmap images of torpLPDIRECTDRAWSURFACE4 alien[3]; //bitmap images of alienLPDIRECTDRAWSURFACE4 photon[3]; //bitmap images of photonLPDIRECTDRAWSURFACE4 quantum[3]; //bitmap images of quantumLPDIRECTDRAWSURFACE4 beam[3]; //bitmap image of beamLPDIRECTDRAWSURFACE4 explode[7]; //bitmap images of explodeint GAME_STATE = 0; //holds the game state 0 = intro, 1 = play, 2 = pause, 3 = donechar buffer[80]; // general printing bufferint gwidth = -1;int gheight = -1;int score = 0; // the score for player 1int GPT = 0; //used in pausing the gameint Missle_TIME = 0; //used for missle firingint Starsx[NUMBER_OF_STARS]; int Starsy[NUMBER_OF_STARS];int Starss[NUMBER_OF_STARS];int ALIENx[MAX_ALIEN];int ALIENy[MAX_ALIEN];int ALIEN[MAX_ALIEN];int ALIEN_Total = 0;int BEAMx[MAX_BEAM]; //xint BEAMy[MAX_BEAM]; //yint BEAM_Total; //totalint BEAM[MAX_BEAM]; //tracks if a beam slot is in useint Shipx = 0;int Shipy = 0;int Ship_Health = 0;int Misslesx[MAX_MISSLES];int Misslesy[MAX_MISSLES];int Missle_Total = 0;int Missles[MAX_MISSLES];int Missle_Type[MAX_MISSLES]; // 1 = photon, 2 = quantumint Fire_Type;int Missle_Size_X; //missle sizeint Missle_Size_Y; //missle sizeint PowerUpx;int PowerUpy;int PowerUp;int PowerUpType;int PowerUp_Size_X;int PowerUp_Size_Y;int frame_ship = 0; //holds which frame of the ship to displayint ship_till_next=0; //holds how many flips to wait before drawing the next frame of the shipint frame_engine = 0; //holds which frame of the ship engines to displayint engine_till_next=0; //holds how many flips to wait before drawing the next frame of the enginesint frame_alien = 0;int alien_till_next=0; //holds how many flips to wait before drawing the next frame of the aliensint frame_torp = 0;int torp_till_next=0;int frame_shield = 0;int shield_till_next=0;int frame_torpup = 0;int torpup_till_next=0;int frame_beam = 0;int beam_till_next=0;int alien1_timer; //holds how many more frames to draw with alien1 explodingint alien2_timer;//prototypes2int Draw_Rectangle(int x1, int y1, int x2, int y2, int color,LPDIRECTDRAWSURFACE4 lpdds=screen().lpddsback);// FUNCTIONS ////////////////////////////////////////////////void update_frames(){ ship_till_next--; engine_till_next--; torp_till_next--; alien_till_next--; shield_till_next--; torpup_till_next--; beam_till_next--; //check if ship needs to be updated, if so, update if(ship_till_next <= 0){ if(frame_ship == 0){ frame_ship = 1; } else if(frame_ship == 1){ frame_ship = 0; } else frame_ship = 0; ship_till_next = 10; } //check if engines needs to be updated, if so, update if(engine_till_next <=0){ if(frame_engine == 0){ frame_engine = 1; } else if(frame_engine == 1){ frame_engine = 2; } else if(frame_engine == 2){ frame_engine = 0; } else frame_engine = 0; engine_till_next = 10; } //check if torp needs to be updated, if so, update if(torp_till_next <= 0){ if(frame_torp == 0){ frame_torp = 1; } else if(frame_torp == 1){ frame_torp = 2; } else if(frame_torp == 2){ frame_torp = 0; } else frame_torp = 0; torp_till_next = 5; } //check if aliens needs to be updated, if so, update if(alien_till_next <=0){ if(frame_alien == 0){ frame_alien = 1; } else if(frame_alien == 1){ frame_alien = 2; } else if(frame_alien == 2){ frame_alien = 0; } else frame_alien = 0; alien_till_next = 10; } //check if shield needs to be updated, if so, update if(shield_till_next <=0){ if(frame_shield == 0){ frame_shield = 1; } else if(frame_shield == 1){ frame_shield = 2; } else if(frame_shield == 2){ frame_shield = 3; } else if(frame_shield == 3){ frame_shield = 0; } else frame_shield = 0; shield_till_next = 8; } //check if torp_up needs to be updated, if so, update if(torpup_till_next <= 0){ if(frame_torpup == 0){ frame_torpup = 1; } else if(frame_torpup == 1){ frame_torpup = 2; } else if(frame_torpup == 2){ frame_torpup = 0; } else frame_torpup = 0; torpup_till_next = 10; } //check if beam needs to be updated, if so, update if(beam_till_next <= 0){ if(frame_beam == 0){ frame_beam = 1; } else if(frame_beam == 1){ frame_beam = 2; } else if(frame_beam == 2){ frame_beam = 0; } else frame_beam = 0; beam_till_next = 10; }}int Draw_Rectangle(int x1, int y1, int x2, int y2, int color, LPDIRECTDRAWSURFACE4 lpdds){// this function uses directdraw to draw a filled rectangleDDBLTFX ddbltfx; // this contains the DDBLTFX structureRECT fill_area; // this contains the destination rectangle// clear out the structure and set the size field DDRAW_INIT_STRUCT(ddbltfx);// set the dwfillcolor field to the desired colorddbltfx.dwFillColor = color; // fill in the destination rectangle data (your data)fill_area.top = y1;fill_area.left = x1;fill_area.bottom = y2+1;fill_area.right = x2+1;// ready to blt to surface, in this case blt to primarylpdds->Blt(&fill_area, // ptr to dest rectangle NULL, // ptr to source surface, NA NULL, // ptr to source rectangle, NA DDBLT_COLORFILL | DDBLT_WAIT | DDBLT_ASYNC, // fill and wait &ddbltfx); // ptr to DDBLTFX structure// return successreturn(1);} // end Draw_Rectangleint Draw_Background(){ //draws the background Draw_Rectangle(0,0,SCREEN_WIDTH-1, SCREEN_HEIGHT-1,0); //background //draws the stars for(int i = 0; i < NUMBER_OF_STARS; i++){ Starsy = Starsy + Starss; Draw_Rectangle(Starsx,Starsy,Starsx+1,Starsy+1,255); //background if(Starsy > SCREEN_HEIGHT){ Starsy = 0; Starsx = rand()%SCREEN_WIDTH; Starss = rand()%3 + 2; } } return 0;}int Draw_Aliens(){ if(ALIEN[0] == 0){ //create alien 1 ALIENx[0] = rand()%600; if(ALIENx[0] > SCREEN_WIDTH-80||ALIENx[0] < 40){ ALIENx[0] = 200; } ALIENy[0] = 0; ALIEN[0] = 1; ALIEN_Total = ALIEN_Total + 1; } if(ALIEN[1] == 0){ //create alien 2 ALIENx[1] = rand()%600; if(ALIENx[1] > SCREEN_WIDTH-80||ALIENx[1] < 40){ ALIENx[1] = 400; } ALIENy[1] = 0; ALIEN[1] = 1; ALIEN_Total = ALIEN_Total + 1; } if(ALIEN[0] == 1){ //draw alien 1 ALIENy[0] = ALIENy[0] + ALIEN_SPEED; DDraw_Draw_Surface(alien[frame_alien],ALIENx[0],ALIENy[0],ALIEN_SIZE_X,ALIEN_SIZE_Y,screen().lpddsback,1); if(ALIENy[0] > SCREEN_HEIGHT){ ALIEN_Total = ALIEN_Total - 1; ALIEN[0] = 0; ALIENx[0] = 0; ALIENy[0] = 0; } } if(ALIEN[1] == 1){ //draw alien 2 ALIENy[1] = ALIENy[1] + ALIEN_SPEED; DDraw_Draw_Surface(alien[frame_alien],ALIENx[1],ALIENy[1],ALIEN_SIZE_X,ALIEN_SIZE_Y,screen().lpddsback,1); if(ALIENy[1] > SCREEN_HEIGHT){ ALIEN_Total = ALIEN_Total - 1; ALIEN[1] = 0; ALIENx[1] = 0; ALIENy[1] = 0; } } //check to see if a missle hit an alien int center; for(int i = 0; i < MAX_ALIEN; i++){ //alien counter if(ALIEN == 1){ //make sure the alien exists for(int j = 0; j < MAX_MISSLES; j++){ //missle counter if(Missles[j] == 1){ //make sure missle exists center = Misslesx[j]+(PHOTON_SIZE_X/2); if(center>=ALIENx&¢er<=ALIENx+ALIEN_SIZE_X){ if(Misslesy[j]>=ALIENy&&Misslesy[j]<=ALIENy+ALIEN_SIZE_Y){ ALIEN = 2; ALIEN_Total = ALIEN_Total - 1; score = score + 1; Missles[j] = 0; Missle_Total = Missle_Total - 1; } } } } } } //check to see if a ALIEN hit the SHIP for(int k = 0; k < MAX_ALIEN; k++){ if(ALIEN[k] == 1){ //make sure alien exists center = ALIENx[k]+(ALIEN_SIZE_X/2); if(center>=Shipx&¢er<=Shipx+(SHIP_SIZE_X)){ if(ALIENy[k]>=Shipy&&ALIENy[k]<=Shipy+SHIP_SIZE_Y){ if(Fire_Type == 2){ Missle_Total = 0; for(int i = 0; i<MAX_MISSLES; i++){ Missles = 0; } } ALIEN[k] = 2; ALIEN_Total = ALIEN_Total - 1; Ship_Health = Ship_Health - 1; Fire_Type = 1; Missle_Size_X = PHOTON_SIZE_X; Missle_Size_Y = PHOTON_SIZE_Y; } } } } //check to see if a ALIEN hit the lower side of the screen for(int l = 0; l < MAX_ALIEN; l++){ if(ALIEN[l] == 1){ //make sure noob exists if(ALIENy[l]>=SCREEN_HEIGHT){ ALIEN[l] = 0; ALIEN_Total = ALIEN_Total - 1; score = score - 2; } } } //check if any aliens should be exploding, and draw if they should be if(ALIEN[0] == 2){ ALIENy[0] = ALIENy[0] + alien1_timer/6; //slow the alien down if(alien1_timer/4 < 6){ DDraw_Draw_Surface(alien[frame_alien],ALIENx[0],ALIENy[0],ALIEN_SIZE_X,ALIEN_SIZE_Y,screen().lpddsback,1); } else; DDraw_Draw_Surface(explode[alien1_timer/4],ALIENx[0]-10,ALIENy[0]-6,EX_SIZE_X,EX_SIZE_Y,screen().lpddsback,1); alien1_timer++; if(alien1_timer >= 28){ alien1_timer = 0; ALIEN[0] = 0; } else; } else; if(ALIEN[1] == 2){ ALIENy[1] = ALIENy[1] + alien2_timer/6; //slow the alien down if(alien2_timer/4 < 6){ DDraw_Draw_Surface(alien[frame_alien],ALIENx[1],ALIENy[1],ALIEN_SIZE_X,ALIEN_SIZE_Y,screen().lpddsback,1); } else; DDraw_Draw_Surface(explode[alien2_timer/4],ALIENx[1]-10,ALIENy[1]-6,EX_SIZE_X,EX_SIZE_Y,screen().lpddsback,1); alien2_timer++; if(alien2_timer >= 28){ alien2_timer = 0; ALIEN[1] = 0; } else; } else; return 0;}int Draw_BEAM(){ int rn;// srand(Start_Clock()); for(int i = 0; i < MAX_BEAM; i++){ rn = rand()%50; if(BEAM == 0 && rn == 1){ //create a beam for alien rn rn = rand()%MAX_ALIEN; BEAM = 1; BEAMx = ALIENx[rn]+(ALIEN_SIZE_X-BEAM_SIZE_X)/2; BEAMy = ALIENy[rn]+ALIEN_SIZE_Y-1; BEAM_Total = BEAM_Total + 1; } } for(i = 0; i < MAX_BEAM; i++){ if(BEAM == 1){ //draw beam BEAMy = BEAMy + BEAM_SPEED; DDraw_Draw_Surface(beam[frame_beam],BEAMx,BEAMy,BEAM_SIZE_X,BEAM_SIZE_Y,screen().lpddsback,1); if(BEAMy > SCREEN_HEIGHT){ BEAM_Total = BEAM_Total - 1; BEAM = 0; } } } int center; for(i = 0; i < MAX_BEAM; i++){ if(BEAM == 1){ center = BEAMx+(BEAM_SIZE_X/2); if(center>=Shipx&¢er<=Shipx+(SHIP_SIZE_X)){ if(BEAMy>=Shipy&&BEAMy<=Shipy+SHIP_SIZE_Y){ if(Fire_Type == 2){ Missle_Total = 0; for(int i = 0; i<MAX_MISSLES; i++){ Missles = 0; } } BEAM = 0; BEAM_Total = BEAM_Total - 1; Ship_Health = Ship_Health - 1; Fire_Type = 1; Missle_Size_X = PHOTON_SIZE_X; Missle_Size_Y = PHOTON_SIZE_Y; } } } } for(i = 0; i < MAX_BEAM; i++){ if(BEAM == 1){ //make sure the beam exists for(int j = 0; j < MAX_MISSLES; j++){ //missle counter if(Missles[j] == 1){ //make sure missle exists center = Misslesx[j]+(PHOTON_SIZE_X/2); if(center>=BEAMx&¢er<=BEAMx+BEAM_SIZE_X){ if(Misslesy[j]>=BEAMy&&Misslesy[j]<=BEAMy+BEAM_SIZE_Y){ BEAM = 0; BEAM_Total = BEAM_Total - 1; Missles[j] = 0; Missle_Total = Missle_Total - 1; } } } } } } return 0;}int Draw_PowerUps(){ char buffer[80]; // used to print text// srand(Start_Clock()); int sdp; sdp = rand()%100; if(sdp == 0&&PowerUp == 0){ //create powerup sdp = rand()%2; if(sdp == 0){ PowerUp = 1; PowerUpx = 0; PowerUpy = rand()%80; PowerUpType = 1; //P13 PowerUp_Size_X = SHIELD_SIZE_X; PowerUp_Size_Y = SHIELD_SIZE_Y; } else if(sdp == 1){ PowerUp = 1; PowerUpx = 0; PowerUpy = rand()%80; PowerUpType = 2; //C0ff33 PowerUp_Size_X = TORP_SIZE_X; PowerUp_Size_Y = TORP_SIZE_Y; } } if(PowerUp == 1){ //move and display powerup PowerUpx = PowerUpx + POWERUP_SPEED; PowerUpy = PowerUpy + POWERUP_SPEED; if(PowerUpType == 1){ DDraw_Draw_Surface(shield[frame_shield],PowerUpx,PowerUpy,PowerUp_Size_X,PowerUp_Size_Y,screen().lpddsback,1); } if(PowerUpType == 2){ DDraw_Draw_Surface(torp[frame_torp],PowerUpx,PowerUpy,PowerUp_Size_X,PowerUp_Size_Y,screen().lpddsback,1); } } //check to see if it went off screen and destroy the powerup if it did if(PowerUpx>SCREEN_WIDTH||PowerUpy>SCREEN_HEIGHT){ PowerUp = 0; } //check to see if the GAT hit the powerup int center = 0; if(PowerUp == 1){ //make sure powerup exists center = PowerUpx+(PowerUp_Size_X/2); if(center>=Shipx&¢er<=Shipx+SHIP_SIZE_X){ if(PowerUpy>=Shipy&&PowerUpy<=Shipy+SHIP_SIZE_Y){ PowerUp = 0; if(PowerUpType == 1){ if(Ship_Health < 3){ Ship_Health = Ship_Health + 1; } } if(PowerUpType == 2){ Fire_Type = 2; Missle_Size_X = QUANTUM_SIZE_X; Missle_Size_Y = QUANTUM_SIZE_Y; Missle_Total = 0; if(Fire_Type == 1){ for(int i = 0; i<MAX_MISSLES; i++){ Missles = 0; } } } } } } return 0;}int Draw_Missles(){ char buffer[80]; // used to print text for(int i = 0; i < MAX_MISSLES; i++){ if(Missles == 1){ Misslesy=Misslesy-MISSILE_SPEED; if(Fire_Type == 1){ DDraw_Draw_Surface(photon[frame_torp],Misslesx,Misslesy,Missle_Size_X,Missle_Size_Y,screen().lpddsback,1); } if(Fire_Type == 2){ DDraw_Draw_Surface(quantum[frame_torp],Misslesx,Misslesy,Missle_Size_X,Missle_Size_Y,screen().lpddsback,1); } if(Misslesy<-48){ Missles = 0; Missle_Total = Missle_Total - 1; } } } return 0;}int Load_Bitmap_File(BITMAP_FILE_PTR bitmap, char *filename){// this function opens a bitmap file and loads the data into bitmapint file_handle, // the file handle index; // looping indexUCHAR *temp_buffer = NULL; // used to convert 24 bit images to 16 bitOFSTRUCT file_data; // the file data information// open the file if it existsif ((file_handle = OpenFile(filename,&file_data,OF_READ))==-1) return(0);// now load the bitmap file header_lread(file_handle, &bitmap->bitmapfileheader,sizeof(BITMAPFILEHEADER));// test if this is a bitmap fileif (bitmap->bitmapfileheader.bfType!=BITMAP_ID) { // close the file _lclose(file_handle); // return error return(0); } // end if// now we know this is a bitmap, so read in all the sections// first the bitmap infoheader// now load the bitmap file header_lread(file_handle, &bitmap->bitmapinfoheader,sizeof(BITMAPINFOHEADER));// now load the color palette if there is oneif (bitmap->bitmapinfoheader.biBitCount == 8) { _lread(file_handle, &bitmap->palette,MAX_COLORS_PALETTE*sizeof(PALETTEENTRY)); // now set all the flags in the palette correctly and fix the reversed // BGR RGBQUAD data format for (index=0; index < MAX_COLORS_PALETTE; index++) { // reverse the red and green fields int temp_color = bitmap->palette[index].peRed; bitmap->palette[index].peRed = bitmap->palette[index].peBlue; bitmap->palette[index].peBlue = temp_color; // always set the flags word to this bitmap->palette[index].peFlags = PC_NOCOLLAPSE; } // end for index } // end if// finally the image data itself_lseek(file_handle,-(int)(bitmap->bitmapinfoheader.biSizeImage),SEEK_END);// now read in the image, if the image is 8 or 16 bit then simply read it// but if its 24 bit then read it into a temporary area and then convert// it to a 16 bit imageif (bitmap->bitmapinfoheader.biBitCount==8 || bitmap->bitmapinfoheader.biBitCount==16 || bitmap->bitmapinfoheader.biBitCount==24) { // delete the last image if there was one if (bitmap->buffer) free(bitmap->buffer); // allocate the memory for the image if (!(bitmap->buffer = (UCHAR *)malloc(bitmap->bitmapinfoheader.biSizeImage))) { // close the file _lclose(file_handle); // return error return(0); } // end if // now read it in _lread(file_handle,bitmap->buffer,bitmap->bitmapinfoheader.biSizeImage); } // end ifelse { // serious problem return(0); } // end else#if 0// write the file info out printf("\nfilename:%s \nsize=%d \nwidth=%d \nheight=%d \nbitsperpixel=%d \ncolors=%d \nimpcolors=%d", filename, bitmap->bitmapinfoheader.biSizeImage, bitmap->bitmapinfoheader.biWidth, bitmap->bitmapinfoheader.biHeight, bitmap->bitmapinfoheader.biBitCount, bitmap->bitmapinfoheader.biClrUsed, bitmap->bitmapinfoheader.biClrImportant);#endif// close the file_lclose(file_handle);// flip the bitmapFlip_Bitmap(bitmap->buffer, bitmap->bitmapinfoheader.biWidth*(bitmap->bitmapinfoheader.biBitCount/8), bitmap->bitmapinfoheader.biHeight);// return successreturn(1);} // end Load_Bitmap_File///////////////////////////////////////////////////////////int Unload_Bitmap_File(BITMAP_FILE_PTR bitmap){// this function releases all memory associated with "bitmap"if (bitmap->buffer) { // release memory free(bitmap->buffer); // reset pointer bitmap->buffer = NULL; } // end if// return successreturn(1);} // end Unload_Bitmap_File///////////////////////////////////////////////////////////int Flip_Bitmap(UCHAR *image, int bytes_per_line, int height){// this function is used to flip bottom-up .BMP imagesUCHAR *buffer; // used to perform the image processingint index; // looping index// allocate the temporary bufferif (!(buffer = (UCHAR *)malloc(bytes_per_line*height))) return(0);// copy image to work areamemcpy(buffer,image,bytes_per_line*height);// flip verticallyfor (index=0; index < height; index++) memcpy(&image[((height-1) - index)*bytes_per_line], &buffer[index*bytes_per_line], bytes_per_line);// release the memoryfree(buffer);// return successreturn(1);} // end Flip_Bitmap///////////////////////////////////////////////////////////////LPDIRECTDRAWCLIPPER DDraw_Attach_Clipper(LPDIRECTDRAWSURFACE4 lpdds, int num_rects, LPRECT clip_list){// this function creates a clipper from the sent clip list and attaches// it to the sent surfaceint index; // looping varLPDIRECTDRAWCLIPPER lpddclipper; // pointer to the newly created dd clipperLPRGNDATA region_data; // pointer to the region data that contains // the header and clip list// first create the direct draw clipperif (FAILED(screen().lpdd->CreateClipper(0,&lpddclipper,NULL))) return(NULL);// now create the clip list from the sent data// first allocate memory for region dataregion_data = (LPRGNDATA)malloc(sizeof(RGNDATAHEADER)+num_rects*sizeof(RECT));// now copy the rects into region datamemcpy(region_data->Buffer, clip_list, sizeof(RECT)*num_rects);// set up fields of headerregion_data->rdh.dwSize = sizeof(RGNDATAHEADER);region_data->rdh.iType = RDH_RECTANGLES;region_data->rdh.nCount = num_rects;region_data->rdh.nRgnSize = num_rects*sizeof(RECT);region_data->rdh.rcBound.left = 64000;region_data->rdh.rcBound.top = 64000;region_data->rdh.rcBound.right = -64000;region_data->rdh.rcBound.bottom = -64000;// find bounds of all clipping regionsfor (index=0; index<num_rects; index++) { // test if the next rectangle unioned with the current bound is larger if (clip_list[index].left < region_data->rdh.rcBound.left) region_data->rdh.rcBound.left = clip_list[index].left; if (clip_list[index].right > region_data->rdh.rcBound.right) region_data->rdh.rcBound.right = clip_list[index].right; if (clip_list[index].top < region_data->rdh.rcBound.top) region_data->rdh.rcBound.top = clip_list[index].top; if (clip_list[index].bottom > region_data->rdh.rcBound.bottom) region_data->rdh.rcBound.bottom = clip_list[index].bottom; } // end for index// now we have computed the bounding rectangle region and set up the data// now let's set the clipping listif (FAILED(lpddclipper->SetClipList(region_data, 0))) { // release memory and return error free(region_data); return(NULL); } // end if// now attach the clipper to the surfaceif (FAILED(lpdds->SetClipper(lpddclipper))) { // release memory and return error free(region_data); return(NULL); } // end if// all is well, so release memory and send back the pointer to the new clipperfree(region_data);return(lpddclipper);} // end DDraw_Attach_Clipper/////////////////////////////////////////////////////////// int DDraw_Fill_Surface(LPDIRECTDRAWSURFACE4 lpdds,int color){DDBLTFX ddbltfx; // this contains the DDBLTFX structure// clear out the structure and set the size field DDRAW_INIT_STRUCT(ddbltfx);// set the dwfillcolor field to the desired colorddbltfx.dwFillColor = color; // ready to blt to surfacelpdds->Blt(NULL, // ptr to dest rectangle NULL, // ptr to source surface, NA NULL, // ptr to source rectangle, NA DDBLT_COLORFILL | DDBLT_WAIT, // fill and wait &ddbltfx); // ptr to DDBLTFX structure// return successreturn(1);} // end DDraw_Fill_Surface///////////////////////////////////////////////////////////////int DDraw_Draw_Surface(LPDIRECTDRAWSURFACE4 source, // source surface to draw int x, int y, // position to draw at int width, int height, // size of source surface LPDIRECTDRAWSURFACE4 dest, // surface to draw the surface on int transparent = 1) // transparency flag{// draw a bob at the x,y defined in the BOB// on the destination surface defined in destRECT dest_rect, // the destination rectangle source_rect; // the source rectangle // fill in the destination rectdest_rect.left = x;dest_rect.top = y;dest_rect.right = x+width-1;dest_rect.bottom = y+height-1;// fill in the source rectsource_rect.left = 0;source_rect.top = 0;source_rect.right = width-1;source_rect.bottom = height-1;// test transparency flagif (transparent) { // enable color key blit // blt to destination surface if (FAILED(dest->Blt(&dest_rect, source, &source_rect,(DDBLT_WAIT | DDBLT_KEYSRC), NULL))) return(0); } // end ifelse { // perform blit without color key // blt to destination surface if (FAILED(dest->Blt(&dest_rect, source, &source_rect,(DDBLT_WAIT), NULL))) return(0); } // end if// return successreturn(1);} // end DDraw_Draw_Surface///////////////////////////////////////////////////////////////int Scan_Image_Bitmap(BITMAP_FILE_PTR bitmap, // bitmap file to scan image data from LPDIRECTDRAWSURFACE4 lpdds, // surface to hold data int cx, int cy) // cell to scan image from{// this function extracts a bitmap out of a bitmap fileUCHAR *source_ptr, // working pointers *dest_ptr;DDSURFACEDESC2 ddsd; // direct draw surface description // get the addr to destination surface memory// set size of the structureddsd.dwSize = sizeof(ddsd);// lock the display surfacelpdds->Lock(NULL, &ddsd, DDLOCK_WAIT | DDLOCK_SURFACEMEMORYPTR, NULL);// compute position to start scanning bits from//cx = cx*(ddsd.dwWidth+1) + 1;//cy = cy*(ddsd.dwHeight+1) + 1;gwidth = ddsd.dwWidth;gheight = ddsd.dwHeight;int pitch = ((bitmap->bitmapinfoheader.biWidth + 3)&(~3))*(bitmap->bitmapinfoheader.biBitCount/8);// extract bitmap datasource_ptr = bitmap->buffer + cy*pitch+cx;// assign a pointer to the memory surface for manipulationdest_ptr = (UCHAR *)ddsd.lpSurface;// iterate thru each scanline and copy bitmapfor (int index_y=0; index_y < ddsd.dwHeight; index_y++) { // copy next line of data to destination memcpy(dest_ptr, source_ptr, ddsd.dwWidth*(bitmap->bitmapinfoheader.biBitCount/8)); // advance pointers dest_ptr += (ddsd.lPitch); // source_ptr += bitmap->bitmapinfoheader.biWidth; source_ptr += pitch; } // end for index_y// unlock the surface lpdds->Unlock(NULL);// return successreturn(1);} // end Scan_Image_Bitmap///////////////////////////////////////////////////////////////LPDIRECTDRAWSURFACE4 DDraw_Create_Surface(int width, int height, int mem_flags, int ck = 255){// this function creates an offscreen plain surfaceDDSURFACEDESC2 ddsd; // working descriptionLPDIRECTDRAWSURFACE4 lpdds; // temporary surface // set to access caps, width, and heightmemset(&ddsd,0,sizeof(ddsd));ddsd.dwSize = sizeof(ddsd);ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;// set dimensions of the new bitmap surfaceddsd.dwWidth = width;ddsd.dwHeight = height;// set surface to offscreen plainddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN | mem_flags;// create the surfaceif (FAILED(screen().lpdd->CreateSurface(&ddsd,&lpdds,NULL))) return(NULL);// test if user wants a color keyif (ck >= 0) { // set color key to color 0 DDCOLORKEY color_key; // used to set color key color_key.dwColorSpaceLowValue = ck; color_key.dwColorSpaceHighValue = ck; // now set the color key for source blitting lpdds->SetColorKey(DDCKEY_SRCBLT, &color_key); } // end if// return surfacereturn(lpdds);} // end DDraw_Create_Surface///////////////////////////////////////////////////////////////LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam){// this is the main message handler of the systemPAINTSTRUCT ps; // used in WM_PAINTHDC hdc; // handle to a device contextchar buffer[80]; // used to print strings// what is the message switch(msg) { case WM_CREATE: { // do initialization stuff here // return success return(0); } break; case WM_PAINT: { // simply validate the window hdc = BeginPaint(hwnd,&ps); // end painting EndPaint(hwnd,&ps); // return success return(0); } break; case WM_DESTROY: { // kill the application, this sends a WM_QUIT message PostQuitMessage(0); // return success 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///////////////////////////////////////////////////////////int Draw_Text_GDI(char *text, int x,int y,COLORREF color, LPDIRECTDRAWSURFACE4 lpdds){// this function draws the sent text on the sent surface // using color index as the color in the paletteHDC xdc; // the working dc// get the dc from surfaceif (FAILED(lpdds->GetDC(&xdc))) return(0);// set the colors for the text upSetTextColor(xdc,color);// set background mode to transparent so black isn't copiedSetBkMode(xdc, TRANSPARENT);// draw the text aTextOut(xdc,x,y,text,strlen(text));// release the dclpdds->ReleaseDC(xdc);// return successreturn(1);} // end Draw_Text_GDI///////////////////////////////////////////////////////////////int Game_Main(void *parms = NULL, int num_parms = 0){ int index; // general looping variable // make sure this isn't executed again if(window_closed) return(0); //test if user is hitting ESC and send WM_CLOSE if(KEYDOWN(VK_ESCAPE)){ PostMessage(main_window_handle,WM_CLOSE,0,0); window_closed = 1; } // end if GPT = GPT - 1; Missle_TIME = Missle_TIME - 1; //draw background Draw_Background(); //pause game if (KEYDOWN(VK_TAB)){ if(GPT < 0){ GAME_STATE = 2; GPT = 33; } } //move ship left if (KEYDOWN(VK_LEFT)){ Shipx = Shipx - SHIP_SPEED; if(Shipx <= 0){ Shipx = 0; } DDraw_Draw_Surface(thrusters[1],Shipx+SHIP_SIZE_X-2,Shipy+28,THRUSTER_SIZE_X,THRUSTER_SIZE_Y,screen().lpddsback); } //move ship right if (KEYDOWN(VK_RIGHT)){ Shipx = Shipx + SHIP_SPEED; if(Shipx >= SCREEN_WIDTH-(SHIP_SIZE_X)){ Shipx = SCREEN_WIDTH-(SHIP_SIZE_X); } DDraw_Draw_Surface(thrusters[0],Shipx-THRUSTER_SIZE_X+2,Shipy+28,THRUSTER_SIZE_X,THRUSTER_SIZE_Y,screen().lpddsback); } //fire a weapon if (KEYDOWN(VK_SPACE)){ if(Missle_Total < MAX_MISSLES && Missle_TIME < 0){ Missle_Total = Missle_Total + 1; Missle_TIME = 7; int done = 0; if(Fire_Type == 1){ for(int i = 0; i<MAX_MISSLES; i++){ if(Missles == 0){ Misslesx = Shipx+(SHIP_SIZE_X/2)-PHOTON_SIZE_X/2; Misslesy = Shipy-5; Missles = 1; i = MAX_MISSLES; } } } if(Fire_Type == 2){ for(int j = 0; j<MAX_MISSLES; j++){ if(Missles[j] == 0){ Misslesx[j] = Shipx+19; Misslesy[j] = Shipy+8; Missles[j] = 1; Misslesx[j+1] = Shipx+51; Misslesy[j+1] = Shipy+8; Missles[j+1] = 1; j = MAX_MISSLES; } j = j + 1; } } } }// d3dDevice->Clear (0, NULL, lpddsback, 0, 0, 0);/* //clear back buffer UCHAR *back_buffer = (UCHAR *)ddsd.lpSurface; if(ddsd.lPitch == SCREEN_WIDTH){ memset(back_buffer,0,SCREEN_WIDTH*SCREEN_HEIGHT); } else{ UCHAR *dest_ptr = back_buffer; for(int y=0; y<SCREEN_HEIGHT; y++){ memset(dest_ptr,0,SCREEN_WIDTH); dest_ptr+=ddsd.lPitch; } }*/ // clear the drawing surface// DDraw_Fill_Surface(lpddsback, 0); //draw ship and engines DDraw_Draw_Surface(ship[frame_ship],Shipx,Shipy,SHIP_SIZE_X,SHIP_SIZE_Y,screen().lpddsback); DDraw_Draw_Surface(engines[frame_engine],Shipx+2,Shipy+59,ENGINE_SIZE_X,ENGINE_SIZE_Y,screen().lpddsback); DDraw_Draw_Surface(engines[frame_engine],Shipx+66,Shipy+59,ENGINE_SIZE_X,ENGINE_SIZE_Y,screen().lpddsback); Draw_Missles(); Draw_Aliens(); Draw_PowerUps(); Draw_BEAM(); // draw the info sprintf(buffer,"Space Version 2.1"); //title Draw_Text_GDI(buffer, 1,566, 255, screen().lpddsback); sprintf(buffer,"Copyright 2005 Charles Reed"); //title Draw_Text_GDI(buffer, 1,582, 255, screen().lpddsback); sprintf(buffer,"SCORE: %d", score); //score Draw_Text_GDI(buffer, 1,0, 255, screen().lpddsback); if(Ship_Health == 3){ sprintf(buffer,"SHIELD: ***"); } if(Ship_Health == 2){ sprintf(buffer,"SHIELD: **"); } if(Ship_Health == 1){ sprintf(buffer,"SHIELD: *"); } if(Ship_Health <= 0){ sprintf(buffer," "); GAME_STATE = 3; } Draw_Text_GDI(buffer, 0,16, 255, screen().lpddsback); update_frames(); // flip pages while (FAILED(screen().lpddsprimary->Flip(NULL, DDFLIP_WAIT))); // wait a sec Sleep(30); // return success or failure or your own return code here return(1);} // end Game_Mainint Game_Intro(){ if(window_closed) return(0); Draw_Rectangle(0,0,SCREEN_WIDTH-1, SCREEN_HEIGHT-1,0); //clear screen sprintf(buffer,"SPACE Version 2.1"); Draw_Text_GDI(buffer, 290,271, 255, screen().lpddsback); sprintf(buffer,"by Charles Reed"); Draw_Text_GDI(buffer, 290,287, 255, screen().lpddsback); sprintf(buffer,"Press <SPACE> to begin"); Draw_Text_GDI(buffer, 290,303, 255, screen().lpddsback); // flip the surfaces while (FAILED(screen().lpddsprimary->Flip(NULL, DDFLIP_WAIT))); // sync to 33ish fps Sleep(30); if(KEYDOWN(VK_ESCAPE)){ PostMessage(main_window_handle,WM_CLOSE,0,0); window_closed = 1; } // end if if(KEYDOWN(VK_SPACE)){ for(int i = 0; i < 3; i++){ ALIEN = 0; } GPT = 33; //for pausing game ALIEN_Total = 0; Ship_Health = MAX_HEALTH; score = 0; PowerUp = 0; PowerUpType = 0; Missle_Size_X = PHOTON_SIZE_X; Missle_Size_Y = PHOTON_SIZE_Y; Fire_Type = 1; //reset all missles for(i = 0; i < MAX_MISSLES; i++){ Missles = 0; } //setup stars for(i = 0; i < NUMBER_OF_STARS; i++){ Starsx = rand()%SCREEN_WIDTH; Starsy = rand()%SCREEN_HEIGHT; Starss = rand()%3 + 2; } //setup ship Shipx = SCREEN_WIDTH/2-30; Shipy = SCREEN_HEIGHT-101; alien1_timer = 0; alien2_timer = 0; GAME_STATE = 1; } // end if return 0;}int Game_Paused(){ // make sure this isn't executed again if(window_closed) return(0); char buffer[80]; // used to print text Draw_Rectangle(0,0,SCREEN_WIDTH-1, SCREEN_HEIGHT-1,0); //clear screen sprintf(buffer,"GAME PAUSED: TAB TO UNPAUSE"); //pause Draw_Text_GDI(buffer, 200,231, 255, screen().lpddsback); sprintf(buffer,"--Controls--"); //pause Draw_Text_GDI(buffer, 200,247, 255, screen().lpddsback); sprintf(buffer,"Left Arrow: Move Left"); //pause Draw_Text_GDI(buffer, 200,263, 255, screen().lpddsback); sprintf(buffer,"Right Arrow: Move Right"); //pause Draw_Text_GDI(buffer, 200,279, 255, screen().lpddsback); sprintf(buffer,"Escape Key: Quit Game"); //pause Draw_Text_GDI(buffer, 200,295, 255, screen().lpddsback); sprintf(buffer,"Tab Key: Pause or Unpause Game"); //pause Draw_Text_GDI(buffer, 200,311, 255, screen().lpddsback); GPT = GPT - 1; if(KEYDOWN(VK_TAB)){ if(GPT < 0){ GPT = 33; GAME_STATE = 1; } } // flip the surfaces while (FAILED(screen().lpddsprimary->Flip(NULL, DDFLIP_WAIT))); // sync to 33ish fps Sleep(30); if(KEYDOWN(VK_ESCAPE)){ PostMessage(main_window_handle,WM_CLOSE,0,0); window_closed = 1; } // end if return 0;}int Game_Done(){ // make sure this isn't executed again if(window_closed) return(0); Draw_Rectangle(0,0,SCREEN_WIDTH-1, SCREEN_HEIGHT-1,0); sprintf(buffer,"GAME OVER"); //pause Draw_Text_GDI(buffer, 200,231, 255, screen().lpddsback); sprintf(buffer,"TRY AGAIN: TAB"); Draw_Text_GDI(buffer, 200,247, 255, screen().lpddsback); sprintf(buffer,"QUIT: ESCAPE"); //pause Draw_Text_GDI(buffer, 200,263, 255, screen().lpddsback); sprintf(buffer,"SCORE: %d", score); //pause Draw_Text_GDI(buffer, 200,279, 255, screen().lpddsback); // flip the surfaces while (FAILED(screen().lpddsprimary->Flip(NULL, DDFLIP_WAIT))); // sync to 33ish fps Sleep(30); if(KEYDOWN(VK_TAB)){ GAME_STATE = 0; } if(KEYDOWN(VK_ESCAPE)){ PostMessage(main_window_handle,WM_CLOSE,0,0); window_closed = 1; } // end if return 0;}////////////////////////////////////////////////////////////int Game_Init(void *parms = NULL, int num_parms = 0){ // this is called once after the initial window is created and // before the main event loop is entered, do all your initialization // here LPDIRECTDRAW lpdd_temp; // first create base IDirectDraw interface if (FAILED(DirectDrawCreate(NULL, &lpdd_temp, NULL))) return(0); // now query for IDirectDraw4 if (FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4, (LPVOID *)&screen().lpdd))) return(0); // set cooperation to full screen if (FAILED(screen().lpdd->SetCooperativeLevel(main_window_handle, DDSCL_FULLSCREEN | DDSCL_ALLOWMODEX | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT))) return(0); // set display mode to 800x600x8 if (FAILED(screen().lpdd->SetDisplayMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP,0,0))) return(0); // we need a complex surface system with a primary and backbuffer// clear ddsd and set sizeDDRAW_INIT_STRUCT(screen().ddsd); // enable valid fieldsscreen().ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;// set the backbuffer count field to 1, use 2 for triple bufferingscreen().ddsd.dwBackBufferCount = 1;// request a complex, flippablescreen().ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_COMPLEX | DDSCAPS_FLIP;// create the primary surfaceif (FAILED(lpdd->CreateSurface(&ddsd, &lpddsprimary, NULL))) return(0);// now query for attached surface from the primary surface// this line is needed by the callddsd.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER;// get the attached back buffer surfaceif (FAILED(lpddsprimary->GetAttachedSurface(&ddsd.ddsCaps, &lpddsback))) return(0);// build up the palette data arrayfor (int color=1; color < 255; color++) { // fill with random RGB values palette.peRed = rand()%<span class="cpp-number">256</span>;<br> palette.peGreen = rand()%<span class="cpp-number">256</span>;<br> palette.peBlue = rand()%<span class="cpp-number">256</span>;<br><br> <span class="cpp-comment">// set flags field to PC_NOCOLLAPSE</span><br> palette.peFlags = PC_NOCOLLAPSE;<br> } <span class="cpp-comment">// end for color</span><br><br><span class="cpp-comment">// now fill in entry 0 and 255 with black and white</span><br>palette[<span class="cpp-number">0</span>].peRed = <span class="cpp-number">0</span>;<br>palette[<span class="cpp-number">0</span>].peGreen = <span class="cpp-number">0</span>;<br>palette[<span class="cpp-number">0</span>].peBlue = <span class="cpp-number">0</span>;<br>palette[<span class="cpp-number">0</span>].peFlags = PC_NOCOLLAPSE;<br><br>palette[<span class="cpp-number">255</span>].peRed = <span class="cpp-number">255</span>;<br>palette[<span class="cpp-number">255</span>].peGreen = <span class="cpp-number">255</span>;<br>palette[<span class="cpp-number">255</span>].peBlue = <span class="cpp-number">255</span>;<br>palette[<span class="cpp-number">255</span>].peFlags = PC_NOCOLLAPSE;<br><br><span class="cpp-comment">// create the palette object</span><br><span class="cpp-keyword">if</span> (FAILED(lpdd->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256 | <br> DDPCAPS_INITIALIZE, <br> palette,&lpddpal, NULL)))<br><span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// finally attach the palette to the primary surface</span><br><span class="cpp-keyword">if</span> (FAILED(lpddsprimary->SetPalette(lpddpal)))<br> <span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// set clipper up on back buffer since that's where well clip</span><br>RECT screen_rect= {<span class="cpp-number">0</span>,<span class="cpp-number">0</span>,SCREEN_WIDTH,SCREEN_HEIGHT};<br>lpddclipper = DDraw_Attach_Clipper(lpddsback,<span class="cpp-number">1</span>,&screen_rect);<br><br><span class="cpp-comment">// load the 8-bit image</span><br><span class="cpp-keyword">if</span> (!Load_Bitmap_File(&bitmap,<span class="cpp-literal">"gra.bmp"</span>))<br> <span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// load it's palette into directdraw</span><br><span class="cpp-keyword">if</span> (FAILED(lpddpal->SetEntries(<span class="cpp-number">0</span>,<span class="cpp-number">0</span>,MAX_COLORS_PALETTE,bitmap.palette)))<br> <span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// clean the surfaces</span><br>DDraw_Fill_Surface(lpddsprimary,<span class="cpp-number">0</span>);<br>DDraw_Fill_Surface(lpddsback,<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// create the buffer to hold the background</span><br>lpddsbackground = DDraw_Create_Surface(<span class="cpp-number">800</span>,<span class="cpp-number">600</span>,<span class="cpp-number">0</span>,-<span class="cpp-number">1</span>);<br><br><span class="cpp-comment">// copy the background bitmap image to the background surface </span><br><br><span class="cpp-comment">// lock the surface</span><br>lpddsbackground->Lock(NULL,&ddsd, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);<br><br><span class="cpp-comment">// get video pointer to primary surfce</span><br>UCHAR *image_buffer = (UCHAR *)ddsd.lpSurface; <br><br> <span class="cpp-comment">// test if memory is linear</span><br> <span class="cpp-keyword">if</span> (ddsd.lPitch == SCREEN_WIDTH){<br> <span class="cpp-comment">// copy memory from double buffer to primary buffer</span><br> memcpy((<span class="cpp-keyword">void</span> *)image_buffer, (<span class="cpp-keyword">void</span> *)bitmap.buffer, SCREEN_WIDTH*SCREEN_HEIGHT);<br> } <span class="cpp-comment">// end if</span><br> <span class="cpp-keyword">else</span>{ <span class="cpp-comment">// non-linear</span><br><br> <span class="cpp-comment">// make copy of source and destination addresses</span><br> UCHAR *dest_ptr = image_buffer;<br> UCHAR *src_ptr = bitmap.buffer;<br><br> <span class="cpp-comment">// memory is non-linear, copy line by line</span><br> <span class="cpp-keyword">for</span> (<span class="cpp-keyword">int</span> y=<span class="cpp-number">0</span>; y < SCREEN_HEIGHT; y++){<br> <span class="cpp-comment">// copy line</span><br> memcpy((<span class="cpp-keyword">void</span> *)dest_ptr, (<span class="cpp-keyword">void</span> *)src_ptr, SCREEN_WIDTH);<br><br> <span class="cpp-comment">// advance pointers to next line</span><br> dest_ptr+=ddsd.lPitch;<br> src_ptr +=SCREEN_WIDTH;<br> } <span class="cpp-comment">// end for</span><br><br> } <span class="cpp-comment">// end else</span><br><br> <span class="cpp-comment">// now unlock the primary surface</span><br> <span class="cpp-keyword">if</span> (FAILED(lpddsbackground->Unlock(NULL)))<br> <span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br> <span class="cpp-comment">// seed random number generator</span><br> srand(GetTickCount());<br><br> <span class="cpp-comment">//load the ship images</span><br> ship[<span class="cpp-number">0</span>] = DDraw_Create_Surface(SHIP_SIZE_X,SHIP_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> ship[<span class="cpp-number">1</span>] = DDraw_Create_Surface(SHIP_SIZE_X,SHIP_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,ship[<span class="cpp-number">0</span>],<span class="cpp-number">1</span>,<span class="cpp-number">1</span>);<br> Scan_Image_Bitmap(&bitmap,ship[<span class="cpp-number">1</span>],<span class="cpp-number">78</span>,<span class="cpp-number">1</span>);<br> <br> <span class="cpp-comment">//load the engine images</span><br> engines[<span class="cpp-number">0</span>] = DDraw_Create_Surface(ENGINE_SIZE_X,ENGINE_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> engines[<span class="cpp-number">1</span>] = DDraw_Create_Surface(ENGINE_SIZE_X,ENGINE_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> engines[<span class="cpp-number">2</span>] = DDraw_Create_Surface(ENGINE_SIZE_X,ENGINE_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,engines[<span class="cpp-number">0</span>],<span class="cpp-number">1</span>,<span class="cpp-number">88</span>);<br> Scan_Image_Bitmap(&bitmap,engines[<span class="cpp-number">1</span>],<span class="cpp-number">10</span>,<span class="cpp-number">88</span>);<br> Scan_Image_Bitmap(&bitmap,engines[<span class="cpp-number">2</span>],<span class="cpp-number">19</span>,<span class="cpp-number">88</span>);<br><br> <span class="cpp-comment">//load the thruster images</span><br> thrusters[<span class="cpp-number">0</span>] = DDraw_Create_Surface(THRUSTER_SIZE_X,THRUSTER_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> thrusters[<span class="cpp-number">1</span>] = DDraw_Create_Surface(THRUSTER_SIZE_X,THRUSTER_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,thrusters[<span class="cpp-number">0</span>],<span class="cpp-number">28</span>,<span class="cpp-number">88</span>);<br> Scan_Image_Bitmap(&bitmap,thrusters[<span class="cpp-number">1</span>],<span class="cpp-number">33</span>,<span class="cpp-number">88</span>);<br><br> <span class="cpp-comment">//load the photon images</span><br> photon[<span class="cpp-number">0</span>] = DDraw_Create_Surface(PHOTON_SIZE_X,PHOTON_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> photon[<span class="cpp-number">1</span>] = DDraw_Create_Surface(PHOTON_SIZE_X,PHOTON_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> photon[<span class="cpp-number">2</span>] = DDraw_Create_Surface(PHOTON_SIZE_X,PHOTON_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,photon[<span class="cpp-number">0</span>],<span class="cpp-number">1</span>,<span class="cpp-number">94</span>);<br> Scan_Image_Bitmap(&bitmap,photon[<span class="cpp-number">1</span>],<span class="cpp-number">12</span>,<span class="cpp-number">94</span>);<br> Scan_Image_Bitmap(&bitmap,photon[<span class="cpp-number">2</span>],<span class="cpp-number">23</span>,<span class="cpp-number">94</span>);<br><br> <span class="cpp-comment">//load the quantum images</span><br> quantum[<span class="cpp-number">0</span>] = DDraw_Create_Surface(QUANTUM_SIZE_X,QUANTUM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> quantum[<span class="cpp-number">1</span>] = DDraw_Create_Surface(QUANTUM_SIZE_X,QUANTUM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> quantum[<span class="cpp-number">2</span>] = DDraw_Create_Surface(QUANTUM_SIZE_X,QUANTUM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,quantum[<span class="cpp-number">0</span>],<span class="cpp-number">1</span>,<span class="cpp-number">105</span>);<br> Scan_Image_Bitmap(&bitmap,quantum[<span class="cpp-number">1</span>],<span class="cpp-number">12</span>,<span class="cpp-number">105</span>);<br> Scan_Image_Bitmap(&bitmap,quantum[<span class="cpp-number">2</span>],<span class="cpp-number">23</span>,<span class="cpp-number">105</span>);<br><br> <span class="cpp-comment">//load the explode images</span><br> explode[<span class="cpp-number">0</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">1</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">2</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">3</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">4</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">5</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> explode[<span class="cpp-number">6</span>] = DDraw_Create_Surface(EX_SIZE_X,EX_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">0</span>],<span class="cpp-number">101</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">1</span>],<span class="cpp-number">186</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">2</span>],<span class="cpp-number">271</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">3</span>],<span class="cpp-number">356</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">4</span>],<span class="cpp-number">441</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">5</span>],<span class="cpp-number">526</span>,<span class="cpp-number">66</span>);<br> Scan_Image_Bitmap(&bitmap,explode[<span class="cpp-number">6</span>],<span class="cpp-number">611</span>,<span class="cpp-number">66</span>);<br><br> <span class="cpp-comment">//load the alien image</span><br> alien[<span class="cpp-number">0</span>] = DDraw_Create_Surface(ALIEN_SIZE_X,ALIEN_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> alien[<span class="cpp-number">1</span>] = DDraw_Create_Surface(ALIEN_SIZE_X,ALIEN_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> alien[<span class="cpp-number">2</span>] = DDraw_Create_Surface(ALIEN_SIZE_X,ALIEN_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,alien[<span class="cpp-number">0</span>],<span class="cpp-number">155</span>,<span class="cpp-number">1</span>);<br> Scan_Image_Bitmap(&bitmap,alien[<span class="cpp-number">1</span>],<span class="cpp-number">218</span>,<span class="cpp-number">1</span>);<br> Scan_Image_Bitmap(&bitmap,alien[<span class="cpp-number">2</span>],<span class="cpp-number">281</span>,<span class="cpp-number">1</span>);<br><br> <span class="cpp-comment">//load the shield image</span><br> shield[<span class="cpp-number">0</span>] = DDraw_Create_Surface(SHIELD_SIZE_X,SHIELD_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> shield[<span class="cpp-number">1</span>] = DDraw_Create_Surface(SHIELD_SIZE_X,SHIELD_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> shield[<span class="cpp-number">2</span>] = DDraw_Create_Surface(SHIELD_SIZE_X,SHIELD_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> shield[<span class="cpp-number">3</span>] = DDraw_Create_Surface(SHIELD_SIZE_X,SHIELD_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,shield[<span class="cpp-number">0</span>],<span class="cpp-number">1</span>,<span class="cpp-number">63</span>);<br> Scan_Image_Bitmap(&bitmap,shield[<span class="cpp-number">1</span>],<span class="cpp-number">26</span>,<span class="cpp-number">63</span>);<br> Scan_Image_Bitmap(&bitmap,shield[<span class="cpp-number">2</span>],<span class="cpp-number">51</span>,<span class="cpp-number">63</span>);<br> Scan_Image_Bitmap(&bitmap,shield[<span class="cpp-number">3</span>],<span class="cpp-number">76</span>,<span class="cpp-number">63</span>);<br><br> <span class="cpp-comment">//load the torp image</span><br> torp[<span class="cpp-number">0</span>] = DDraw_Create_Surface(TORP_SIZE_X,TORP_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> torp[<span class="cpp-number">1</span>] = DDraw_Create_Surface(TORP_SIZE_X,TORP_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> torp[<span class="cpp-number">2</span>] = DDraw_Create_Surface(TORP_SIZE_X,TORP_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,torp[<span class="cpp-number">0</span>],<span class="cpp-number">101</span>,<span class="cpp-number">139</span>);<br> Scan_Image_Bitmap(&bitmap,torp[<span class="cpp-number">1</span>],<span class="cpp-number">138</span>,<span class="cpp-number">139</span>);<br> Scan_Image_Bitmap(&bitmap,torp[<span class="cpp-number">2</span>],<span class="cpp-number">175</span>,<span class="cpp-number">139</span>);<br> <br> <span class="cpp-comment">//load the beam image</span><br> beam[<span class="cpp-number">0</span>] = DDraw_Create_Surface(BEAM_SIZE_X,BEAM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> beam[<span class="cpp-number">1</span>] = DDraw_Create_Surface(BEAM_SIZE_X,BEAM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> beam[<span class="cpp-number">2</span>] = DDraw_Create_Surface(BEAM_SIZE_X,BEAM_SIZE_Y,<span class="cpp-number">0</span>,<span class="cpp-number">255</span>);<br> Scan_Image_Bitmap(&bitmap,beam[<span class="cpp-number">0</span>],<span class="cpp-number">0</span>,<span class="cpp-number">116</span>);<br> Scan_Image_Bitmap(&bitmap,beam[<span class="cpp-number">1</span>],<span class="cpp-number">12</span>,<span class="cpp-number">116</span>);<br> Scan_Image_Bitmap(&bitmap,beam[<span class="cpp-number">2</span>],<span class="cpp-number">23</span>,<span class="cpp-number">116</span>);<br><br> Unload_Bitmap_File(&bitmap);<br> <br> <span class="cpp-comment">//return success or failure or your own return code here</span><br> <span class="cpp-keyword">return</span>(<span class="cpp-number">1</span>);<br><br>} <span class="cpp-comment">//end Game_Init</span><br><br><span class="cpp-comment">/////////////////////////////////////////////////////////////</span><br><br><span class="cpp-keyword">int</span> Game_Shutdown(<span class="cpp-keyword">void</span> *parms = NULL, <span class="cpp-keyword">int</span> num_parms = <span class="cpp-number">0</span>)<br>{<br><span class="cpp-comment">// this is called after the game is exited and the main event</span><br><span class="cpp-comment">// loop while is exited, do all you cleanup and shutdown here</span><br><br><span class="cpp-comment">// kill all the surfaces</span><br><br><br><span class="cpp-comment">// first the palette</span><br><span class="cpp-keyword">if</span> (lpddpal)<br> {<br> lpddpal->Release();<br> lpddpal = NULL;<br> } <span class="cpp-comment">// end if</span><br><br><span class="cpp-comment">// now the primary surface</span><br><span class="cpp-keyword">if</span> (lpddsprimary)<br> {<br> lpddsprimary->Release();<br> lpddsprimary = NULL;<br> } <span class="cpp-comment">// end if</span><br><br><span class="cpp-comment">// now blow away the IDirectDraw4 interface</span><br><span class="cpp-keyword">if</span> (lpdd)<br> {<br> lpdd->Release();<br> lpdd = NULL;<br> } <span class="cpp-comment">// end if</span><br><br><span class="cpp-comment">// return success or failure or your own return code here</span><br><span class="cpp-keyword">return</span>(<span class="cpp-number">1</span>);<br><br>} <span class="cpp-comment">// end Game_Shutdown</span><br><br><span class="cpp-comment">// WINMAIN ////////////////////////////////////////////////</span><br><br><span class="cpp-keyword">int</span> WINAPI WinMain( HINSTANCE hinstance,<br> HINSTANCE hprevinstance,<br> LPSTR lpcmdline,<br> <span class="cpp-keyword">int</span> ncmdshow)<br>{<br><br>WNDCLASSEX winclass; <span class="cpp-comment">// this will hold the class we create</span><br>HWND hwnd; <span class="cpp-comment">// generic window handle</span><br>MSG msg; <span class="cpp-comment">// generic message</span><br>HDC hdc; <span class="cpp-comment">// graphics device context</span><br><br><span class="cpp-comment">// first fill in the window class stucture</span><br>winclass.cbSize = <span class="cpp-keyword">sizeof</span>(WNDCLASSEX);<br>winclass.style = CS_DBLCLKS | CS_OWNDC | <br> CS_HREDRAW | CS_VREDRAW;<br>winclass.lpfnWndProc = WindowProc;<br>winclass.cbClsExtra = <span class="cpp-number">0</span>;<br>winclass.cbWndExtra = <span class="cpp-number">0</span>;<br>winclass.hInstance = hinstance;<br>winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);<br>winclass.hCursor = LoadCursor(NULL, IDC_ARROW); <br>winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);<br>winclass.lpszMenuName = NULL;<br>winclass.lpszClassName = WINDOW_CLASS_NAME;<br>winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);<br><br><span class="cpp-comment">// save hinstance in global</span><br>hinstance_app = hinstance;<br><br><span class="cpp-comment">// register the window class</span><br><span class="cpp-keyword">if</span> (!RegisterClassEx(&winclass))<br> <span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// create the window</span><br><span class="cpp-keyword">if</span> (!(hwnd = CreateWindowEx(NULL, <span class="cpp-comment">// extended style</span><br> WINDOW_CLASS_NAME, <span class="cpp-comment">// class</span><br> <span class="cpp-literal">"GATGame Version 2.0"</span>, <span class="cpp-comment">// title</span><br> WS_POPUP | WS_VISIBLE,<br> <span class="cpp-number">0</span>,<span class="cpp-number">0</span>, <span class="cpp-comment">// initial x,y</span><br> SCREEN_WIDTH,SCREEN_HEIGHT, <span class="cpp-comment">// initial width, height</span><br> NULL, <span class="cpp-comment">// handle to parent </span><br> NULL, <span class="cpp-comment">// handle to menu</span><br> hinstance,<span class="cpp-comment">// instance of this application</span><br> NULL))) <span class="cpp-comment">// extra creation parms</span><br><span class="cpp-keyword">return</span>(<span class="cpp-number">0</span>);<br><br><span class="cpp-comment">// hide mouse</span><br>ShowCursor(<span class="cpp-keyword">FALSE</span>);<br><br><span class="cpp-comment">// save main window handle</span><br>main_window_handle = hwnd;<br><br><span class="cpp-comment">// initialize game here</span><br>Game_Init();<br><br><span class="cpp-comment">// enter main event loop</span><br><span class="cpp-keyword">while</span>(<span class="cpp-keyword">TRUE</span>)<br> {<br> <span class="cpp-comment">// test if there is a message in queue, if so get it</span><br> <span class="cpp-keyword">if</span> (PeekMessage(&msg,NULL,<span class="cpp-number">0</span>,<span class="cpp-number">0</span>,PM_REMOVE)){ <br> <span class="cpp-comment">// test if this is a quit</span><br> <span class="cpp-keyword">if</span> (msg.message == WM_QUIT)<br> <span class="cpp-keyword">break</span>;<br> <br> <span class="cpp-comment">// translate any accelerator keys</span><br> TranslateMessage(&msg);<br><br> <span class="cpp-comment">// send the message to the window proc</span><br> DispatchMessage(&msg);<br> } <span class="cpp-comment">// end if</span><br> <br> <span class="cpp-comment">// main game processing goes here</span><br> <span class="cpp-keyword">if</span>(GAME_STATE == <span class="cpp-number">0</span>){<br> Game_Intro();<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span>(GAME_STATE == <span class="cpp-number">1</span>){<br> Game_Main();<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span>(GAME_STATE == <span class="cpp-number">2</span>){<br> Game_Paused();<br> }<br> <span class="cpp-keyword">else</span> <span class="cpp-keyword">if</span>(GAME_STATE == <span class="cpp-number">3</span>){<br> Game_Done();<br> }<br> <span class="cpp-keyword">else</span>;<br> <br> } <span class="cpp-comment">// end while</span><br><br><span class="cpp-comment">// closedown game here</span><br>Game_Shutdown();<br><br><span class="cpp-comment">// return to Windows like this</span><br><span class="cpp-keyword">return</span>(msg.wParam);<br><br>} <span class="cpp-comment">// end WinMain</span><br><br></pre></div><!–ENDSCRIPT–><br><!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre><br><span class="cpp-comment">//screen.cpp - source file for the screen class</span><br><br><span class="cpp-directive">#include</span> <span class="cpp-literal">"screen.h"</span><br><br>SCREEN::SCREEN(){<br> lpdd = NULL; <span class="cpp-comment">// dd4 object</span><br> lpddsprimary = NULL; <span class="cpp-comment">// dd primary surface</span><br> lpddsback = NULL; <span class="cpp-comment">// dd back surface</span><br> lpddpal = NULL; <span class="cpp-comment">// a pointer to the created dd palette</span><br> lpddclipper = NULL; <span class="cpp-comment">// dd clipper</span><br> start_clock_count = <span class="cpp-number">0</span>;<br>}<br><br>SCREEN::SCREEN(<span class="cpp-keyword">const</span> SCREEN& other){<br> lpdd = other.lpdd; <br> lpddsprimary = other.lpddsprimary; <br> lpddsback = other.lpddsback; <br> lpddpal = other .lpddpal; <br> lpddclipper = other.lpddclipper; <br> <span class="cpp-comment">//copy the palette</span><br> <span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> i = <span class="cpp-number">0</span>; i < <span class="cpp-number">256</span>; i++){<br> palette<span style="font-weight:bold;"> = other.palette<span style="font-weight:bold;">;<br> }<br> <span class="cpp-comment">//copy the save_palette</span><br> <span class="cpp-keyword">for</span>(<span class="cpp-keyword">int</span> j = <span class="cpp-number">0</span>; j < <span class="cpp-number">256</span>; j++){<br> save_palette[j] = other.save_palette[j];<br> }<br> ddsd = other.ddsd;<br> ddbltfx = other.ddbltfx; <br> ddscaps = other.ddscaps;<br> ddrval = other.ddrval;<br> start_clock_count = other.start_clock_count;<br>}<br><br></pre></div><!–ENDSCRIPT–><br><!–STARTSCRIPT–><!–source lang="cpp"–><div class="source"><pre><br><span class="cpp-comment">//screen.h - header file for the screen class</span><br><br><span class="cpp-comment">/* Screen class infomation<br>the screen class is designed to hold all the data members used to output graphics onto the screen.<br>as well as any and all functions needed to setup the directX control of the screen. A game engine<br>should only have one screen object. any other class that needs to output to the screen should then<br>pass the screen object into it. this will allow for the class to output graphics or text onto the<br>screen.<br>*/</span><br><br><span class="cpp-directive">#include</span> <ddraw.h> <span class="cpp-comment">//for direct draw</span><br><br><span class="cpp-directive">#ifndef</span> __SCREEN__<br><span class="cpp-directive">#define</span> __SCREEN__<br><br><span class="cpp-keyword">class</span> SCREEN{<br><span class="cpp-keyword">public</span>:<br> <span class="cpp-comment">//constructors</span><br> SCREEN(); <span class="cpp-comment">//default</span><br> SCREEN(<span class="cpp-keyword">const</span> SCREEN& other); <span class="cpp-comment">//copy</span><br> <br> LPDIRECTDRAW4 lpdd; <span class="cpp-comment">// dd4 object</span><br> LPDIRECTDRAWSURFACE4 lpddsprimary; <span class="cpp-comment">// dd primary surface</span><br> LPDIRECTDRAWSURFACE4 lpddsback; <span class="cpp-comment">// dd back surface</span><br> LPDIRECTDRAWPALETTE lpddpal; <span class="cpp-comment">// a pointer to the created dd palette</span><br> LPDIRECTDRAWCLIPPER lpddclipper; <span class="cpp-comment">// dd clipper</span><br> PALETTEENTRY palette[<span class="cpp-number">256</span>]; <span class="cpp-comment">// color palette</span><br> PALETTEENTRY save_palette[<span class="cpp-number">256</span>]; <span class="cpp-comment">// used to save palettes</span><br> DDSURFACEDESC2 ddsd; <span class="cpp-comment">// a direct draw surface description struct</span><br> DDBLTFX ddbltfx; <span class="cpp-comment">// used to fill</span><br> DDSCAPS2 ddscaps; <span class="cpp-comment">// a direct draw surface capabilities struct</span><br> HRESULT ddrval; <span class="cpp-comment">// result back from dd calls</span><br> DWORD start_clock_count; <span class="cpp-comment">// used for timing</span><br><span class="cpp-keyword">private</span>:<br> <span class="cpp-keyword">bool</span> is_vaild; <span class="cpp-comment">//holds if this is a vaild screen.</span><br>};<br><br><span class="cpp-directive">#endif</span><br>[\source]<br><br>thank you <span class="cpp-keyword">for</span> any help you can give me, i'm rather confused.<br></pre></div><!–ENDSCRIPT–>
jwalsh thank you for explaining about the & operator. i thought it was talking about & used for derefuncing rather than joining to things together.
this is the line of code giving me this error:
if(FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,(LPVOID *)&screen().lpdd)))
it is line number 1468 in main.cpp
this is the line of code giving me this error:
if(FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,(LPVOID *)&screen().lpdd)))
it is line number 1468 in main.cpp
Quote:Original post by CodeMunkie
I think he meant post the line of code that is causing the error.
you might be right, but this way, at least we'll hopefully figure out the problem.
Get rid of the & symbol in that statement, and it may work. You are already typecasting it to be a pointer, so you don't need to say that it's a pointer as well with the & symbol.
You might try wrapping some parenthesis in that line. I may be wrong, but I think it is evaluating &screen() and then .lpdd which is not what you intended. Try this instead:
if(FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,(LPVOID *)&(screen().lpdd))))
No it is correct syntax. lpdd is a pointer, and he is casting to LPVOID* (pointer to pointer), so the & is necessary.
if(FAILED(lpdd_temp->QueryInterface(IID_IDirectDraw4,(LPVOID *)&(screen().lpdd))))
Quote:Get rid of the & symbol in that statement, and it may work. You are already typecasting it to be a pointer, so you don't need to say that it's a pointer as well with the & symbol.
No it is correct syntax. lpdd is a pointer, and he is casting to LPVOID* (pointer to pointer), so the & is necessary.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement