98 lines
2.4 KiB
C
98 lines
2.4 KiB
C
#include "penger.c"
|
|
|
|
#define BLUE 0xffff0000
|
|
#define RED 0xff0000ff
|
|
#define BLACK 0xff000000
|
|
|
|
const unsigned int width = 800;
|
|
const unsigned int height = 600;
|
|
unsigned int BUFFER[width * height];
|
|
|
|
int scale(void);
|
|
|
|
typedef struct v2 {
|
|
float x, y;
|
|
} v2;
|
|
|
|
#define NB 10
|
|
v2 pos[NB];
|
|
|
|
#define GRAVITY 5
|
|
|
|
#define SPEED 500
|
|
v2 dir[NB];
|
|
|
|
unsigned int radius = 30;
|
|
|
|
float random(void);
|
|
|
|
int rand(int min, int max)
|
|
{
|
|
return min + random() * (max - min);
|
|
}
|
|
|
|
void init()
|
|
{
|
|
for (int i = 0; i < NB; i++) {
|
|
pos[i].x = rand(radius, width - radius);
|
|
pos[i].y = rand(radius, height - radius);
|
|
|
|
dir[i].x = SPEED;
|
|
dir[i].y = SPEED;
|
|
}
|
|
}
|
|
|
|
void go(float dt)
|
|
{
|
|
for (int i = 0; i < NB; i++) {
|
|
v2 npos;
|
|
npos.x = pos[i].x + dir[i].x * dt;
|
|
npos.y = pos[i].y + dir[i].y * dt;
|
|
|
|
if (npos.x - radius < 0 || npos.x + radius > width) {
|
|
dir[i].x = -dir[i].x;
|
|
}
|
|
if (npos.y - radius < 0 || npos.y + radius > height) {
|
|
dir[i].y = -dir[i].y;
|
|
}
|
|
|
|
pos[i].x += dir[i].x * dt;
|
|
pos[i].y += dir[i].y * dt;
|
|
}
|
|
|
|
for (int h = 0; h < height; h++) {
|
|
for (int w = 0; w < width; w++) {
|
|
unsigned int color = BLUE;
|
|
for (int p = 0; p < NB; p++) {
|
|
unsigned int dw = (unsigned int) pos[p].x - w;
|
|
unsigned int dh = (unsigned int) pos[p].y - h;
|
|
unsigned int d = dw * dw + dh * dh;
|
|
|
|
if (d <= radius*radius) {
|
|
unsigned short int red = (float) d/(radius*radius) * 255;
|
|
color = BLACK + red;
|
|
break;
|
|
}
|
|
}
|
|
BUFFER[h*width + w] = color;
|
|
}
|
|
}
|
|
|
|
v2 penger_origin = {(float) width/2 - 32*scale()/2, (float) height/2 - 32*scale()/2};
|
|
for (int i = 0; i < penger_height; i++) {
|
|
for (int y = 0; y < penger_width; y++) {
|
|
if (penger_img[i][y] <= 0x00FFFFFF)
|
|
continue;
|
|
for (int s1 = 0; s1 < scale(); s1++) {
|
|
for (int s2 = 0; s2 < scale(); s2++) {
|
|
int idx_x = penger_origin.x + y*scale()+s1;
|
|
int idx_y = penger_origin.y + i*scale()+s2;
|
|
if (idx_x < 0 || idx_x > width || idx_y < 0 || idx_y > height)
|
|
continue;
|
|
BUFFER[idx_y*width + idx_x] = penger_img[i][y];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|