90/100 100 Days of Code
Jumping Ball

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 finished the button, and moved the ball to the center of the second window.
Similar to the text box, I needed to create two rectangles: one for the text and another for the button itself. The button should change color when hovered over and return to the default colors when the left mouse button is pressed while the cursor is over the button.
void GenerateButton(TTF_Font *font, SDL_Renderer *renderer, struct StartButton *startButton, 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, "Start", color);
if (startButton->width == 0 || startButton->height == 0)
{
startButton->width = buttonTextSurface->w;
startButton->height = buttonTextSurface->h;
}
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
SDL_FRect buttonBorderRect = {startButton->x, startButton->y,
startButton->width * 1.3, startButton->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 = {startButton->x * 1.04, startButton->y * 1.01,
startButton->width, startButton->height};
SDL_RenderTexture(renderer, buttonTextTexture, NULL, &buttonTextHolder);
SDL_RenderRect(renderer, &buttonBorderRect);
SDL_DestroySurface(buttonTextSurface);
buttonTextSurface = NULL;
SDL_DestroyTexture(buttonTextTexture);
}
I created a new bool function to check if the mouse cursor is within the button's boundaries.
bool IsHoveringStartButton(int mouseX, int mouseY, struct StartButton startButton)
{
if (mouseX >= startButton.x&& mouseX <= startButton.x + startButton.width * 1.3)
{
if (mouseY >= startButton.y && mouseY <= startButton.y + startButton.height * 1.3)
{
return true;
}
}
return false;
}
After setting, the button's position,
startButton.x = windowWidth * 0.22;
startButton.y = windowHeight * 0.3;
startButton.height = 0;
startButton.width = 0;
I used a combination of the IsHoveringStartButton function and the mouseState variable in a if-else statement to control how the button reacts when the use interacts with it.
if ((mouseState &SDL_BUTTON_LMASK) != 0 && IsHoveringStartButton(mouseX, mouseY, startButton))
{
GenerateButton(appFont, appRenderer, &startButton, false);
}
else
{
GenerateButton(appFont, appRenderer, &startButton, IsHoveringStartButton(mouseX, mouseY, startButton));
}




