- works now
This commit is contained in:
		
							parent
							
								
									a9253c089a
								
							
						
					
					
						commit
						98fae707ee
					
				
					 3 changed files with 95 additions and 78 deletions
				
			
		
							
								
								
									
										169
									
								
								cscape.c
									
										
									
									
									
								
							
							
						
						
									
										169
									
								
								cscape.c
									
										
									
									
									
								
							| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define MEERESSPIEGEL 48
 | 
					#define MEERESSPIEGEL 48
 | 
				
			||||||
#define BLICKWEITE    55
 | 
					#define BLICKWEITE    55
 | 
				
			||||||
 | 
					#define FLUGHOEHE     30
 | 
				
			||||||
#define MAPSIZE       256
 | 
					#define MAPSIZE       256
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int sintab[360];
 | 
					int sintab[360];
 | 
				
			||||||
| 
						 | 
					@ -27,6 +28,94 @@ void init_tabs() {
 | 
				
			||||||
  		costab[x] = -sintab[x-90];
 | 
					  		costab[x] = -sintab[x-90];
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void) {
 | 
					int main(void) {
 | 
				
			||||||
	init_tabs();
 | 
						init_tabs();
 | 
				
			||||||
	map_init(map,MAPSIZE,MAPSIZE);
 | 
						map_init(map,MAPSIZE,MAPSIZE);
 | 
				
			||||||
| 
						 | 
					@ -35,83 +124,11 @@ int main(void) {
 | 
				
			||||||
	screen = sdl_init();
 | 
						screen = sdl_init();
 | 
				
			||||||
        map_setpalette(screen);
 | 
					        map_setpalette(screen);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						while(1) {
 | 
				
			||||||
 | 
							fly(screen);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	sleep(30); SDL_Quit(); exit(0);
 | 
						sleep(30); SDL_Quit(); exit(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
  int posx = 0;
 | 
					 | 
				
			||||||
  int posy = 0;
 | 
					 | 
				
			||||||
  int richtung = 0;
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int flughoehe; 
 | 
					 | 
				
			||||||
    int iy, ix, iy1, iyp, ixp;
 | 
					 | 
				
			||||||
        int x, y, z, s, i, j;
 | 
					 | 
				
			||||||
    int map_color;
 | 
					 | 
				
			||||||
        int rng[] = new int[320];
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        while (true) {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Schnarch...
 | 
					 | 
				
			||||||
          try {Thread.sleep(100);} catch (InterruptedException e) {}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
     
 | 
					 | 
				
			||||||
      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;
 | 
					 | 
				
			||||||
      
 | 
					 | 
				
			||||||
	    
 | 
					 | 
				
			||||||
       Vorwärts? 
 | 
					 | 
				
			||||||
      posy = posy + costab[richtung] / 32;
 | 
					 | 
				
			||||||
          posx = posx + sintab[richtung] / 32;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      if (posy<=0) posy += 256;
 | 
					 | 
				
			||||||
          if (posx<=0) posx += 256;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
       Absolute Höhe berechnen 
 | 
					 | 
				
			||||||
      flughoehe = 100; 
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      for (i=0;i<320;i++) rng[i] = 200;
 | 
					 | 
				
			||||||
      System.arraycopy(emptyscreen,0,screen,0,320*200);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
          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[ri
 | 
					 | 
				
			||||||
chtung]) / 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))
 | 
					 | 
				
			||||||
                screen[320*i+j] = (byte)map_color;
 | 
					 | 
				
			||||||
                if (y<rng[j]) rng[j] = y;
 | 
					 | 
				
			||||||
                                
 | 
					 | 
				
			||||||
                      }
 | 
					 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,7 +26,7 @@ void map_show(SDL_Surface *screen, char *map, int mapsize) {
 | 
				
			||||||
	if(SDL_MUSTLOCK(screen)) 
 | 
						if(SDL_MUSTLOCK(screen)) 
 | 
				
			||||||
	        SDL_UnlockSurface(screen);
 | 
						        SDL_UnlockSurface(screen);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	SDL_UpdateRect(screen, 0, 0, mapsize-1, mapsize-1);
 | 
						SDL_UpdateRect(screen, 0, 0, mapsize, mapsize);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(void) {
 | 
					int main(void) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								sdl.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								sdl.c
									
										
									
									
									
								
							| 
						 | 
					@ -4,7 +4,7 @@
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SDL_Surface* sdl_init() {
 | 
					SDL_Surface* sdl_init() {
 | 
				
			||||||
	SDL_Surface *screen;
 | 
						SDL_Surface* screen;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
 | 
						screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
 | 
				
			||||||
	if(screen == NULL) {
 | 
						if(screen == NULL) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Reference in a new issue