Compare commits
2 Commits
8b1607ba6a
...
4f5e7d94cc
Author | SHA1 | Date |
---|---|---|
|
4f5e7d94cc | |
|
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 -o spaghetti-vs-bolognese -I../lib -l:../lib/libraylib.a -lm
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue