Skip to main content

Command Palette

Search for a command to run...

Day 75/100 100 Days of Code

Rebuild Back Better

Published
2 min read
Day 75/100 100 Days of Code
C

AKA Chris, is a software developer from Athens, Greece. He started programming with basic when he was very young. He lost interest in programming during school years but after an unsuccessful career in audio, he decided focus on what he really loves which is technology.

He loves working with older languages like C and wants to start programming electronics and microcontrollers because he wants to get into embedded systems programming.

Today I worked on creating a new cursor image. The new image is a hand cursor that will be displayed when the mouse hovers over interactive objects. This is a good way to let the user know that the object they are hovering over is interactive.

To add the new image, I had to edit the Player object.

First, I created a new variable for the image.

SURFACE *interatacbleCursorImage;

Then, I updated the LoadPlayImages() method to load the new image.

template<>
bool Player<std::string, SDL_Surface, SDL_Renderer>::LoadPlayerImages(    std::string locationImage1, 
                                                                                                                                                std::string locationImage2)
{
    defaultCursorImage = IMG_Load(locationImage1.c_str());
    interatacbleCursorImage = IMG_Load(locationImage2.c_str());

    if (defaultCursorImage == nullptr || interatacbleCursorImage == nullptr)
    {
        return false;
    }
    return true;
}

To display the new Image, I added a boolean argument to the ShowCursor() method and reformed its logic to display the correct image based on the new argument.

template<>
void Player<std::string, SDL_Surface, SDL_Renderer>::ShowCursor(SDL_Renderer *renderer, bool interactive)
{
    SDL_Surface *convertImage = nullptr;
    int imageSizeDivisionValue = 0;
    if (!interactive)
    {
        convertImage = SDL_ConvertSurface(defaultCursorImage, defaultCursorImage->format);
        imageSizeDivisionValue = 50;
    }else
    {
        convertImage = SDL_ConvertSurface(interatacbleCursorImage, defaultCursorImage->format);
        imageSizeDivisionValue = 40;
    }
    if (convertImage == nullptr)
    {
        std::cout << "Failed to create default cursor ";
        std::cout << SDL_GetError() << std::endl;
        exit(-1);
    }

    SDL_Texture *defaultCursorTexture = SDL_CreateTextureFromSurface(renderer, convertImage);

    const SDL_FRect defaultCursorHolder = {    static_cast<float>(x), 
                                            static_cast<float>(y), 
                                            static_cast<float>(convertImage->w/imageSizeDivisionValue), 
                                            static_cast<float>(convertImage->h/imageSizeDivisionValue)};


    SDL_RenderTexture(renderer, defaultCursorTexture, nullptr, &defaultCursorHolder);    
    SDL_DestroyTexture(defaultCursorTexture);
    SDL_DestroySurface(convertImage);
}

I updated the CMakeLists.txt file to include the new image in the .app container.

file(GLOB INTERACTABLE_CURSOR "graphics/Player/interactable_cursor.png")

# Create Executable
add_executable(    ${PROJECT_NAME} MACOSX_BUNDLE 
                ./src/main.cpp ./src/game.h 
                ./src/game.cpp ./src/gameobject.h 
                ./src/player.h ./src/thief.h 
                ./src/gatherer.h ./src/fighter.h
                ./src/menuoptionsstructure.h ./src/audioplayer.h
                ./src/audioplayer.cpp
                ${FONT_SOURCES} ${MENU_LIGHT_UP_SOUND}
                ${MENU_MUSIC} ${DEFAULT_CURSOR} ${ATTACK_CURSOR}
                ${ENVIROMENT_BACKGROUND} ${LEAF_IMAGE} ${INTERACTABLE_CURSOR})

#Add Interactable Cursor
file(RELATIVE_PATH GET_REL_PATH "${CMAKE_CURRENT_SOURCE_DIR}" ${INTERACTABLE_CURSOR} )
get_filename_component(FILE_PATH "${GET_REL_PATH}" DIRECTORY)
set_property(SOURCE "${INTERACTABLE_CURSOR}" PROPERTY MACOSX_PACKAGE_LOCATION "Resources/${FILE_PATH}")

100 Days of Code

Part 1 of 50

100 days of code is a good initiative to go into hard mode and spend more time in programming. These 100 days will be focused on completing projects and research.