#include <stdio.h>
#include <helianthus.h>
#define CELLSIZE 128
Group edges;
Group group;
Animation frame;
Sprite selected;
double dx, dy;
void generate() {
int snake[16];
for(int i = 0; i < 16; ++i)
snake[i] = i;
for(int i = 0; i < 128; ++i) {
int j = randomNumber(0, 15);
int k = randomNumber(0, 15);
int s = snake[j];
snake[j] = snake[k];
snake[k] = s;
}
int count = 0;
for(int i = 0; i < 16; ++i)
for(int j = i+1; j < 16; ++j)
if (snake[i] && snake[j] && snake[i] < snake[j])
++count;
if (count % 2) {
for(int i = 0; i < 15; ++i) {
if (snake[i] && snake[i+1]) {
int s = snake[i];
snake[i] = snake[i+1];
snake[i+1] = s;
break;
}
}
}
for(int i = 0; i < 16; ++i) {
int y = i/4;
int x = i%4;
if (y%2) x = 3 - x;
if (snake[i])
spriteSetXY(groupGet(group, snake[i] - 1), x + 0.5, y + 0.5);
}
}
void init() {
edges = createEdgesGroupEx(0, 0, 4, 4, 1, 100);
groupSetVisibleEach(edges, FALSE);
frame = createAnimation("data/sprite/15/frame.png");
group = createGroup();
for(int i = 0; i < 15; ++i) {
char filename[256] = {};
sprintf(filename, "data/sprite/15/%d.png", i+1);
Sprite sprite = createSpriteEx(0, 0, 1, 1, createAnimation(filename));
spriteSetColliderRectangle(sprite, 0, 0, 0, 1, 1, 0.1);
groupAdd(group, sprite);
}
generate();
}
void draw() {
saveState();
zoom(CELLSIZE);
noStroke();
rectTextured(frame, 0, 0, 6, 6);
translate(1, 1);
if (mouseDown("left")) {
double mx = mouseTransformedX();
double my = mouseTransformedY();
if (!selected) {
selected = groupSpriteByPoint(group, mx, my, TRUE);
if (selected) {
dx = spriteGetX(selected) - mx;
dy = spriteGetY(selected) - my;
}
}
if (selected) {
double d = 0.1;
double x0 = spriteGetX(selected);
double y0 = spriteGetY(selected);
double x1 = mx + dx;
double y1 = my + dy;
if (x1 < x0 - d) x1 = x0 - d;
if (x1 > x0 + d) x1 = x0 + d;
if (y1 < y0 - d) y1 = y0 - d;
if (y1 > y0 + d) y1 = y0 + d;
spriteSetXY(selected, x1, y1);
}
} else {
selected = NULL;
}
if (mouseWentDown("right") || keyWentDown("space"))
generate();
groupCollideBetween(group);
groupCollideGroup(edges, group);
drawSprites();
restoreState();
}
int main() {
windowSetTitle("15");
windowSetInit(&init);
windowSetDraw(&draw);
windowSetSize(6*CELLSIZE, 6*CELLSIZE);
windowSetVariableFrameRate();
windowRun();
return 0;
}