2002-05-20 12:40:35 +00:00
/* $Revision$ */
# include <stdlib.h>
# include <unistd.h>
# include <math.h>
2002-05-20 11:07:54 +00:00
# include "SDL.h"
# include "sdl.h"
2002-05-20 12:40:35 +00:00
# include "map.h"
2002-05-20 11:07:54 +00:00
# define MEERESSPIEGEL 48
# define BLICKWEITE 55
2002-05-20 16:07:37 +00:00
# define FLUGHOEHE 30
2002-05-20 11:07:54 +00:00
# define MAPSIZE 256
int sintab [ 360 ] ;
int costab [ 360 ] ;
char map [ MAPSIZE * MAPSIZE ] ;
SDL_Surface * screen ;
void init_tabs ( ) {
int x ;
for ( x = 0 ; x < 360 ; x + + )
2002-05-20 12:40:35 +00:00
sintab [ x ] = ( int ) ( 127.0 * sin ( x * M_PI / 180 ) ) ;
2002-05-20 11:07:54 +00:00
for ( x = 0 ; x < 90 ; x + + )
costab [ x ] = sintab [ x + 90 ] ;
for ( x = 90 ; x < 360 ; x + + )
costab [ x ] = - sintab [ x - 90 ] ;
}
2002-05-20 16:07:37 +00:00
void fly ( SDL_Surface * screen ) {
static int
posx = 0 ,
posy = 0 ,
richtung = 0 ,
flughoehe = 0 ;
int iy , ix , iy1 , iyp , ixp ;
int x , y , z , s , i , j ;
int map_color ;
int rng [ 320 ] ;
if ( SDL_MUSTLOCK ( screen ) )
if ( SDL_LockSurface ( screen ) < 0 ) {
fprintf ( stderr , " Can't lock screen: %s \n " ,
SDL_GetError ( ) ) ;
return ;
}
/* Richtung wechseln? */
/* if (java.lang.Math.random()<0.5)
if ( java . lang . Math . random ( ) < 1.0 )
if ( richtung < = 0 ) richtung = 357 ;
else richtung - = 3 ;
else
if ( richtung > = 357 ) richtung = 0 ;
else richtung + = 3 ;
*/
/* Bewegen ... */
posy = posy + costab [ richtung ] / 32 ;
posx = posx + sintab [ richtung ] / 32 ;
posy % = MAPSIZE ;
posx % = MAPSIZE ;
/* Absolute H<> he berechnen */
flughoehe = 100 ;
/* flughoehe = FLUGHOEHE + ... */
/* FIXME */
for ( i = 0 ; i < 320 ; i + + ) rng [ i ] = 200 ;
SDL_FillRect ( screen , NULL , 0 ) ;
for ( iy = posy ; iy < = posy + BLICKWEITE ; iy + + ) {
iy1 = 2 * ( iy - posy ) + 1 ;
s = 4 + 300 / iy1 ;
for ( ix = posx - ( iy - posy ) ; ix < = posx + ( iy - posy ) ; ix + + ) {
ixp = posx
+ ( ( ix - posx ) * costab [ richtung ]
+ ( iy - posy ) * sintab [ richtung ] ) / 128 ;
iyp = posy
+ ( ( iy - posy ) * costab [ richtung ]
- ( ix - posx ) * sintab [ richtung ] ) / 128 ;
x = 160 + 360 * ( ix - posx ) / iy1 ;
if (
( x > = 0 ) & & ( x + s < = 318 )
& & ( ( 256 * iyp + ixp ) > 0 )
& & ( ( 256 * iyp + ixp ) < 256 * 256 )
) {
map_color = map [ 256 * iyp + ixp ] ;
z = map [ 256 * iyp + ixp ] ;
if ( z < MEERESSPIEGEL ) z = MEERESSPIEGEL ;
y = 100 + 30 * ( flughoehe - z ) / iy1 ;
if ( ( y > = 0 ) & & ( y < = 199 ) ) {
for ( j = x ; j < = x + s ; j + + )
for ( i = rng [ j ] ; i > = y ; i - - ) {
if ( ( 320 * i + j > = 0 ) & & ( 320 * i + j < 320 * 200 ) )
sdl_putpixel ( screen , j , i , map_color ) ;
if ( y < rng [ j ] ) rng [ j ] = y ;
} }
}
}
}
if ( SDL_MUSTLOCK ( screen ) ) SDL_UnlockSurface ( screen ) ;
SDL_UpdateRect ( screen , 0 , 0 , 320 , 200 ) ;
usleep ( 1000 / 25 ) ;
}
2002-05-20 11:07:54 +00:00
int main ( void ) {
init_tabs ( ) ;
map_init ( map , MAPSIZE , MAPSIZE ) ;
map_generate ( map , 0 , 0 , MAPSIZE - 1 , MAPSIZE - 1 ) ;
screen = sdl_init ( ) ;
map_setpalette ( screen ) ;
2002-05-20 16:07:37 +00:00
while ( 1 ) {
fly ( screen ) ;
}
2002-05-20 11:07:54 +00:00
sleep ( 30 ) ; SDL_Quit ( ) ; exit ( 0 ) ;
}