void OglText ( Display display, char *string, float x, float y, double dir ) { register OglParams *params = (OglParams *) display->parameters; double c, s; glprintf( (int) x, (int) y, ogl_font_height, "%s\n", string ); if ( display->cache_active ) { DisplayCacheItem *item; item = DisplayInsertCacheItem( display ); item->token = text_token; item->param.text.x = x; item->param.text.y = y; item->param.text.dir = dir; item->param.text.string = _strdup( string ); } if ( params->cpy ) { c = cos( dir ); s = sin( dir ); fprintf( params->cpy, "[%.2f %.2f %.2f %.2f %.2f %.2f] e\n", c, s, - s, c, ToAiX( x ), ToAiY( y ) ); fprintf( params->cpy, "(%s ) t\nT\n", string ); } }
int drawglscene() { int i,j; /* remember: positive x is right, positive y is up, positive z is out of the screen */ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); /* clear screen and depth buffer */ glBindTexture(GL_TEXTURE_2D,texture[0]); glColor3f(1,.5,1); glprintf(207,24,0,"GRID CRAZY"); glColor3f(1,1,0); glprintf(20,20,1,"Level:%2d",level2); glprintf(20,40,1,"Stage:%2d",stage); if(gameover) { glColor3ub(rand()%255,rand()%255,rand()%255); glprintf(472,20,1,"GAME OVER"); glprintf(456,40,1,"PRESS SPACE"); } /* draw n copies of player lives */ for(i=0;i<lives-1;i++) { glLoadIdentity(); glTranslatef(490+i*40,40,0); glRotatef(-player.spin,0,0,1); glColor3f(0,1,0); glBegin(GL_LINES); glVertex2d(-5,-5); glVertex2d(5,5); glVertex2d(5,-5); glVertex2d(-5,5); glEnd(); glRotatef(-player.spin*0.5,0,0,1); glColor3f(0,.75,0); glBegin(GL_LINES); glVertex2d(-7,0); glVertex2d(7,0); glVertex2d(0,-7); glVertex2d(0,7); glEnd(); } filled=1; glLineWidth(2); glDisable(GL_LINE_SMOOTH); glLoadIdentity(); for(i=0;i<11;i++) for(j=0;j<11;j++) { if(hline[i][j]) glColor3f(1,1,1); else glColor3f(0,.5,1); if(i<10) { if(!hline[i][j]) filled=0; glBegin(GL_LINES); glVertex2d(20+i*60,70+j*40); glVertex2d(80+i*60,70+j*40); glEnd(); } if(vline[i][j]) glColor3f(1,1,1); else glColor3f(0,.5,1); if(j<10) { if(!vline[i][j]) filled=0; glBegin(GL_LINES); glVertex2d(20+i*60,70+j*40); glVertex2d(20+i*60,110+j*40); glEnd(); } glEnable(GL_TEXTURE_2D); glColor3f(1,1,1); glBindTexture(GL_TEXTURE_2D,texture[1]); if(i<10 && j<10) { if(hline[i][j]&&hline[i][j+1]&&vline[i+1][j]&&vline[i][j]) { glBegin(GL_QUADS); glTexCoord2f(i/10.0+.1,1-j/10.0); glVertex2d(79+i*60,71+j*40); glTexCoord2f(i/10.0,1-j/10.0); glVertex2d(21+i*60,71+j*40); glTexCoord2f(i/10.0,1-j/10.0+0.1); glVertex2f(21+i*60,109+j*40); glTexCoord2f(i/10.0+0.1,1-j/10.0+0.1); glVertex2f(79+i*60,109+j*40); glEnd(); } } glDisable(GL_TEXTURE_2D); } glLineWidth(1); if(anti) glEnable(GL_LINE_SMOOTH); if(hourglass.fx==1) { glLoadIdentity(), glTranslatef(20+hourglass.x*60,70+hourglass.y*40,0); glRotatef(hourglass.spin,0,0,1); glColor3ub(rand()%255,rand()%255,rand()%255 ); glBegin(GL_LINES); glVertex2d(-5,-5); glVertex2d(5,5); glVertex2d(5,-5); glVertex2d(-5,5); glVertex2d(-5,5); glVertex2d(5,5); glVertex2d(-5,-5); glVertex2d(5,-5); glEnd(); } glLoadIdentity(); glTranslatef(player.fx+20,player.fy+70,0); glRotatef(player.spin,0,0,1); glColor3f(0,1,0); glBegin(GL_LINES); glVertex2d(-5,-5); glVertex2d(5,5); glVertex2d(5,-5); glVertex2d(-5,5); glEnd(); glRotatef(player.spin*.5,0,0,1); glColor3f(0,.75,0); glBegin(GL_LINES); glVertex2d(-7,0); glVertex2d(7,0); glVertex2d(0,-7); glVertex2d(0,7); glEnd(); for(i=0;i<stage*level;i++) { glLoadIdentity(); glTranslatef(enemy[i].fx+20,enemy[i].fy+70,0); glColor3f(1,.5,.5); glBegin(GL_LINES); glVertex2d(0,-7); glVertex2d(-7,0); glVertex2d(-7,0); glVertex2d(0,7); glVertex2d(0,7); glVertex2d(7,0); glVertex2d(7,0); glVertex2d(0,-7); glEnd(); glRotatef(enemy[i].spin,0,0,1); glColor3f(1,0,0); glBegin(GL_LINES); glVertex2d(-7,-7); glVertex2d(7,7); glVertex2d(-7,7); glVertex2d(7,-7); glEnd(); } SDL_GL_SwapBuffers(); /* show our changes! needed when double buffering is on */ return 1; }
// Draw the comment void COMMENT::draw(float ypos) { // Set the color and draw the string glColor4f(comment_colors[color][0],comment_colors[color][1],comment_colors[color][2], alpha); glprintf(font1, 0, pos, ypos, -25, text); }
// Draw the menu void draw_menu(int menu_id, int menu_item, int place, float fade, HISCORE_LIST *list) { glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); //glClear(GL_DEPTH_BUFFER_BIT); // Set up the viewport glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(30.0f, 1.333333f, 1, 100); glTranslatef(0,0,-32); // Draw the background glMatrixMode(GL_MODELVIEW); glLoadIdentity(); BIND_TEXTURE(menu_bg); glDepthMask(GL_FALSE); float bx = bx_roll; float by = by_roll; glBegin(GL_TRIANGLE_STRIP); glColor3f(.1f,1,1); glTexCoord2f(-bx + 1,-by + 1); glVertex3f(14, 14, -2); glTexCoord2f(-bx + 0,-by + 1); glVertex3f(-14, 14, -2); glColor3f(0,0.4f,0.7f); glTexCoord2f(-bx + 1,-by + 0); glVertex3f(14, -14, -2); glTexCoord2f(-bx + 0,-by + 0); glVertex3f(-14, -14, -2); glEnd(); float rot = -5.0f; glEnable(GL_BLEND); for(int f=0; f<5; f++) { glRotatef(rot * SIN(back_anim), 0,0,1); glBegin(GL_TRIANGLE_STRIP); glColor4f(0.1f,1,1,.25f); glTexCoord2f(-bx + 1,-by + 1); glVertex3f(14, 14, -2); glTexCoord2f(-bx + 0,-by + 1); glVertex3f(-14, 14, -2); glColor4f(0,0.4f,0.7f,.25f); glTexCoord2f(-bx + 1,-by + 0); glVertex3f(14, -14, -2); glTexCoord2f(-bx + 0,-by + 0); glVertex3f(-14, -14, -2); glEnd(); rot += (1.0f * COS(back_anim)); } glDepthMask(GL_TRUE); // Begin font drawing begin_fonts(); glLoadIdentity(); // Draw the logo glEnable(GL_BLEND); BIND_TEXTURE(logo_tex); glPushMatrix(); glTranslatef(0,4.5f,-13); glRotatef(20.0f * COS(back_anim), 1,0,0); glColor3f(1,1,1); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,1); glVertex3f( 4, .5f, 0); glTexCoord2f(0,1); glVertex3f(-4, .5f, 0); glTexCoord2f(1,0); glVertex3f( 4,-.5f, 0); glTexCoord2f(0,0); glVertex3f(-4,-.5f, 0); glEnd(); glPopMatrix(); // Draw the hiscores/credits if(menu_id == MENU_ID_MAIN || menu_id == MENU_ID_START) { if(mid_state == 1) hiscore_1.draw(-1, mid_fade_amount); else if(mid_state == 2) hiscore_2.draw(-1, mid_fade_amount); else if(mid_state == 3) draw_credits(mid_fade_amount); } // Draw the version number set_font_scale(0.3f, 0.3f); glColor4f(1,1,1,0.3f); glprintf(font1, 0, -7.0f, -5.3f, -13, VERSION); set_font_scale(1,1); // Draw the hilighted hiscore list if we're typing a name if(place != -1 && list != NULL) list->draw(place, 1.0f); // Draw the menuitem background stripe BIND_TEXTURE(0); glColor4f(0,0,0,0.1f); glPushMatrix(); glTranslatef(0,-4.0f, -13); glBegin(GL_TRIANGLE_STRIP); glVertex3f(10,.57f,0); glVertex3f(-10,.57f,0); glVertex3f(10,-.57f,0); glVertex3f(-10,-.57f,0); glEnd(); glPopMatrix(); // Draw the menuitems if(menu_id == MENU_ID_MAIN) { // START if(menu_item == MENU_START) glColor3fv(col_selected); else glColor3fv(col_normal); BIND_TEXTURE(button_tex); glPushMatrix(); glTranslatef(-4.0f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,1); glVertex3f( 2, .5f, 0); glTexCoord2f(0,1); glVertex3f(-2, .5f, 0); glTexCoord2f(1,.75f); glVertex3f( 2,-.5f, 0); glTexCoord2f(0,.75f); glVertex3f(-2,-.5f, 0); glEnd(); glPopMatrix(); // OPTIONS if(menu_item == MENU_OPTIONS) glColor3fv(col_selected); else glColor3fv(col_normal); glPushMatrix(); glTranslatef(0, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,.75f); glVertex3f( 2, .5f, 0); glTexCoord2f(0,.75f); glVertex3f(-2, .5f, 0); glTexCoord2f(1,.5f); glVertex3f( 2,-.5f, 0); glTexCoord2f(0,.5f); glVertex3f(-2,-.5f, 0); glEnd(); glPopMatrix(); // EXIT if(menu_item == MENU_EXIT) glColor3fv(col_selected); else glColor3fv(col_normal); glPushMatrix(); glTranslatef(4.0f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,.5f); glVertex3f( 2, .5f, 0); glTexCoord2f(0,.5f); glVertex3f(-2, .5f, 0); glTexCoord2f(1,.25f); glVertex3f( 2,-.5f, 0); glTexCoord2f(0,.25f); glVertex3f(-2,-.5f, 0); glEnd(); glPopMatrix(); } else if(menu_id == MENU_ID_START) { // SINGLE PLAYER if(menu_item == MENU_SINGLEPLAY) glColor3fv(col_selected); else glColor3fv(col_normal); BIND_TEXTURE(button_tex2); glPushMatrix(); glTranslatef(-2.0f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,1); glVertex3f( 2, .85f, 0); glTexCoord2f(0,1); glVertex3f(-2, .85f, 0); glTexCoord2f(1,.5f); glVertex3f( 2,-.85f, 0); glTexCoord2f(0,.5f); glVertex3f(-2,-.85f, 0); glEnd(); glPopMatrix(); // TWO PLAYERS if(menu_item == MENU_MULTIPLAY) glColor3fv(col_selected); else glColor3fv(col_normal); glPushMatrix(); glTranslatef(2.0f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,.5f); glVertex3f( 2, .85f, 0); glTexCoord2f(0,.5f); glVertex3f(-2, .85f, 0); glTexCoord2f(1,0); glVertex3f( 2,-.85f, 0); glTexCoord2f(0,0); glVertex3f(-2,-.85f, 0); glEnd(); glPopMatrix(); } else if(menu_id == MENU_ID_OPTIONS) { int who = whose_keys; // Settings for ... set_font_scale(0.6f, 0.5f); if(menu_item == MENU_WHOSEKEYS) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, 3.0f, -13, "Settings for: %s", (whose_keys == 0) ? "PLAYER ONE" : "PLAYER TWO"); // Moving style if(menu_item == MENU_MOVSTYLE) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, 2.5f, -13, "Moving style: %s", (config.moving_style[who] == 1) ? "RELATIVE" : "ABSOLUTE"); // Key up if(menu_item == MENU_KEYUP) glColor3fv(col_selected2); else glColor3fv(col_normal2); if(config.moving_style[who] == 1) glprintf(font1, 0, -5.0f, 2.0f, -13, "Move forward: %s", key_name(config.key_up[who])); else glprintf(font1, 0, -5.0f, 2.0f, -13, "Move up: %s", key_name(config.key_up[who])); // Key down if(menu_item == MENU_KEYDOWN) glColor3fv(col_selected2); else glColor3fv(col_normal2); if(config.moving_style[who] == 1) glprintf(font1, 0, -5.0f, 1.5f, -13, "Turn around: %s", key_name(config.key_down[who])); else glprintf(font1, 0, -5.0f, 1.5f, -13, "Move down: %s", key_name(config.key_down[who])); // Key left if(menu_item == MENU_KEYLEFT) glColor3fv(col_selected2); else glColor3fv(col_normal2); if(config.moving_style[who] == 1) glprintf(font1, 0, -5.0f, 1.0f, -13, "Turn left: %s", key_name(config.key_left[who])); else glprintf(font1, 0, -5.0f, 1.0f, -13, "Move left: %s", key_name(config.key_left[who])); // Key right if(menu_item == MENU_KEYRIGHT) glColor3fv(col_selected2); else glColor3fv(col_normal2); if(config.moving_style[who] == 1) glprintf(font1, 0, -5.0f, 0.5f, -13, "Turn right: %s", key_name(config.key_right[who])); else glprintf(font1, 0, -5.0f, 0.5f, -13, "Move right: %s", key_name(config.key_right[who])); // Key bomb if(menu_item == MENU_KEYBOMB) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, 0.0f, -13, "Throw a bomb: %s", key_name(config.key_shoot[who])); // Key special if(menu_item == MENU_KEYSPECIAL) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, -0.5f, -13, "Use a special: %s", key_name(config.key_special[who])); // Sound volume slider if(menu_item == MENU_SOUNDVOL) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, -1.5f, -13, "Sound volume:"); glPushMatrix(); glTranslatef(2.0f, -1.5f, -13); glColor3f(0,0,0.5f); BIND_TEXTURE(0); glBegin(GL_TRIANGLE_STRIP); glColor3f(0,0,0); glVertex2f(3, 0.55f); glVertex2f(0, 0.55f); glColor3f(0,0,0.5f); glVertex2f(3, 0.0f); glVertex2f(0, 0.0f); glEnd(); glColor3f(0.5f,0.5f,1); float vol = (float)config.sound_vol / 255.0f; glBegin(GL_TRIANGLE_STRIP); glColor3f(0.5f,0.5f,1); glVertex2f(2.95f * vol, 0.50f); glVertex2f(0.05f, 0.50f); glColor3f(0.25f,0.25f,0.5f); glVertex2f(2.95f * vol, 0.05f); glVertex2f(0.05f, 0.05f); glEnd(); glPopMatrix(); // Music volume slider if(menu_item == MENU_MUSICVOL) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, -2.0f, -13, "Music volume:"); glPushMatrix(); glTranslatef(2.0f, -2.0f, -13); BIND_TEXTURE(0); glBegin(GL_TRIANGLE_STRIP); glColor3f(0,0,0); glVertex2f(3, 0.55f); glVertex2f(0, 0.55f); glColor3f(0,0,0.5f); glVertex2f(3, 0.0f); glVertex2f(0, 0.0f); glEnd(); vol = (float)config.music_vol / 255.0f; glBegin(GL_TRIANGLE_STRIP); glColor3f(0.5f,0.5f,1); glVertex2f(2.95f * vol, 0.50f); glVertex2f(0.05f, 0.50f); glColor3f(0.25f,0.25f,0.5f); glVertex2f(2.95f * vol, 0.05f); glVertex2f(0.05f, 0.05f); glEnd(); glPopMatrix(); // Toggle perspective mode if(menu_item == MENU_PERSPECTIVE) glColor3fv(col_selected2); else glColor3fv(col_normal2); glprintf(font1, 0, -5.0f, -3.0f, -13, "Perspective mode: %s", (config.perspective_mode) ? "ON" : "OFF"); set_font_scale(1,1); // OK if(menu_item == MENU_OK) glColor3fv(col_selected); else glColor3fv(col_normal); BIND_TEXTURE(button_tex); glPushMatrix(); glTranslatef(-2.25f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(.25f,.25f); glVertex3f( .5f, .5f, 0); glTexCoord2f(0,.25f); glVertex3f(-.5f, .5f, 0); glTexCoord2f(.25f,0); glVertex3f( .5f,-.5f, 0); glTexCoord2f(0,0); glVertex3f(-.5f,-.5f, 0); glEnd(); glPopMatrix(); // CANCEL if(menu_item == MENU_CANCEL) glColor3fv(col_selected); else glColor3fv(col_normal); glPushMatrix(); glTranslatef(2.25f, -4.0f, -13); glRotatef(20.0f * SIN(back_anim), 1,0,0); glBegin(GL_TRIANGLE_STRIP); glTexCoord2f(1,.25f); glVertex3f( 1.5f, .5f, 0); glTexCoord2f(.25f,.25f); glVertex3f(-1.5f, .5f, 0); glTexCoord2f(1,0); glVertex3f( 1.5f,-.5f, 0); glTexCoord2f(.25f,0); glVertex3f(-1.5f,-.5f, 0); glEnd(); glPopMatrix(); } // Draw the fade if(fade != 0.0f) { glLoadIdentity(); BIND_TEXTURE(0); glColor4f(0,0,0,fade_amount); glBegin(GL_TRIANGLE_STRIP); glVertex3f(4, 3, -2); glVertex3f(-4, 3, -2); glVertex3f(4,-3,-2); glVertex3f(-4,-3,-2); glEnd(); } end_fonts(); }