Metropoli BBS
VIEWER: star.c MODE: TEXT (CP437)
#include <go32.h>
#include <sys/farptr.h>

#define PERSPECTIVE    256 /* näiden tarkoitukset        */
#define ORIGOX         160 /* varmaan muistatkin         */
#define ORIGOY         100 /* jo nyt?                    */
#define NUMBEROFSTARS 2000 /* tämä säätää tähtien määrän */
#define SPEEDOFSTARS     1 /* tähtien nopeus, yleensä 1  */

#define putpixel(x,y,c) _farpokeb(_dos_ds, 0xA0000+(y*320+x), c)
#define waitsync()     while ( (inportb(0x03DA) & 0x08))\
                       while (!(inportb(0x03DA) & 0x08))
struct {
  int x,y,z;
 }starinfo[NUMBEROFSTARS];

void randomize_star(int value)
{
  starinfo[value].x = rand() % 320 - 160;
  starinfo[value].y = rand() % 200 - 100;
  starinfo[value].z = rand() % 256 + 1;
}

void main(void)
{
  int x,y,i;             /* koordinaattimuuttujat sekä apumuuttuja */
  textmode(0x13);        /* siirrymme tilaan 13h */
  srand(time(0));        /* alustamme randomgeneraattorimme */

  for(i=0;i<NUMBEROFSTARS;i++)
    randomize_star(i);   /* joka tähdelle koordinaatit */

  while(!kbhit()) {
    for(i=0;i<NUMBEROFSTARS;i++) {

      x = starinfo[i].x * PERSPECTIVE / starinfo[i].z + ORIGOX;
      y = starinfo[i].y * PERSPECTIVE / starinfo[i].z + ORIGOY;
      if(x > 0 && x < 320 && y > 0 && y < 200) putpixel(x,y,0);

      starinfo[i].z--;
      if(0 >= starinfo[i].z) {
        randomize_star(i);
        starinfo[i].z=256;
      }

      x = starinfo[i].x * PERSPECTIVE / starinfo[i].z + ORIGOX;
      y = starinfo[i].y * PERSPECTIVE / starinfo[i].z + ORIGOY;
      if(x > 0 && x < 320 && y > 0 && y < 200) putpixel(x,y,15);
      }
    waitsync();       /* näiden pitäisi vähän hidastaa */
    waitsync();       /* pyörimisnopeutta Pentiumeilla */
    }
  textmode(0x3);      /* paluu tekstimoodiin           */
}
[ RETURN TO DIRECTORY ]