Files
genuary/01-one-shape/main.c
2026-01-02 00:08:49 +01:00

154 lines
4.4 KiB
C

#include <raylib.h>
#include <raymath.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>
/*
Jedan oblik, jedna boja. Ovo je program koji mozda generise takvu sliku, mozda ne.
Radi na sansu, preko `chance` promenljive se kontrolise da li ce sansa da svi
budu isti oblici i boja, a verovatno nece biti.
Svake sekunde se dodaje novi, svake sekunde postoji sansa da resenje ovog zadatka
propadne.
Sada kada razmislim, ovo bas i ne radi tako, ali u nekom sirem smislu radi. Samo
sanse nisu to sto se misli da jesu. Bice neki bugfix.
Dostupna je i 2D kamera. Tako da sto duze traje, ako se dovoljno odzumira greske
se i ne vide iako ce se kad tad pojaviti.
Nisam se setio necega kreativnijeg
pod ovim ogranicenjima.
EN:
One shape, one color.
This is a program that might generate such an image, maybe not.
It works based on chance, with the chance variable controlling whether everything will be the same shape and color, though it's unlikely.
Every second, a new object is added, and each second there's a chance that the solution to this task will fail.
Now that I think about it, this doesn't quite work as expected, but in a broader sense, it does. It's just that the chances aren't quite what one would think. There will be a bugfix.
2D camera is also available. So the longer it lasts, if it's zoomed out enough mistakes
won't be seen even though they will eventually show up.
I couldn't come up with something more creative under these constraints.
*/
typedef struct Circle {
int radius;
int x;
int y;
} Circle;
int main(int argc, char *argv[]) {
const int SCREEN_WIDTH = 500;
const int SCREEN_HEIGHT = 500;
InitWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "one color one shape");
SetTargetFPS(60);
Rectangle rects[100] = {0};
Circle circles[100] = {0};
double previous_time = GetTime();
double current_time = 0.0;
double update_draw_time = 0.0;
double wait_time = 0.0;
float delta_time = 0.0f;
float time_counter = 0.0f;
int target_fps = 60;
Camera2D camera = {0};
camera.target = (Vector2){ 0.0f, 0.0f };
camera.offset = (Vector2){250.0f, 250.0f};
camera.rotation = 0.0f;
camera.zoom = 1.0f;
Vector2 prevMousePos = GetMousePosition();
srand(time(NULL));
int rand_int = rand() % 101 + 1;
int chance = 10;
if(argc == 2) {
chance = atoi(argv[1]);
}
int current_objects=0;
while(!WindowShouldClose()) {
float mouseDelta = GetMouseWheelMove();
float newZoom = camera.zoom + mouseDelta * 0.01f;
if (newZoom <= 0)
newZoom = 0.01f;
camera.zoom = newZoom;
// Kod za 2D kameru od:
//https://gist.github.com/JeffM2501/3c7da5c2b7e078e254d673f91489c78f
// arhivirano: https://archive.is/dZCVe
Vector2 thisPos = GetMousePosition();
Vector2 delta = Vector2Subtract(prevMousePos, thisPos);
prevMousePos = thisPos;
if (IsMouseButtonDown(0))
camera.target = GetScreenToWorld2D(Vector2Add(camera.offset, delta),camera);
time_counter += delta_time;
camera.zoom = expf(logf(camera.zoom) + ((float)GetMouseWheelMove()*0.1f));
rand_int = rand() % 101 + 1;
if(time_counter >= 1.0f) {
rand_int = rand() % 100 + 1;
if(rand_int < chance) {
rects[current_objects] =(Rectangle){current_objects*30, 0, 30, 30};
} else {
circles[current_objects] = (Circle){.radius=30, .x=current_objects*30, 0};
}
time_counter = 0.0f;
current_objects++;
}
BeginDrawing();
ClearBackground(RAYWHITE);
BeginMode2D(camera);
for(int i = 0; i <current_objects; i++) {
for(int j = 0; j < 10; j++) {
if(rects[i].x!=0) {
DrawRectangle(i*30, i*50, 30, 30,MAROON);
DrawRectangle(i*30, -i*50, 30, 30,MAROON);
DrawRectangle(-i*30, -i*50, 30, 30,MAROON);
DrawRectangle(-i*30, i*50, 30, 30,MAROON);
} else if(circles[i].radius !=0) {
DrawCircle(i*30, i*50, 30, GREEN);
DrawCircle(-i*30, i*50, 30, GREEN);
DrawCircle(-i*30, -i*50, 30, GREEN);
DrawCircle(i*30, -i*50, 30, GREEN);
}
}
}
EndMode2D();
EndDrawing();
current_time = GetTime();
update_draw_time = current_time - previous_time;
if (target_fps > 0) {
wait_time = (1.0f/(float)target_fps) - update_draw_time;
if (wait_time > 0.0) {
WaitTime((float)wait_time);
current_time = GetTime();
delta_time = (float)(current_time - previous_time);
}
}
else {
delta_time = (float)update_draw_time;
}
previous_time = current_time;
}
}