Added initial LBreakout2 sources, already slightly modified - it does not work yet!
This commit is contained in:
194
project/jni/application/lbreakout2/client/display.c
Normal file
194
project/jni/application/lbreakout2/client/display.c
Normal file
@@ -0,0 +1,194 @@
|
||||
/***************************************************************************
|
||||
display.c - description
|
||||
-------------------
|
||||
begin : Thu Sep 6 2001
|
||||
copyright : (C) 2001 by Michael Speck
|
||||
email : kulkanie@gmx.net
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include "lbreakout.h"
|
||||
#include "display.h"
|
||||
|
||||
extern SDL_Surface *offscreen;
|
||||
extern SDL_Surface *stk_display;
|
||||
extern StkFont *display_font;
|
||||
extern StkFont *display_highlight_font;
|
||||
|
||||
List *displays = 0;
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Locals
|
||||
====================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Delete a display
|
||||
====================================================================
|
||||
*/
|
||||
void display_delete( void *ptr )
|
||||
{
|
||||
Display *display = ptr;
|
||||
if ( display ) {
|
||||
stk_surface_free( &display->surf );
|
||||
free( display );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Publics
|
||||
====================================================================
|
||||
*/
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Add a display. The display is cleared by displays_clear() so
|
||||
the returned display is just a pointer.
|
||||
The contents of the display is 'text'+'value'. Both may be changed
|
||||
with the display_set_text/value() functions.
|
||||
'digits' is the maxium size of 'value'
|
||||
====================================================================
|
||||
*/
|
||||
Display* displays_add( int x, int y, int w, int h, char *text, int value, int digits )
|
||||
{
|
||||
Display *display = 0;
|
||||
if ( displays == 0 )
|
||||
displays = list_create( LIST_AUTO_DELETE, display_delete );
|
||||
display = calloc( 1, sizeof( Display ) );
|
||||
if ( display == 0 ) return 0;
|
||||
if ( ( display->surf = stk_surface_create( SDL_SWSURFACE,w,h ) ) == 0 ) {
|
||||
free( display );
|
||||
return 0;
|
||||
}
|
||||
SDL_SetColorKey( display->surf, 0, 0 );
|
||||
display->use_alpha = 1;
|
||||
display->x = x;
|
||||
display->y = y;
|
||||
display->w = w;
|
||||
display->h = h;
|
||||
display->digits = digits;
|
||||
strcpy( display->text, text );
|
||||
display->value = value;
|
||||
display->cur_value = value;
|
||||
list_add( displays, display );
|
||||
return display;
|
||||
}
|
||||
/*
|
||||
====================================================================
|
||||
Remove all displays
|
||||
====================================================================
|
||||
*/
|
||||
void displays_clear()
|
||||
{
|
||||
if ( displays ) {
|
||||
list_delete( displays );
|
||||
displays = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Draw displays
|
||||
====================================================================
|
||||
*/
|
||||
void displays_hide()
|
||||
{
|
||||
Display *display;
|
||||
if ( displays == 0 ) return;
|
||||
list_reset( displays );
|
||||
while ( ( display = list_next( displays ) ) ) {
|
||||
stk_surface_blit(offscreen, display->x, display->y,
|
||||
display->w, display->h,
|
||||
stk_display, display->x, display->y );
|
||||
stk_display_store_drect();
|
||||
}
|
||||
}
|
||||
void displays_show()
|
||||
{
|
||||
int i;
|
||||
char str[64], numstr[10];
|
||||
StkFont *font;
|
||||
Display *display;
|
||||
if ( displays == 0 ) return;
|
||||
list_reset( displays );
|
||||
display_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
|
||||
display_highlight_font->align = STK_FONT_ALIGN_LEFT | STK_FONT_ALIGN_TOP;
|
||||
while ( ( display = list_next( displays ) ) ) {
|
||||
if (display->is_highlighted)
|
||||
font = display_highlight_font;
|
||||
else
|
||||
font = display_font;
|
||||
strcpy( str, display->text );
|
||||
if ( display->digits > 0 ) {
|
||||
sprintf( numstr, "%i", (int)display->cur_value );
|
||||
for ( i = 0; i < display->digits - strlen( numstr ); i++ )
|
||||
strcat( str, " " );
|
||||
strcat( str, numstr );
|
||||
}
|
||||
if ( display->use_alpha ) {
|
||||
stk_surface_alpha_blit( display->surf, 0,0,
|
||||
display->w, display->h,
|
||||
stk_display, display->x, display->y, 128 );
|
||||
}
|
||||
stk_font_write( font, stk_display,
|
||||
display->x + 2, display->y + 1, -1, str );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
====================================================================
|
||||
Update displays
|
||||
====================================================================
|
||||
*/
|
||||
void displays_update( int ms )
|
||||
{
|
||||
float change;
|
||||
Display *display;
|
||||
if ( displays == 0 ) return;
|
||||
list_reset( displays );
|
||||
while ( ( display = list_next( displays ) ) ) {
|
||||
if ( (int)display->cur_value == display->value ) continue;
|
||||
/* change relative as for big display->cur_values we must count faster */
|
||||
change = ( display->value - display->cur_value ) / 200;
|
||||
if ( change > 0 && change < 0.6 ) change = 0.6;
|
||||
if ( change < 0 && change > -0.6 ) change = -0.6;
|
||||
display->cur_value += change * ms;
|
||||
if ( change > 0 && display->cur_value > display->value )
|
||||
display->cur_value = display->value;
|
||||
if ( change < 0 && display->cur_value < display->value )
|
||||
display->cur_value = display->value;
|
||||
}
|
||||
}
|
||||
/*
|
||||
====================================================================
|
||||
Modify display
|
||||
====================================================================
|
||||
*/
|
||||
void display_set_text( Display *display, char *text )
|
||||
{
|
||||
strcpy( display->text, text );
|
||||
}
|
||||
void display_set_value( Display *display, int value )
|
||||
{
|
||||
display->value = value;
|
||||
}
|
||||
void display_set_value_directly( Display *display, int value )
|
||||
{
|
||||
display->cur_value = value; /* no smooth approaching of the dest value */
|
||||
display->value = value;
|
||||
}
|
||||
void display_set_highlight( Display *display, int on )
|
||||
{
|
||||
display->is_highlighted = on;
|
||||
}
|
||||
Reference in New Issue
Block a user