#include <stdlib.h>
#include "SDL/SDL.h"
#include <math.h>
#include <vector>
//SDL screen pointer
SDL_Surface *screen;
//computer specific constants
const int horizontalRez = 800;
const int verticalRez = 600;
//star constants
const int maxStars = 500;
const int layers = 3;
//star object
struct star {
int x,y;
int layer;
};
//array of Stars
star starField[maxStars];
void initStars(void){
int i;
for (i=0;i<maxStars;i++){
starField[i].x=rand()%horizontalRez; // 0-1399 [x]
starField[i].y=rand()%verticalRez; // 0-1049 [y]
starField[i].layer=rand()%layers;// [0-2] [layer]
}
}
void putpixel(int x, int y, int color){
unsigned int *ptr = (unsigned int*)screen->pixels;
int lineoffset = y * (screen->pitch / 4);
ptr[lineoffset + x] = color;
}
int layerColor(int layer){
if (layer == 0){
return 0xff0000;
}
if (layer == 1){
return 0x00ff00;
}
if (layer == 2){
return 0x0000ff;
}
return 0xffffff;
}
void drawStar(void){
// Declare a couple of variables
int i, j, yofs, ofs;
// Draw to screen
yofs = 0;
for (i = 0; i < verticalRez; i++){
for (j = 0, ofs = yofs; j < horizontalRez; j++, ofs++){
((unsigned int*)screen->pixels)[ofs] = 0;
}
yofs += screen->pitch / 4;
}
int s;
for (s=0;s<maxStars;s++){
putpixel(starField[s].x, starField[s].y, 0xffffff / (3 / (starField[s].layer + 1)));
}
SDL_UpdateRect(screen, 0, 0, horizontalRez, verticalRez);
}
void updateStars(void){
int i;
for (i=0;i<maxStars;i++){
// drop the particel down - depending on layer
// [plus one - since layer zero would result in no motion otherwize]
starField[i].x+=starField[i].layer+1;
// check for wrap around
if (starField[i].x>(horizontalRez - 1)){
starField[i].y=rand()%verticalRez;
starField[i].x=0;
starField[i].layer=rand()%layers;
}
}
}
// BEGIN PROGRAM EXECUTION
int main(int argc, char *argv[]){
// Initialize SDL's subsystems - in this case, only video.
if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError());
exit(1);
}
// Register SDL_Quit to be called at exit; makes sure things are
// cleaned up when we quit.
atexit(SDL_Quit);
screen = SDL_SetVideoMode(horizontalRez, verticalRez, 32, SDL_SWSURFACE);
// If we fail, return error.
if ( screen == NULL ) {
fprintf(stderr, "Unable to set video: %s\n", SDL_GetError());
exit(1);
}
initStars();
// Main loop: loop forever.
while (1){
//Update Star Field
updateStars();
drawStar();
// Poll for events, and handle the ones we care about.
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
break;
case SDL_KEYUP:
// If escape is pressed, return (and thus, quit)
if (event.key.keysym.sym == SDLK_ESCAPE)
return 0;
break;
case SDL_QUIT:
return(0);
}
}
}
return 0;
}