Skip to main content

Command Palette

Search for a command to run...

Day 96/100 100 Days of Code

Jumping Ball

Published
2 min read
Day 96/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.

I created an Exit button to make quitting the application easier. I edited the startbutton.c and startbutton.h files and renamed them to button. Since I am now using multiple buttons, I decided to create a generic Button struct to handle both buttons.

button.h

#pragma once
#include <SDL3/SDL.h>
#include <SDL3_ttf/SDL_ttf.h>
#include <stdbool.h>
#include <stdlib.h>

struct Button 
{
    int x;
    int y;
    float width;
    float height;
    char *text;
};

void GenerateButton(TTF_Font *font, SDL_Renderer *renderer, struct Button *button, bool isHovering);
bool IsHoveringButton(int mouseX, int mouseY, struct Button button);

button.c

#include "button.h"

void GenerateButton(TTF_Font *font, SDL_Renderer *renderer, struct Button *button, bool isHovering)
{    
    SDL_Color color;

    if (isHovering) 
    {
        color.r = 0x00;
        color.g = 0x00;
        color.b = 0x00;
        color.a = 0xFF;
    }else
    {
        color.r = 0xFF;
        color.g = 0xFF;
        color.b = 0xFF;
        color.a = 0xFF;
    }

    SDL_Surface *buttonTextSurface = TTF_RenderText_Solid(font, button->text, color);

    if (button->width == 0 || button->height == 0)
    {
        button->width = buttonTextSurface->w;
        button->height = buttonTextSurface->h; 
    }

    SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
    SDL_FRect buttonBorderRect = {button->x, button->y, button->width * 1.3, button->height * 1.3};

    if (isHovering)
    {
        SDL_RenderFillRect(renderer, &buttonBorderRect);
    }else
    {
        SDL_RenderRect(renderer, &buttonBorderRect);
    }

    SDL_Texture *buttonTextTexture = SDL_CreateTextureFromSurface(renderer, buttonTextSurface);
    const SDL_FRect buttonTextHolder = {button->x * 1.04, button->y * 1.01, button->width, button->height};

    SDL_RenderTexture(renderer, buttonTextTexture, NULL, &buttonTextHolder);

    SDL_RenderRect(renderer, &buttonBorderRect);

    SDL_DestroySurface(buttonTextSurface);
    buttonTextSurface = NULL;
    SDL_DestroyTexture(buttonTextTexture);
}

bool IsHoveringButton(int mouseX, int mouseY, struct Button button)
{
    if (mouseX >= button.x && mouseX <= button.x + button.width * 1.3)
    {
        if (mouseY >= button.y && mouseY <= button.y + button.height * 1.3)
        {
            return true;
        }
    }

    return false;
}

For the confusing string problem, I asked for help on freeCodeCamp. I received some incredibly helpful messages. Strings in C are very tricky, and there can be difficult problems to solve. It might be better to use libraries instead.

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.