Implement basic ImGUI editor for a game

This commit is contained in:
Abdelrahman Said 2024-09-08 22:19:04 +01:00
parent 30f016db1e
commit 0f6e9fdebb
3 changed files with 113 additions and 7 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
.cache .cache
compile_commands.json compile_commands.json
main main
extern
imgui.ini

View File

@ -1,8 +1,8 @@
#!/bin/bash #!/bin/bash
CC=clang CC=clang
CFLAGS="-g -Wall $(pkg-config --cflags sdl2)" CFLAGS="-g -Wall $(pkg-config --cflags sdl2) -Wl,-rpath,\$ORIGIN/lib -Ivendor"
LIBS="$(pkg-config --libs sdl2)" LIBS="$(pkg-config --libs sdl2) -Llib -lcimgui"
SRC=src/*.c SRC=src/*.c
OUT=main OUT=main

View File

@ -1,28 +1,77 @@
#include "SDL_rect.h"
#include <SDL2/SDL.h> #include <SDL2/SDL.h>
#include <SDL2/SDL_events.h> #include <SDL2/SDL_events.h>
#include <SDL2/SDL_render.h> #include <SDL2/SDL_render.h>
#include <SDL2/SDL_video.h> #include <SDL2/SDL_video.h>
#include <stdint.h>
#include <stdio.h>
#define CIMGUI_DEFINE_ENUMS_AND_STRUCTS
#include "cimgui/cimgui.h"
#define CIMGUI_USE_SDL2
#include "cimgui/cimgui_impl.h"
#include <stdbool.h> #include <stdbool.h>
#define WINDOW_WIDTH 800 #define WINDOW_WIDTH 1280
#define WINDOW_HEIGHT 600 #define WINDOW_HEIGHT 720
#define PLAYER_SIZE 50
#define MIN_SPEED 10
#define MAX_SPEED 3000
static const float delta = 1.0f / 60.0f;
typedef struct character Character;
struct character {
SDL_FRect position;
ImVec4 color;
int direction;
float speed;
};
void update_character(Character *player);
void render_character(SDL_Renderer *renderer, const Character *player);
void toggle_direction(Character *player);
int main(void) { int main(void) {
SDL_Init(SDL_INIT_EVERYTHING); SDL_Init(SDL_INIT_EVERYTHING);
SDL_Window *window = SDL_Window *window = SDL_CreateWindow(
SDL_CreateWindow("Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, "Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH,
WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_SHOWN); WINDOW_HEIGHT, SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
SDL_Renderer *renderer = SDL_CreateRenderer( SDL_Renderer *renderer = SDL_CreateRenderer(
window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
igCreateContext(NULL);
ImGuiIO *io = igGetIO();
// Enable Keyboard Controls
io->ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;
// Enable Gamepad Controls
io->ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;
igStyleColorsDark(NULL);
if (!ImGui_ImplSDL2_InitForSDLRenderer(window, renderer) ||
!ImGui_ImplSDLRenderer2_Init(renderer)) {
goto IMGUI_FAILED;
}
bool running = true; bool running = true;
Character player = {
.position = {.x = WINDOW_WIDTH / 2.0f - PLAYER_SIZE / 2.0f,
.y = 0.0f,
.w = PLAYER_SIZE,
.h = PLAYER_SIZE},
.direction = 1,
.speed = 10.0f,
.color = {.x = 0, .y = 0, .z = 0, .w = 255},
};
SDL_Event event = {0}; SDL_Event event = {0};
while (running) { while (running) {
while (SDL_PollEvent(&event)) { while (SDL_PollEvent(&event)) {
ImGui_ImplSDL2_ProcessEvent(&event);
switch (event.type) { switch (event.type) {
case SDL_QUIT: case SDL_QUIT:
running = false; running = false;
@ -30,13 +79,43 @@ int main(void) {
} }
} }
update_character(&player);
ImGui_ImplSDLRenderer2_NewFrame();
ImGui_ImplSDL2_NewFrame();
igNewFrame();
{
// Create a window and append into it.
igBegin("Player Properties", NULL, 0);
// Edit 1 float using a slider
igSliderFloat("Speed", &(player.speed), MIN_SPEED, MAX_SPEED, "%.6f", 0);
// Edit 3 floats representing a color
igColorEdit3("Color", (float *)&(player.color), 0);
igEnd();
}
igRender();
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
render_character(renderer, &player);
ImGui_ImplSDLRenderer2_RenderDrawData(igGetDrawData(), renderer);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
ImGui_ImplSDLRenderer2_Shutdown();
ImGui_ImplSDL2_Shutdown();
igDestroyContext(NULL);
IMGUI_FAILED:
SDL_DestroyRenderer(renderer); SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window); SDL_DestroyWindow(window);
@ -45,3 +124,28 @@ int main(void) {
return 0; return 0;
} }
void update_character(Character *player) {
player->position.y += player->speed * player->direction * delta;
if (player->position.y < 0 ||
player->position.y + player->position.h > WINDOW_HEIGHT) {
toggle_direction(player);
if (player->position.y < 0) {
player->position.y = 0;
} else {
player->position.y = WINDOW_HEIGHT - player->position.h;
}
}
}
void render_character(SDL_Renderer *renderer, const Character *player) {
SDL_SetRenderDrawColor(renderer, (uint8_t)(player->color.x * 255),
(uint8_t)(player->color.y * 255),
(uint8_t)(player->color.z * 255),
(uint8_t)(player->color.w * 255));
SDL_RenderFillRectF(renderer, &(player->position));
}
void toggle_direction(Character *player) { player->direction *= -1; }