From 0fd655c351219957637abc833e43f881cf9f7f17 Mon Sep 17 00:00:00 2001 From: ThePythonator <49040244+ThePythonator@users.noreply.github.com> Date: Mon, 16 Sep 2024 14:59:35 +0100 Subject: [PATCH] fix: Stop out-of-bounds error caused by writing to wrong array The code was writing to the graphics_objects->image_ptrs array instead of to an array for button images. --- CMakeLists.txt | 2 +- include/game/Constants.hpp | 10 +++++----- src/framework/BaseGame.cpp | 10 ++++++++-- src/game/Game.cpp | 16 +++++++++------- src/game/Stages.cpp | 6 +----- 5 files changed, 24 insertions(+), 20 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c9b09a..9d760d5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.14) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) # Uncomment these to put the dlls in the same directory as the executable (useful if you don't have SDL2 installed and you're building from source) diff --git a/include/game/Constants.hpp b/include/game/Constants.hpp index d0a4382..2bdc969 100644 --- a/include/game/Constants.hpp +++ b/include/game/Constants.hpp @@ -50,11 +50,11 @@ namespace GRAPHICS_OBJECTS { }; } - namespace BUTTONS { - enum BUTTONS { - UNSELECTED, - HOVERED, - SELECTED + namespace BUTTON_IMAGE_GROUPS { + enum BUTTON_IMAGE_GROUPS { + STANDARD, + + TOTAL_BUTTON_IMAGE_GROUPS }; } diff --git a/src/framework/BaseGame.cpp b/src/framework/BaseGame.cpp index 101cca8..cbf014f 100644 --- a/src/framework/BaseGame.cpp +++ b/src/framework/BaseGame.cpp @@ -146,8 +146,7 @@ namespace Framework { graphics_objects.spritesheet_ptrs = std::vector(GRAPHICS_OBJECTS::SPRITESHEETS::TOTAL_SPRITESHEETS); graphics_objects.font_ptrs = std::vector(GRAPHICS_OBJECTS::FONTS::TOTAL_FONTS); graphics_objects.transition_ptrs = std::vector(GRAPHICS_OBJECTS::TRANSITIONS::TOTAL_TRANSITIONS); - - //graphics_objects.button_image_groups = std::vector(GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::TOTAL_BUTTON_IMAGE_GROUPS); + graphics_objects.button_image_groups = std::vector(GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::TOTAL_BUTTON_IMAGE_GROUPS); // Load game data load_data(); @@ -189,6 +188,13 @@ namespace Framework { } graphics_objects.transition_ptrs.clear(); + // Clear button images + for (const Framework::Button::ButtonImages& button_images : graphics_objects.button_image_groups) { + delete button_images.unselected; + delete button_images.hovered; + delete button_images.selected; + } + // Clear graphics and window objects delete graphics_objects.graphics_ptr; delete graphics_objects.window_ptr; diff --git a/src/game/Game.cpp b/src/game/Game.cpp index 936914c..485ab12 100644 --- a/src/game/Game.cpp +++ b/src/game/Game.cpp @@ -37,18 +37,20 @@ void Game::load_data() { // Load button images - // TODO: change from hardcoded values!!! // TODO: also could change into a single function to create an image from a spritesheet - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::UNSELECTED] = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)); - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::UNSELECTED]->set_render_target(); + graphics_objects.button_image_groups[GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::STANDARD] = { + .unselected = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)), + .hovered = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)), + .selected = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)), + }; + + graphics_objects.button_image_groups[GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::STANDARD].unselected->set_render_target(); graphics_objects.spritesheet_ptrs[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET]->rect(Framework::Rect(0, 16, 64, 16), Framework::Vec(0, 0), 1.0f); - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::HOVERED] = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)); - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::HOVERED]->set_render_target(); + graphics_objects.button_image_groups[GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::STANDARD].hovered->set_render_target(); graphics_objects.spritesheet_ptrs[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET]->rect(Framework::Rect(0, 32, 64, 16), Framework::Vec(0, 0), 1.0f); - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::SELECTED] = Framework::create_image(graphics_objects.graphics_ptr, Framework::Vec(64, 16)); - graphics_objects.image_ptrs[GRAPHICS_OBJECTS::BUTTONS::SELECTED]->set_render_target(); + graphics_objects.button_image_groups[GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::STANDARD].selected->set_render_target(); graphics_objects.spritesheet_ptrs[GRAPHICS_OBJECTS::SPRITESHEETS::MAIN_SPRITESHEET]->rect(Framework::Rect(0, 48, 64, 16), Framework::Vec(0, 0), 1.0f); Framework::SDLUtils::SDL_UnsetRenderTarget(graphics_objects.graphics_ptr->get_renderer()); diff --git a/src/game/Stages.cpp b/src/game/Stages.cpp index cf88d01..3655733 100644 --- a/src/game/Stages.cpp +++ b/src/game/Stages.cpp @@ -7,11 +7,7 @@ void TitleStage::start() { buttons = { Framework::Button( Framework::Rect(128, 0, 256, 64), - Framework::Button::ButtonImages{ - graphics_objects->image_ptrs[GRAPHICS_OBJECTS::BUTTONS::UNSELECTED], - graphics_objects->image_ptrs[GRAPHICS_OBJECTS::BUTTONS::HOVERED], - graphics_objects->image_ptrs[GRAPHICS_OBJECTS::BUTTONS::SELECTED] - }, + graphics_objects->button_image_groups[GRAPHICS_OBJECTS::BUTTON_IMAGE_GROUPS::STANDARD], Framework::Text(graphics_objects->font_ptrs[GRAPHICS_OBJECTS::FONTS::MAIN_FONT], "Play", COLOURS::BLACK, 4.0f) ) };