Advertisement
Guest User

Untitled

a guest
Jan 31st, 2012
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.35 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <math.h>
  3. #include "SDL.h"
  4.  
  5. void filldata (int *hei, int *col)
  6. {
  7.     int p = 0;
  8.     int x,y;
  9.     for (y=0; y<=63; y++)
  10.     {
  11.         for (x=0; x<=63; x++)
  12.         {
  13.             int d = 15*15- ((x&31)-16)*((x&31)-16) - ((y&31)-16)*((y&31)-16);
  14.             if ((d>0) && ((x^y)&32))
  15.             {
  16.                 hei[p] = 64-sqrt(d);
  17.                 col[p] = x+y;
  18.             }
  19.             else
  20.             {
  21.                 hei[p] = 64;
  22.                 col[p] = 3*(cos(x*0.2) + sin (y*0.3)) + 88;
  23.             }
  24.             p++;
  25.         }
  26.     }
  27. }
  28.  
  29. void fillpalette (SDL_Surface *screen)
  30. {
  31.     SDL_Color colors[256];
  32.     int i;
  33.     /* Fill colors with color information */
  34.     for(i=0;i<=256;i++)
  35.     {
  36.         colors[i].r=i;
  37.         colors[i].g=i;
  38.         colors[i].b=i/2;
  39.     }
  40.     SDL_SetPalette(screen, SDL_LOGPAL|SDL_PHYSPAL, colors, 0, 256);
  41. }
  42.  
  43. void checkevents()
  44. {
  45.     SDL_Event event;
  46.     if (SDL_PollEvent(&event))
  47.     {
  48.         switch (event.type) {
  49.         case SDL_MOUSEMOTION:
  50.             printf("Mouse moved by %d,%d to (%d,%d)\n",
  51.                    event.motion.xrel, event.motion.yrel,
  52.                    event.motion.x, event.motion.y);
  53.             break;
  54.         case SDL_MOUSEBUTTONDOWN:
  55.             printf("Mouse button %d pressed at (%d,%d)\n",
  56.                    event.button.button, event.button.x, event.button.y);
  57.             break;
  58.         case SDL_QUIT:
  59.             exit(0);
  60.         }
  61.     }
  62. }
  63.  
  64. int main ()
  65. {
  66.     if ( SDL_Init(SDL_INIT_VIDEO) < 0 )
  67.     {
  68.         fprintf(stderr, "Cannot initialize SDL: %s\n", SDL_GetError());
  69.         exit(1);
  70.     }
  71.  
  72.     SDL_Surface *screen;
  73.     screen = SDL_SetVideoMode(800, 600, 8, SDL_SWSURFACE|SDL_HWPALETTE);
  74.     if ( screen == NULL )
  75.     {// Если установить разрешение не удалось
  76.         fprintf(stderr, "Cannot set resolution 800x600: %s\n", SDL_GetError());
  77.         exit(1);
  78.     }
  79.  
  80.     fillpalette (screen);
  81.     int hei[4096-1];
  82.     int col[4096-1];
  83.     filldata (hei, col);
  84.  
  85.     int posx = 0;
  86.     int posy = 0;
  87.     int posz = 45*65536;
  88.     // Здесь и далее мы умножаем на 2^16 чтобы повысить точность вычислений,
  89.     // так как результаты cos() и sin() придется помещать в целочисленные переменные
  90.     // Чтобы избавится от множителя мы делаем сдвиг >>16 в нужный момент
  91.  
  92.     double ang = 0;
  93.     int horiz = -100;
  94.  
  95.     double r220 = 1.0f / 220; // Angle of view?
  96.     int dd = 65536 * r220;
  97.     int de = dd * 128; // 128 is the max "distance"
  98.     int sdz = (250-horiz)*65536*r220;
  99.     int sx,x,y,z,p;
  100.  
  101.     while (1)
  102.     {
  103.         SDL_LockSurface(screen);
  104.  
  105.         double cosang = cos (ang) * 65536;
  106.         double sinang = sin (ang) * 65536;
  107.         int dx,dy,dxi,dyi,dz;
  108.         dx = sinang + cosang; dxi = -sinang * r220;
  109.         dy = sinang - cosang; dyi = cosang * r220;
  110.  
  111.         for (sx=0;sx<=799;sx++)
  112.         {
  113.             x = posx;
  114.             y = posy;
  115.             z = posz;
  116.             dz = sdz;
  117.             p = sx+479200;
  118.             int d;
  119.             for (d=0;d<=de;d+=dd)
  120.             {
  121.                 x += dx; y += dy; z += dz;
  122.                 // 0xfc00000>>16 is 4032, and 4032 is (4096-1)-63
  123.                 // 3f0000>>16 is 63
  124.                 int i = (((x*64) & 0xfc00000) + (y&0x3f0000))>>16;
  125.  
  126.                 // Почему x и y поменялись местами?
  127.                 //int i = ((x & 0x3f0000) + (y*64) & 0xfc00000)>>16;
  128.                 int h = hei[i]*65536;
  129.                 while (h<z)
  130.                 {
  131.                     *((Uint8*)screen->pixels+p) = col[i];
  132.                     //poke p, col(i)
  133.                     p -= 800;
  134.                     z -= d;
  135.                     dz -= dd;
  136.                 }
  137.             }
  138.             dx += dxi;
  139.             dy += dyi;
  140.             while (p>=19200)
  141.             {
  142.                 *((Uint8*)screen->pixels+p) = 0;
  143.                 // poke p,0
  144.                 p -= 800;
  145.             }
  146.         }
  147.  
  148.         posx += 4*cosang;
  149.         posy += 4*sinang;
  150.         ang += 0.02;
  151.        
  152.         SDL_UnlockSurface(screen);
  153.         SDL_Flip (screen);
  154.         SDL_Delay (50);
  155.         checkevents ();
  156.     }
  157.  
  158.     return atexit(SDL_Quit);
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement