You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.1 KiB
C++

/*
* good old starfield - PASTIS 51 EDITION + CAPTAIN MOD
*
* Same as starfield51 but this time we can control the origin with POT 1 and
* POT2, which affects all the newly created stars, allowing for deep space
* travel.
*
* Really not optimised in current state, even though I tried to simplify things.
* But it starts to push the chip beyond its capacity, so it feels a bit sluggish now.
* More changes would start to make the thing even less readable so...
*/
#include <TVout.h>
TVout TV;
#define STARS 51
#define POT_1 0
#define POT_2 1
#define POT_1_MOD 11 // 120/1024 ish int(0.1171875 * 100)
#define POT_2_MOD 9 // 96/1024 ish
#define RND_1_MOD 5 // 60/1024 ish
#define RND_2_MOD 4 // 48/1024 ish
int x[STARS];
int y[STARS];
int vx[STARS];
int vy[STARS];
uint8_t ox;
uint8_t oy;
void
setup()
{
randomSeed(analogRead(6)); // effective?
TV.begin(NTSC,120,96);
new_stars();
}
void
new_star(uint8_t i)
{
uint8_t x_tmp, y_tmp;
int dx, dy, pot1, pot2;
float vl;
pot1 = analogRead(POT_1);
pot2 = analogRead(POT_2);
ox = pot1 * POT_1_MOD / 100 ;
oy = pot2 * POT_2_MOD / 100 ;
x_tmp = pot1 * RND_1_MOD / 100 + random(60);
y_tmp = pot2 * RND_2_MOD / 100 + random(48);
dx = x_tmp - ox;
dy = y_tmp - oy;
switch(dx)
case 0: dx = 1; // CHEAT
vl = 1 / sqrt(dx*dx + dy*dy);
vx[i] = int(dx * vl * 100);
vy[i] = int(dy * vl * 100);
x[i] = x_tmp * 100;
y[i] = y_tmp * 100;
}
void
new_stars()
{
for (uint8_t i = 0; i < STARS; i++)
new_star(i);
}
void
update_stars()
{
for (uint8_t i = 0; i < 40; i++) {
x[i] = x[i] + vx[i];
y[i] = y[i] + vy[i];
if (x[i] > 12000 || x[i] < 0 || y[i] < 0 || y[i] > 9600)
new_star(i);
}
for (uint8_t i = 40; i < STARS; i++) {
x[i] = x[i] + (vx[i] << 1);
y[i] = y[i] + (vy[i] << 1);
if (x[i] > 12000 || x[i] < 0 || y[i] < 0 || y[i] > 9600)
new_star(i);
}
}
void
draw_stars()
{
for (uint8_t i = 0; i < STARS; i++)
TV.set_pixel(x[i]/100, y[i]/100, 1);
}
void
loop()
{
TV.delay_frame(1);
update_stars();
TV.clear_screen();
draw_stars();
}