Initial commit of 2D RPG Engine. @dacav come help.

This commit is contained in:
Ritchie Cunningham 2025-09-11 23:07:38 +01:00
commit 8dcd42c97b
5 changed files with 187 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/bin

17
CMakeLists.txt Normal file
View File

@ -0,0 +1,17 @@
cmake_minimum_required(VERSION 3.16)
project(bettola VERSION 0.1)
# Let's use C++17?
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Deps.
find_package(SDL3 REQUIRED)
find_package(GLEW REQUIRED)
find_package(OpenGL REQUIRED)
add_executable(bettola src/main.cpp)
target_link_libraries(bettola PRIVATE SDL3::SDL3 GLEW::glew OpenGL::GL)

46
Makefile Normal file
View File

@ -0,0 +1,46 @@
SHELL:=/bin/bash
BUILD_DIR:=bin
PROJECT_NAME:=bettola
EXECUTABLE:=$(BUILD_DIR)/$(PROJECT_NAME)
CXX_COMPILER:=clang++
CMAKE_MAKEFILE:=$(BUILD_DIR)/Makefile
.PHONY: all build config run clean help
# Default.
all: build
# Build project, if not configured, then do that first.
build: $(CMAKE_MAKEFILE)
@echo "==== Building Bettola ===="
@cmake --build $(BUILD_DIR)
# run 'config' target if the build directory or CMake cache is missing.
$(CMAKE_MAKEFILE):
$(MAKE) config
config:
@echo "==== Configuring Bettola with CMake ===="
@mkdir -p $(BUILD_DIR)
@cmake -S . -B$(BUILD_DIR) -DCMAKE_CXX_COMPILER=$(CXX_COMPILER)
# Build and run.
run: all
@echo "==== Running Bettola ===="
$(EXECUTABLE)
# Remove build dir.
clean:
@echo "==== Cleaning Bettola ===="
@rm -rf $(BUILD_DIR)
@echo "==== Project Cleaned ===="
help:
@echo "Available commands:"
@echo " make - Build the project (default)."
@echo " make build - Build the project."
@echo " make run - Build and run the project."
@echo " make config - Force CMake to re-configure the project."
@echo " make clean - Remove all build files"

39
README.org Normal file
View File

@ -0,0 +1,39 @@
#+TITLE: Bettola Game
A 2D RPG game and engine created with C++, SDL3, and OpenGL.
* Dependencies
The following dependencies are requird:
- A C++ compiler (e.g., clang, g++)
- CMake (3.16 or newer)
- SDL3 development libraries
- GLEW development libraries
** Installation (Debian)
You can install all required dependencies with the following command:
#+BEGIN_SRC bash
sudo apt update
sudo apt install build-essential clang cmake libsdl3-dev libglew-dev
#+END_SRC
* Build Instructions
This project uses a top-level Makefile to simplify the CMake workflow. All build artifacts will be placed in the =bin/= directory.
Run the following from the root of the project directory.
- *Build the project:*
The executable will be located in =bin/bettola=.
#+BEGIN_SRC bash
make
#+END_SRC
- *Build and run the project:*
#+BEGIN_SRC bash
make run
#+END_SRC
- *Clean the project:*
This removes the =bin/= directory.
#+BEGIN_SRC bash
make clean
#+END_SRC

84
src/main.cpp Normal file
View File

@ -0,0 +1,84 @@
#include <SDL3/SDL.h>
#include <GL/glew.h>
#include <SDL3/SDL_error.h>
#include <cstdio>
const int SCREEN_WIDTH = 800;
const int SCREEN_HEIGHT = 600;
int main(int argc, char* argv[]) {
/* Initialise SDL. */
if(!SDL_Init(SDL_INIT_VIDEO)) {
fprintf(stderr, "Failed to init SDL! SDL ERROR: %s\n", SDL_GetError());
return -1;
}
/* OpenGL context attributes */
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
/* Create the window. */
SDL_Window* window = SDL_CreateWindow(
"Bettola Makes No Sense!",
SCREEN_WIDTH,
SCREEN_HEIGHT,
SDL_WINDOW_OPENGL
);
if(!window) {
fprintf(stderr, "Failed to create window! SDL_ERROR: %s\n", SDL_GetError());
SDL_Quit();
return -1;
}
/* OpenGL context. */
SDL_GLContext gl_context = SDL_GL_CreateContext(window);
if(!gl_context) {
fprintf(stderr, "Failed to create OpenGL context! SDL_ERROR: %s\n", SDL_GetError());
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
/* GLEW init - Must be done AFTER creating the GL context. */
glewExperimental = GL_TRUE;
GLenum glew_error = glewInit();
if(glew_error != GLEW_OK) {
fprintf(stderr, "Failed to init GLEW! %s\n", glewGetErrorString(glew_error));
SDL_GL_DestroyContext(gl_context);
SDL_DestroyWindow(window);
SDL_Quit();
return -1;
}
/* Set viewport. */
glViewport(0,0,SCREEN_WIDTH,SCREEN_HEIGHT);
/* Main game loop.. For now. */
bool is_running = true;
SDL_Event event;
while(is_running) {
/* Event handling. */
while(SDL_PollEvent(&event)) {
if(event.type == SDL_EVENT_QUIT) {
is_running = false;
}
}
/* Render that b*tch. */
glClearColor(0.1f, 0.1f, 0.3f, 1.0f); /* Dark blue or something. */
glClear(GL_COLOR_BUFFER_BIT);
/* Swap the buffers. */
SDL_GL_SwapWindow(window);
}
/* Clean up after ourselves. */
SDL_GL_DestroyContext(gl_context);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}