Implement basic ImGUI editor for a game
This commit is contained in:
parent
30f016db1e
commit
0f6e9fdebb
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
.cache
|
.cache
|
||||||
compile_commands.json
|
compile_commands.json
|
||||||
main
|
main
|
||||||
|
extern
|
||||||
|
imgui.ini
|
||||||
|
4
compile
4
compile
@ -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
|
||||||
|
|
||||||
|
114
src/main.c
114
src/main.c
@ -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; }
|
||||||
|
Loading…
Reference in New Issue
Block a user