//The Display of the game void render(Game *game) { float w, h, x, y; Duck *d = game->duck; deadDuck *dd = game->deadD; freeDuck *fd = game->freeD; Dog *doge = game->dog; happyDog *hdoge = game->hdog; laughingDog *ldoge = game->ldog; struct timespec dt; clock_gettime(CLOCK_REALTIME, &dt); glColor3ub(255, 255, 255); glClearColor(1.0, 1.0, 1.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); //Background and Gameover being displayed if(background) { glBindTexture(GL_TEXTURE_2D, backgroundTexture); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex2i(0, 0); glTexCoord2f(0.0f, 0.0f); glVertex2i(0, WINDOW_HEIGHT); glTexCoord2f(1.0f, 0.0f); glVertex2i(WINDOW_WIDTH, WINDOW_HEIGHT); glTexCoord2f(1.0f, 1.0f); glVertex2i(WINDOW_WIDTH, 0); glEnd(); } if(gameover) { glBindTexture(GL_TEXTURE_2D, gameoverbgTexture); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex2i(0, 0); glTexCoord2f(0.0f, 0.0f); glVertex2i(0, WINDOW_HEIGHT); glTexCoord2f(1.0f, 0.0f); glVertex2i(WINDOW_WIDTH, WINDOW_HEIGHT); glTexCoord2f(1.0f, 1.0f); glVertex2i(WINDOW_WIDTH, 0); glEnd(); } glDisable(GL_TEXTURE_2D); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, 0); //---------------------------------------- //Drawing Shapes glColor3ub(255, 255, 255); glBegin(GL_LINES); glVertex2f(0.0, game->floor); glVertex2f(WINDOW_WIDTH, game->floor); glEnd(); Rect r; r.bot = WINDOW_HEIGHT - 550; r.left = WINDOW_WIDTH - 715; r.center = 0; menu(game); Shape *s; //Displaying bullets glColor3ub(90, 140, 90); s = &game->box[0]; glPushMatrix(); glTranslatef(s->center.x, s->center.y, s->center.z); w = s->width; h = s->height; int num = 0, dist = 0; if (game->bullets == 3) { num = 3, dist = 80; } if (game->bullets == 2) { num = 2, dist = 60; } if (game->bullets == 1) { num = 1, dist = 40; } if (game->bullets == 0) { num = 0, dist = 0; } if (game->bullets != 0) { for (int i=0;i<num;i++) { bullet_sprite.pos[0] = dist - (i * 20); bullet_sprite.pos[1] = 40; bullet_sprite.pos[2] = 0; float wid = 10.0f; glPushMatrix(); glTranslatef(bullet_sprite.pos[0], bullet_sprite.pos[1], bullet_sprite.pos[2]); glBindTexture(GL_TEXTURE_2D, bulletTexture); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glColor4ub(255,255,255,255); glBegin(GL_QUADS); if (bullet_sprite.vel[0] > 0.0) { glTexCoord2f(0.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(0.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(1.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(1.0f, 1.0f); glVertex2i( wid,-wid); } else { glTexCoord2f(1.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(1.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(0.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(0.0f, 1.0f); glVertex2i( wid,-wid); } glEnd(); glPopMatrix(); glDisable(GL_ALPHA_TEST); } } r.bot = s->height; r.left = s->width; glVertex2i(-w, -h); glVertex2i(-w, h); glVertex2i(w, h); glVertex2i(w, -h); glEnd(); //ggprint16(&r , 16, 0x00ffffff, "%i", game->bullets); glPopMatrix(); //------------------------------------------------------------------- //Displaying duck score sprites glColor3ub(90, 140, 90); s = &game->box[1]; glPushMatrix(); glTranslatef(s->center.x, s->center.y, s->center.z); w = s->width; h = s->height; if (game->duckShot <= 10) { for (int i=0;i<=9;i++) { duckscore_sprite.pos[0] = 70 + (i * 25); duckscore_sprite.pos[1] = 42; duckscore_sprite.pos[2] = 0; float wid = 10.0f; glPushMatrix(); glTranslatef(duckscore_sprite.pos[0], duckscore_sprite.pos[1], duckscore_sprite.pos[2]); glBindTexture(GL_TEXTURE_2D, duckscoreTexture); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glColor4ub(255,255,255,255); glBegin(GL_QUADS); if (duckscore_sprite.vel[0] > 0.0) { glTexCoord2f(0.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(0.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(1.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(1.0f, 1.0f); glVertex2i( wid,-wid); } else { glTexCoord2f(1.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(1.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(0.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(0.0f, 1.0f); glVertex2i( wid,-wid); } glEnd(); glPopMatrix(); glDisable(GL_ALPHA_TEST); } } int loop = 0; if (game->duckShot == 1) loop = 1; if (game->duckShot == 2) loop = 2; if (game->duckShot == 3) loop = 3; if (game->duckShot == 4) loop = 4; if (game->duckShot == 5) loop = 5; if (game->duckShot == 6) loop = 6; if (game->duckShot == 7) loop = 7; if (game->duckShot == 8) loop = 8; if (game->duckShot == 9) loop = 9; if (game->duckShot == 10) loop = 10; if (game->duckShot <= 9) { for (int i=0;i<loop;i++) { duckscore_sprite2.pos[0] = 70 + (i * 25); duckscore_sprite2.pos[1] = 42; duckscore_sprite2.pos[2] = 0; float wid = 10.0f; glPushMatrix(); glTranslatef(duckscore_sprite2.pos[0], duckscore_sprite2.pos[1], duckscore_sprite2.pos[2]); glBindTexture(GL_TEXTURE_2D, duckscoreTexture2); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glColor4ub(255,255,255,255); glBegin(GL_QUADS); if (duckscore_sprite2.vel[0] > 0.0) { glTexCoord2f(0.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(0.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(1.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(1.0f, 1.0f); glVertex2i( wid,-wid); } else { glTexCoord2f(1.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(1.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(0.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(0.0f, 1.0f); glVertex2i( wid,-wid); } glEnd(); glPopMatrix(); glDisable(GL_ALPHA_TEST); } } r.bot = s->height; r.left = s->width; glVertex2i(-w, -h); glVertex2i(-w, h); glVertex2i(w, h); glVertex2i(w, -h); glEnd(); if(!d && game->duckCount >= 10 && game->duckShot < 6) { ggprint16(&r , 16, 0x00ffffff, "GAME OVER"); } //ggprint16(&r , 16, 0x00ffffff, "%i / 10", game->duckShot); glPopMatrix(); glColor3ub(90, 140, 90); s = &game->box[2]; glPushMatrix(); glTranslatef(s->center.x, s->center.y, s->center.z); w = s->width; h = s->height; r.bot = s->height; r.left = s->width; glVertex2i(-w, -h); glVertex2i(-w, h); glVertex2i(w, h); glVertex2i(w, -h); glEnd(); ggprint16(&r , 16, 0x00ffffff, "%i", game->score); glPopMatrix(); glColor3ub(90, 140, 90); s = &game->box[3]; glPushMatrix(); glTranslatef(s->center.x, s->center.y, s->center.z); w = s->width; h = s->height; r.bot = s->height; r.left = s->width; glVertex2i(-w, -h); glVertex2i(-w, h); glVertex2i(w, h); glVertex2i(w, -h); glEnd(); ggprint16(&r , 16, 0x00ffffff, "%i", game->rounds); glPopMatrix(); if(game->afterDog && game->onScreen == 0 && game->dogGone && game->n == 0 && game->waitForDog) { if(game->duckCaptured >= 1) makeHappyDog(game, WINDOW_WIDTH / 2, game->floor + 51); else makeLaughingDog(game, WINDOW_WIDTH / 2, game->floor + 51); game->afterDog = false; game->duckCaptured = 0; } if(!d && game->duckCount >= 10 && game->duckShot >= 6 && game->dogGone && !game->waitForDog && game->onScreen == 0 && game->n == 0) { game->rounds++; game->duckCount = 0; game->duckShot = 0; game->animateDog = true; game->dogGone = false; game->afterDog = true; game->waitForDog = false; } if((game->oneDuck || game->twoDuck) && game->dogGone && !game->waitForDog) { if(!d && game->duckCount >= 10 && game->duckShot < 6) { while(d) { deleteDuck(game, d); d = d->next; } game->oneDuck = false; game->twoDuck = false; std::cout << "GAME OVER" << std::endl; } if(!d && game->oneDuck && game->duckCount < 10 && game->onScreen == 0 && game->n == 0) { game->bullets = 3; makeDuck(game, rand() % (WINDOW_WIDTH - 50 - 1) + 50 + 1, game->floor + 50 + 1); game->duckCount++; } if(!d && game->twoDuck && game->duckCount < 9 && game->onScreen == 0 && game->n == 0) { game->bullets = 3; makeDuck(game, rand() % (WINDOW_WIDTH - 50 - 1) + 50 + 1, game->floor + 50 + 1); makeDuck(game, rand() % (WINDOW_WIDTH - 50 - 1) + 50 + 1, game->floor + 50 + 1); game->duckCount += 2; } } //Main Duck rendering duck_sprite.pos[0] = s->center.x; glColor3ub(255, 255, 255); while(d) { w = d->s.width; h = d->s.height; x = d->s.center.x; y = d->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); //This changes which duck it points to show_duck= 1; float wid = 50.0f; duck_sprite.pos[0] = x; duck_sprite.pos[1] = y; duck_sprite.pos[2] = s->center.z; d = d->next; duck_sprite2.pos[0] = x; duck_sprite2.pos[1] = y; duck_sprite2.pos[2] = s->center.z; if(show_duck) { glPushMatrix(); glTranslatef(duck_sprite.pos[0], duck_sprite.pos[1], duck_sprite.pos[2]); //remove if statement and make //a while loop to take in both duck if (silhouette) { //glBind makes the duck texture glBindTexture(GL_TEXTURE_2D, duckTexture); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glColor4ub(255,255,255,255); } glBegin(GL_QUADS); if (duck_sprite.vel[0] > 0.0) { glTexCoord2f(0.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(0.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(1.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(1.0f, 1.0f); glVertex2i( wid,-wid); } else { glTexCoord2f(1.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(1.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(0.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(0.0f, 1.0f); glVertex2i( wid,-wid); } //Duck2 /* glTranslatef(duck_sprite2.pos[0], duck_sprite2.pos[1], duck_sprite2.pos[2]); if (silhouette) { glBindTexture(GL_TEXTURE_2D, duckTexture2); glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GREATER, 0.0f); glColor4ub(255,255,255,255); } glBegin(GL_QUADS); if (duck_sprite2.vel[0] > 0.0) { glTexCoord2f(0.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(0.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(1.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(1.0f, 1.0f); glVertex2i( wid,-wid); } else { glTexCoord2f(1.0f, 1.0f); glVertex2i(-wid,-wid); glTexCoord2f(1.0f, 0.0f); glVertex2i(-wid, wid); glTexCoord2f(0.0f, 0.0f); glVertex2i( wid, wid); glTexCoord2f(0.0f, 1.0f); glVertex2i( wid,-wid); } */ glEnd(); glPopMatrix(); //Transparent part if (trees && silhouette) { glBindTexture(GL_TEXTURE_2D, backgroundTransTexture); glBegin(GL_QUADS); glTexCoord2f(0.0f, 1.0f); glVertex2i(0, 0); glTexCoord2f(0.0f, 0.0f); glVertex2i(0, WINDOW_HEIGHT); glTexCoord2f(1.0f, 0.0f); glVertex2i(WINDOW_WIDTH, WINDOW_HEIGHT); glTexCoord2f(1.0f, 1.0f); glVertex2i(WINDOW_WIDTH, 0); glEnd(); } glDisable(GL_ALPHA_TEST); } } //---------------------------------------------------- glColor3ub(255, 0, 0); while(dd) { double ts = timeDiff(&dd->time, &dt); w = dd->s.width; h = dd->s.height; x = dd->s.center.x; y = dd->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); r.bot = y + h; r.left = x - (w/2); if(ts < 0.3) { if(dd->points == true) ggprint16(&r , 16, 0x00ffffff, "200"); else ggprint16(&r , 16, 0x00ffffff, "100"); } dd = dd->next; } glColor3ub(0, 0, 255); while(fd) { w = fd->s.width; h = fd->s.height; x = fd->s.center.x; y = fd->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); fd = fd->next; } if(game->animateDog) { makeDog(game, 100, game->floor + 51); game->animateDog = false; } glColor3ub(0, 0, 0); while(doge) { w = doge->s.width; h = doge->s.height; x = doge->s.center.x; y = doge->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); doge = doge->next; } glColor3ub(100, 100, 255); while(hdoge) { w = hdoge->s.width; h = hdoge->s.height; x = hdoge->s.center.x; y = hdoge->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); hdoge = hdoge->next; } glColor3ub(255, 100, 100); while(ldoge) { w = ldoge->s.width; h = ldoge->s.height; x = ldoge->s.center.x; y = ldoge->s.center.y; glBegin(GL_QUADS); glVertex2f(x-w, y+h); glVertex2f(x-w, y-h); glVertex2f(x+w, y-h); glVertex2f(x+w, y+h); glEnd(); ldoge = ldoge->next; } }
void check_mouse(XEvent *e, Game *game) { int y = WINDOW_HEIGHT - e->xbutton.y; Duck *d = game->duck; Duck *saved = new Duck; struct timespec dt; clock_gettime(CLOCK_REALTIME, &dt); double ts; if (e->type == ButtonRelease) { return; } if (e->type == ButtonPress) { if (e->xbutton.button==1) { //#ifdef USE_SOUND ////////////////////////////////////////////////// //Left button was pressed while(d) { fmod_playsound(0); if(e->xbutton.x >= d->s.center.x - d->s.width && e->xbutton.x <= d->s.center.x + d->s.width && y <= d->s.center.y + d->s.height && y >= d->s.center.y - d->s.height) { makeDeadDuck(game, d); ts = timeDiff(&d->time, &dt); if(ts < 1.5) { game->deadD->points = true; game->score += 200; } else { game->deadD->points = false; game->score += 100; } saved = d->next; deleteDuck(game, d); d = saved; game->bullets--; game->duckShot++; game->duckCaptured++; if(game->bullets < 1) { if(game->n == 1) { makeFreeDuck(game, d); saved = d->next; deleteDuck(game, d); d = saved; } return; } return; } if(game->n == 2) { d = d->next; if(e->xbutton.x >= d->s.center.x - d->s.width && e->xbutton.x <= d->s.center.x + d->s.width && y <= d->s.center.y + d->s.height && y >= d->s.center.y - d->s.height) { makeDeadDuck(game, d); ts = timeDiff(&d->time, &dt); if(ts < 1.5) { game->deadD->points = true; game->score += 200; } else { game->deadD->points = false; game->score += 100; } saved = d->prev; deleteDuck(game, d); d = saved; game->bullets--; game->duckShot++; game->duckCaptured++; if(game->bullets < 1) { if(game->n == 1) { makeFreeDuck(game, d); saved = d->next; deleteDuck(game, d); d = saved; } return; } return; } } if(game->bullets <= 1) { game->bullets--; if(game->n == 2) { d = d->prev; } makeFreeDuck(game, d); saved = d->next; deleteDuck(game, d); d = saved; if(game->n == 1) { makeFreeDuck(game, d); saved = d->next; deleteDuck(game, d); d = saved; } return; } game->bullets--; d = d->next; } } //#endif } if (e->xbutton.button==3) { //Right button was pressed return; } }