spaghetti-vs-bolognese
This commit is contained in:
parent
8b1607ba6a
commit
b4927fe824
|
@ -0,0 +1 @@
|
|||
spaghetti-vs-bolognese
|
|
@ -1 +0,0 @@
|
|||
rope
|
|
@ -1,8 +0,0 @@
|
|||
all:
|
||||
gcc main.c -lraylib -o rope
|
||||
|
||||
run: all
|
||||
./rope
|
||||
|
||||
clean:
|
||||
rm rope
|
|
@ -1,62 +0,0 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "raylib.h"
|
||||
#include "raymath.h"
|
||||
|
||||
#define ROPE_LEN 20
|
||||
#define ROPE_WIDTH 10
|
||||
|
||||
#define NB_ROPE 50
|
||||
Vector2 ropes[NB_ROPE];
|
||||
Vector2 forces[NB_ROPE];
|
||||
|
||||
int main()
|
||||
{
|
||||
InitWindow(1920, 1080, "speedrun");
|
||||
SetWindowState(FLAG_FULLSCREEN_MODE|FLAG_WINDOW_RESIZABLE);
|
||||
SetTargetFPS(60);
|
||||
|
||||
while (!WindowShouldClose()) {
|
||||
BeginDrawing();
|
||||
{
|
||||
ClearBackground(GRAY);
|
||||
|
||||
ropes[0] = GetMousePosition();
|
||||
DrawCircleV(ropes[0], 5, YELLOW);
|
||||
|
||||
for (int i = 1; i < NB_ROPE; i++) {
|
||||
Vector2 old = ropes[i];
|
||||
|
||||
if (!IsKeyDown(KEY_SPACE))
|
||||
forces[i].y += 9.8*69*GetFrameTime();
|
||||
|
||||
ropes[i] = Vector2Add(ropes[i], forces[i]);
|
||||
|
||||
float dist = Vector2Distance(ropes[i-1], ropes[i]);
|
||||
if (!dist) dist = ROPE_LEN;
|
||||
ropes[i] = Vector2Lerp(ropes[i-1], ropes[i], ROPE_LEN/dist);
|
||||
|
||||
Vector2 snap = Vector2Subtract(old, ropes[i]);
|
||||
snap = Vector2Negate(snap);
|
||||
snap = Vector2Scale(snap, GetFrameTime()*37);
|
||||
|
||||
forces[i] = snap;
|
||||
|
||||
DrawCircleV(ropes[i], ROPE_WIDTH/2, YELLOW);
|
||||
DrawLineEx(ropes[i-1], ropes[i], ROPE_WIDTH, YELLOW);
|
||||
|
||||
// DEBUG:
|
||||
// DrawLineEx(old, ropes[i], ROPE_WIDTH, RED);
|
||||
// DrawText(TextFormat("%.3f %.3f", forces[i].x, forces[i].y), 0, (i-1)*25, 25, ORANGE);
|
||||
}
|
||||
|
||||
DrawText(" Mode: ", 0, 1080-25, 25, ORANGE);
|
||||
if (IsKeyDown(KEY_SPACE)) {
|
||||
DrawText("SPACE", MeasureText(" Mode: ", 25), 1080-25, 25, DARKBLUE);
|
||||
} else {
|
||||
DrawText("GRAVITY", MeasureText(" Mode: ", 25), 1080-25, 25, BROWN);
|
||||
}
|
||||
}
|
||||
EndDrawing();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
all:
|
||||
gcc main.c -lraylib -o spaghetti-vs-bolognese
|
||||
|
||||
run: all
|
||||
./spaghetti-vs-bolognese
|
||||
|
||||
clean:
|
||||
rm spaghetti-vs-bolognese
|
|
@ -0,0 +1,167 @@
|
|||
#include <stdio.h>
|
||||
|
||||
#include "raylib.h"
|
||||
#include "raymath.h"
|
||||
|
||||
#define ROPE_LEN 20
|
||||
#define ROPE_WIDTH 10
|
||||
|
||||
#define NB_ROPE 50
|
||||
Vector2 ropes[NB_ROPE];
|
||||
Vector2 forces[NB_ROPE];
|
||||
|
||||
#define ENEMIE_WIDTH 25
|
||||
#define NB_ENEMIE 10
|
||||
Vector2 enemies[NB_ENEMIE];
|
||||
|
||||
int points = -NB_ENEMIE;
|
||||
|
||||
Vector2 window = {1920, 1080};
|
||||
|
||||
int main()
|
||||
{
|
||||
SetRandomSeed(69);
|
||||
InitWindow(window.x, window.y, "speedrun");
|
||||
SetWindowState(FLAG_FULLSCREEN_MODE|FLAG_WINDOW_RESIZABLE);
|
||||
HideCursor();
|
||||
SetTargetFPS(60);
|
||||
|
||||
for (int i = 0; i < NB_ROPE; i++) {
|
||||
ropes[i] = (Vector2) {window.x/2, window.y/2};
|
||||
}
|
||||
|
||||
while (!WindowShouldClose()) {
|
||||
|
||||
if (IsWindowResized()) {
|
||||
window.x = GetScreenWidth();
|
||||
window.y = GetScreenHeight();
|
||||
}
|
||||
|
||||
static int is_space = 0;
|
||||
if (IsKeyPressed(KEY_SPACE)) {
|
||||
is_space = !is_space;
|
||||
}
|
||||
|
||||
BeginDrawing();
|
||||
{
|
||||
ClearBackground(GRAY);
|
||||
|
||||
if (GetTime() < 5) {
|
||||
int size = 75;
|
||||
const char* info = "Soak your spaghetti in Bolognese sauce !";
|
||||
DrawText(
|
||||
info,
|
||||
window.x / 2 - MeasureText(info, size) / 2,
|
||||
window.y / 2 - size,
|
||||
size, GOLD
|
||||
);
|
||||
const char* mode = "Press space to change mode";
|
||||
DrawText(
|
||||
mode,
|
||||
window.x / 2 - MeasureText(mode, size) / 2,
|
||||
window.y / 2,
|
||||
size, SKYBLUE
|
||||
);
|
||||
}
|
||||
|
||||
if (points > (NB_ROPE-1)*10) {
|
||||
ShowCursor();
|
||||
|
||||
static int off = 0;
|
||||
off++;
|
||||
|
||||
DrawCircleV(ropes[0], ROPE_WIDTH/2, ColorFromHSV(off%360, 1, 1));
|
||||
|
||||
for (int i = 1; i < NB_ROPE; i++) {
|
||||
Color c = ColorFromHSV((off+i*3)%360, 1, 1);
|
||||
|
||||
DrawCircleV(ropes[i], ROPE_WIDTH/2, c);
|
||||
DrawLineEx(ropes[i-1], ropes[i], ROPE_WIDTH, c);
|
||||
}
|
||||
|
||||
int size = 75;
|
||||
DrawText("YOU WON!", window.x/2-MeasureText("YOU WON!", size)/2, window.y/2-size/2, size, GOLD);
|
||||
|
||||
EndDrawing();
|
||||
continue;
|
||||
}
|
||||
|
||||
ropes[0] = GetMousePosition();
|
||||
DrawCircleV(ropes[0], ROPE_WIDTH/2, points > 0 ? RED : YELLOW);
|
||||
|
||||
for (int i = 1; i < NB_ROPE; i++) {
|
||||
Vector2 old = ropes[i];
|
||||
|
||||
if (!is_space)
|
||||
forces[i].y += 9.8*69*GetFrameTime();
|
||||
|
||||
ropes[i] = Vector2Add(ropes[i], forces[i]);
|
||||
|
||||
float dist = Vector2Distance(ropes[i-1], ropes[i]);
|
||||
if (!dist) dist = ROPE_LEN;
|
||||
ropes[i] = Vector2Lerp(ropes[i-1], ropes[i], ROPE_LEN/dist);
|
||||
|
||||
Vector2 snap = Vector2Subtract(old, ropes[i]);
|
||||
snap = Vector2Negate(snap);
|
||||
snap = Vector2Scale(snap, GetFrameTime()*37);
|
||||
|
||||
forces[i] = snap;
|
||||
|
||||
Color color = YELLOW;
|
||||
if (i*10 < points) color = RED;
|
||||
|
||||
DrawCircleV(ropes[i], ROPE_WIDTH/2, color);
|
||||
DrawLineEx(ropes[i-1], ropes[i], ROPE_WIDTH, color);
|
||||
|
||||
for (int y = 0; y < NB_ENEMIE; y++) {
|
||||
if (CheckCollisionCircles(enemies[y], ENEMIE_WIDTH, ropes[i], ROPE_WIDTH/2)) {
|
||||
points++;
|
||||
enemies[y].x = -500;
|
||||
enemies[y].y = -500;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < NB_ENEMIE; i++) {
|
||||
if (!CheckCollisionCircleRec(enemies[i], 50, (Rectangle){0,0,window.x,window.y})) {
|
||||
int side = GetRandomValue(0, 3);
|
||||
float pour = (float)GetRandomValue(0, 100)/100;
|
||||
switch (side) {
|
||||
case 0: // left
|
||||
enemies[i].x = -ENEMIE_WIDTH;
|
||||
enemies[i].y = pour*window.y;
|
||||
break;
|
||||
case 1: // top
|
||||
enemies[i].x = pour*window.x;
|
||||
enemies[i].y = -ENEMIE_WIDTH;
|
||||
break;
|
||||
case 2: // right
|
||||
enemies[i].x = window.x+ENEMIE_WIDTH;
|
||||
enemies[i].y = pour*window.y;
|
||||
break;
|
||||
case 3: // bottom
|
||||
enemies[i].x = pour*window.x;
|
||||
enemies[i].y = window.y+ENEMIE_WIDTH;
|
||||
break;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
enemies[i].x += (i+50)*GetFrameTime() * (i%2 ? -i/5-1 : i/3+1);
|
||||
enemies[i].y += (i+50)*GetFrameTime() * (i%3 ? i/2+1 : -i/2-1);
|
||||
DrawCircleV(enemies[i], ENEMIE_WIDTH, RED);
|
||||
}
|
||||
|
||||
int size = 30;
|
||||
int marg = 5;
|
||||
DrawText(" Mode: ", 0, marg, size, ORANGE);
|
||||
if (is_space) {
|
||||
DrawText("SPACE", MeasureText(" Mode: ", size), marg, size, DARKBLUE);
|
||||
} else {
|
||||
DrawText("GRAVITY", MeasureText(" Mode: ", size), marg, size, BROWN);
|
||||
}
|
||||
DrawText(" Points: ", 0, size+marg, size, ORANGE);
|
||||
DrawText(TextFormat("%d / %d", points, 10*NB_ROPE), MeasureText(" Points: ", size), size+marg, size, GOLD);
|
||||
}
|
||||
EndDrawing();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue