| evosim |
| CFILES=$(shell find src -name '*.c') | |||||
| CFLAGS=-std=c99 $(shell sdl2-config --cflags --libs) | |||||
| build: | |||||
| gcc $(CFLAGS) -o evosim $(CFILES) |
| #include <stdlib.h> | |||||
| #define ARR_REALLOC(v, c, a) \ | |||||
| do { \ | |||||
| if (v == NULL) { \ | |||||
| a = 8; \ | |||||
| v = malloc(8 * sizeof(*(v))); \ | |||||
| } \ | |||||
| else if (c >= a) { \ | |||||
| do { a *= 2; } while (c >= a); \ | |||||
| v = realloc(v, a * sizeof(*(v))); \ | |||||
| } \ | |||||
| } while (0) | |||||
| #define ARR_APPEND(v, c, a, nw) \ | |||||
| do { \ | |||||
| c += 1; \ | |||||
| ARR_REALLOC(v, c, a); \ | |||||
| v[c - 1] = nw; \ | |||||
| } while (0) |
| #include "creature.h" | |||||
| #include <stdio.h> | |||||
| void creature_print(creature *creat) | |||||
| { | |||||
| printf("Creature: %i muscles\n", creat->musclec); | |||||
| for (int i = 0; i < creat->musclec; ++i) | |||||
| { | |||||
| printf("\tMuscle %i: \n", i); | |||||
| printf("\t\tmultiplier: %f\n", creat->muscles[i].multiplier); | |||||
| printf("\t\tstrength: %i\n", creat->muscles[i].strength); | |||||
| printf("\t\tnode 1: "); | |||||
| node n = creat->muscles[i].n1; | |||||
| printf("friction: %i, x: %f, y: %f\n", n.friction, n.x, n.y); | |||||
| printf("\t\tnode 2: "); | |||||
| n = creat->muscles[i].n2; | |||||
| printf("friction: %i, x: %f, y: %f\n", n.friction, n.x, n.y); | |||||
| } | |||||
| } | |||||
| static void drawnode(node n, SDL_Renderer *renderer) | |||||
| { | |||||
| int w = 30; | |||||
| int h = 30; | |||||
| SDL_Rect rect = { n.x - (w / 2), n.y - (h / 2), w, h }; | |||||
| int col = (n.friction / 1000.0) * 0xff; | |||||
| SDL_SetRenderDrawColor(renderer, 0xaa, col, col, 0xff); | |||||
| SDL_RenderFillRect(renderer, &rect); | |||||
| } | |||||
| void creature_draw(creature *creat, SDL_Renderer *renderer) | |||||
| { | |||||
| for (int i = 0; i < creat->musclec; ++i) | |||||
| { | |||||
| muscle mus = creat->muscles[i]; | |||||
| // Draw muscle line | |||||
| int col = (mus.strength / 1000.0) * 0xff; | |||||
| SDL_SetRenderDrawColor(renderer, 0xaa, 0xff, 0xaa, col); | |||||
| SDL_RenderDrawLine(renderer, | |||||
| mus.n1.x, mus.n1.y, | |||||
| mus.n2.x, mus.n2.y); | |||||
| // Draw nodes | |||||
| drawnode(mus.n1, renderer); | |||||
| drawnode(mus.n2, renderer); | |||||
| } | |||||
| } |
| #include <SDL2/SDL.h> | |||||
| typedef struct node | |||||
| { | |||||
| int friction; // 0 to 1000 | |||||
| double x; | |||||
| double y; | |||||
| } node; | |||||
| typedef struct muscle | |||||
| { | |||||
| node n1; | |||||
| node n2; | |||||
| double multiplier; | |||||
| int strength; // 0 to 1000 | |||||
| } muscle; | |||||
| typedef struct creature | |||||
| { | |||||
| muscle muscles[32]; | |||||
| int musclec; | |||||
| } creature; | |||||
| void creature_draw(creature *creat, SDL_Renderer *renderer); |
| #include <SDL2/SDL.h> | |||||
| #include "creature.h" | |||||
| int main() | |||||
| { | |||||
| // Initialize SDL | |||||
| if (SDL_Init(SDL_INIT_VIDEO) != 0) | |||||
| { | |||||
| fprintf(stderr, "SDL_Init error: %s\n", SDL_GetError()); | |||||
| return 1; | |||||
| } | |||||
| // Create a window | |||||
| SDL_Window *win = SDL_CreateWindow( | |||||
| "BestGame", | |||||
| 100, 100, | |||||
| 640, 480, | |||||
| SDL_WINDOW_SHOWN); | |||||
| if (win == NULL) | |||||
| { | |||||
| fprintf(stderr, "SDL_CreateWindow error: %s\n", SDL_GetError()); | |||||
| SDL_Quit(); | |||||
| return 1; | |||||
| } | |||||
| // Get surface and renderer | |||||
| SDL_Surface *surface = SDL_GetWindowSurface(win); | |||||
| SDL_Renderer *renderer = SDL_CreateRenderer( | |||||
| win, -1, SDL_RENDERER_ACCELERATED); | |||||
| // Create a creature | |||||
| creature creat = { | |||||
| .muscles = { | |||||
| { | |||||
| .n1 = { 10, 200, 200 }, | |||||
| .n2 = { 10, 190, 300 }, | |||||
| .multiplier = 1, | |||||
| .strength = 1 | |||||
| } | |||||
| }, | |||||
| .musclec = 1 | |||||
| }; | |||||
| int fps = 30; | |||||
| int delay = 1000 / fps; | |||||
| for (int i = 0; i < 100; ++i) | |||||
| { | |||||
| // Clear screen | |||||
| SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0xff); | |||||
| SDL_RenderClear(renderer); | |||||
| // Draw creature | |||||
| creat.muscles[0].n1.x += 1; | |||||
| creature_draw(&creat, renderer); | |||||
| // Presnent and delay | |||||
| SDL_RenderPresent(renderer); | |||||
| SDL_Delay(delay); | |||||
| } | |||||
| SDL_DestroyWindow(win); | |||||
| SDL_Quit(); | |||||
| return 0; | |||||
| } |