From 021d8330718e00020821f5798db7e3db7cae4d3e Mon Sep 17 00:00:00 2001 From: Thomas Perl Date: Sat, 1 Sep 2007 01:56:38 +0200 Subject: [PATCH] Tennix 0.3.3: Dynamic Text Engine This is Tennix 0.3.3, adding the first version of our dynamic text engine, which enables us drawing animated bit-mapped fonts to the screen. Currently used in menus and as gameplay status. This also disables loading the custom icon (SDL_WM_SetIcon) when Tennix is ran on Mac OS X, as Tennix on OS X already has a beatiful icon and OS X doesn't display per-window icons. --- data/menu.png | Bin 28254 -> 25152 bytes data/smallish-font.png | Bin 0 -> 687 bytes game.c | 21 ++++++++- game.h | 1 + graphics.c | 124 ++++++++++++++++++++++++++++++++++++++++++++++++- graphics.h | 14 ++++++ makefile | 2 +- tennix.c | 9 ++++ 8 files changed, 168 insertions(+), 3 deletions(-) create mode 100644 data/smallish-font.png diff --git a/data/menu.png b/data/menu.png index 68faf5f701a36d9631018b992a15b0358c9d2b1f..de39f73d5d650b24ff06622c32696c2477fbf59c 100644 GIT binary patch delta 6886 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 diff --git a/data/smallish-font.png b/data/smallish-font.png new file mode 100644 index 0000000000000000000000000000000000000000..7f2a5f22f8b5399936b56fe20267713176af6eec GIT binary patch literal 687 zcwPao0#N;lP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2iFK6 z6eKp@nDwjx00J*bL_t(&-tAf2jsqbG#isxN%kD!bhUMl_(Vb0)hsF{G-A);C<5tUMEt?ieR zfD`{LIC7oxbsa{QQx5i+!U$=9X)HY6j^p;#Pz71Z84{2wb zFshD+If5SwjdGAOygdRFK-;MaHoPWi@->kwP#6gPG%ej9g#6;~|AKp}{jG~YpkiJm zk#%5KPIHq{v&ioAIj>~l6%6S$OpA>6J3;G&w>FyZ`o+!ma8yEX=Vm)-sxxeZkn!j5xtAm!R?CL>dLHfjI0NDSlQUwQfx@ z1QI+O@LeAeOcxC##Pwj_x+~S6^dO!qUJ>pI%CnI!@5maFOj|ljN3j{WrFH(+t#9n3 zJdb+*6map1nAVIb%+R==rPu?#SU0@+t-j<_Bball.y)) { /* out - responsibilities stay the same */ + s->status = "out -- don't hit the ball!"; sound_out(); } else { /* not out - responsibilities change */ s->player1.responsible = !(s->player2.responsible = !s->player2.responsible); + s->status = ""; } } s->ground.jump = 3; @@ -114,6 +117,20 @@ bool step( GameState* s) { (s->player1.responsible)?(s->player2.score++):(s->player1.score++); + if( s->player1.responsible) { + if( s->player1.type == PLAYER_TYPE_HUMAN && s->player2.type == PLAYER_TYPE_AI) { + s->status = "computer scores"; + } else { + s->status = "player 2 scores"; + } + } else { + if( s->player1.type == PLAYER_TYPE_HUMAN && s->player2.type == PLAYER_TYPE_AI) { + s->status = "player scores"; + } else { + s->status = "player 1 scores"; + } + } + game_setup_serve( s); sound_applause(); SDL_Delay( 500); @@ -215,6 +232,8 @@ void render( GameState* s) { show_digit( s->player2.score/10%10, 164*2, 14, 100); show_digit( s->player2.score%10, 172*2, 14, 100); + font_draw_string( GR_SMALLISH_FONT, s->status, (WIDTH-font_get_string_width( GR_SMALLISH_FONT, s->status))/2, HEIGHT-50, s->time/30, ANIMATION_WAVE); + #ifdef DEBUG line_horiz( s->player1.y, 255, 0, 0); line_horiz( s->player2.y, 0, 0, 255); diff --git a/game.h b/game.h index d6ccda6..ff6aec7 100644 --- a/game.h +++ b/game.h @@ -71,6 +71,7 @@ typedef struct { unsigned int time; bool was_stopped; bool player1_serves; + char* status; } GameState; #define PI 3.1415 diff --git a/graphics.c b/graphics.c index 2b8c546..f905d86 100644 --- a/graphics.c +++ b/graphics.c @@ -22,6 +22,7 @@ **/ #include +#include #include "tennix.h" #include "graphics.h" @@ -41,15 +42,19 @@ static const char* filenames[] = { "ball.png", "score.png", "menu.png", - "animation.png" + "animation.png", + "smallish-font.png" }; +static const char* smallish_font_chars = " !\"#----()'+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz"; + void init_graphics( const char *data_dir) { int i; SDL_Surface* data; SDL_Surface* tmp; char temp[MAXPATHLEN]; +#ifndef MACOSX strcpy( temp, data_dir); strcat( temp, "icon.png"); tmp = IMG_Load( temp); @@ -57,6 +62,7 @@ void init_graphics( const char *data_dir) { SDL_WM_SetIcon( tmp, NULL); SDL_FreeSurface( tmp); } +#endif images = (Image*)calloc( GR_COUNT, sizeof( Image)); @@ -220,3 +226,119 @@ int is_fading() { return SDL_GetTicks() < fading_start+FADE_DURATION; } +int font_get_metrics( unsigned int id, char ch, int* xp, int* wp) { + SDL_Surface *bitmap; + SDL_PixelFormat *fmt; + int pos, x = -1, w = 0; + int search_pos = 0, search_x = 0; + Uint8 red, green, blue; + Uint32 pixel; + + if( id > GR_COUNT) return 0; + + ch = tolower( ch); + + if( ch == ' ') { + w = 5; + } else { + for( pos = 0; pos < strlen( smallish_font_chars); pos++) { + if( smallish_font_chars[pos] == ch) + break; + } + + if( pos == strlen( smallish_font_chars)) { + return 0; + } + + bitmap = images[id].data; + fmt = bitmap->format; + + SDL_LockSurface( bitmap); + while( search_x < bitmap->w) { + pixel = *( (Uint32*)(bitmap->pixels + search_x*fmt->BytesPerPixel)); + red = (Uint8)(((pixel & fmt->Rmask) >> fmt->Rshift) << fmt->Rloss); + green = (Uint8)(((pixel & fmt->Gmask) >> fmt->Gshift) << fmt->Gloss); + blue = (Uint8)(((pixel & fmt->Bmask) >> fmt->Bshift) << fmt->Bloss); + + /* Increase pos counter if we have a "marker" pixel (255,0,255) */ + if( red == 255 && green == 0 && blue == 255) { + search_pos++; + if( search_pos == pos) { + x = search_x; + } else if( search_pos == pos + 1) { + w = search_x - x; + break; + } + } + + search_x++; + } + SDL_UnlockSurface( bitmap); + } + + if( wp != NULL) (*wp) = w; + if( xp != NULL) (*xp) = x; + + return w; +} + +int font_draw_char( unsigned int id, char ch, int x_offset, int y_offset) { + SDL_Surface *bitmap; + SDL_Rect src, dst; + int x = -1, w = 0; + + font_get_metrics( id, ch, &x, &w); + if( x == -1) return w; + + bitmap = images[id].data; + + dst.w = src.w = w; + dst.h = src.h = bitmap->h - 1; + src.x = x; + src.y = 1; + dst.x = x_offset; + dst.y = y_offset; + + SDL_BlitSurface( bitmap, &src, screen, &dst); + + return src.w; +} + +void font_draw_string( unsigned int id, char* s, int x_offset, int y_offset, int start, int animation) { + int y = y_offset; + int x = x_offset; + int i, xw; + + if( animation & ANIMATION_SPACING) { + xw = (int)fabsf((15.0*sinf( start/10.0 + x_offset/30.0))); + x -= xw; + } + + if( animation & ANIMATION_SKIP_TWO) { + x -= (strlen(s)*(int)(2.0*sinf( start / 10.0)))/2; + } + + for( i=0; i 0, 4, mx, my, 255); updatescr(); -- 2.11.4.GIT