- Programming Weekly
- Posts
- Snowflakes and Code: A Journey Through Wintery Graphics in C
Snowflakes and Code: A Journey Through Wintery Graphics in C
Table of Contents
❄️ Let’s create a simple yet captivating snow simulation using C and the Raylib library.
Here’s how to bring snowflakes to life on your screen and delightfully interact with them.
Setting the Scene
In this guide, we’ll build a basic snow simulation where snowflakes drift across the screen, and users can customize their appearance and behavior through a user interface.
We’ll cover the essentials of Raylib, a C library that simplifies graphics programming, and show you how to implement a dynamic and interactive snowfall effect.
int main(void) {
const int screenWidth = 900;
const int screenHeight = 750;
InitWindow(screenWidth, screenHeight, "Relaxing Snow Application");
Snowdrop drops[MAX_DROPS];
for (int i = 0; i < MAX_DROPS; i++) {
drops[i].position.x = GetRandomValue(0, screenWidth);
drops[i].position.y = GetRandomValue(-screenHeight, 0);
drops[i].speed = (float)GetRandomValue(50, 100) / 100.0f;
drops[i].windSpeed = (float)GetRandomValue(-50, 50) / 100.0f;
drops[i].gravity = (float)GetRandomValue(90, 110) / 100.0f;
}
SetTargetFPS(60);
while (!WindowShouldClose()) {
for (int i = 0; i < MAX_DROPS; i++) {
drops[i].position.y += drops[i].speed * drops[i].gravity;
drops[i].position.x += drops[i].windSpeed;
if (drops[i].position.y > screenHeight) {
drops[i].position.y = GetRandomValue(-screenHeight, 0);
drops[i].position.x = GetRandomValue(0, screenWidth);
}
}
if (IsMouseButtonPressed(MOUSE_BUTTON_LEFT)) {
Vector2 mousePos = GetMousePosition();
Rectangle colorButton = {10, 10, 100, 30};
if (CheckCollisionPointRec(mousePos, colorButton)) {
snowColor.r = (snowColor.r + 50 > 255) ? 100 : snowColor.r + 50;
snowColor.g = snowColor.r;
snowColor.b = snowColor.r;
}
Rectangle sizeButton = {10, 50, 100, 30};
if (CheckCollisionPointRec(mousePos, sizeButton)) {
snowDropSize = (snowDropSize + 2) % 20;
}
Rectangle densityButton = {10, 90, 100, 30};
if (CheckCollisionPointRec(mousePos, densityButton)) {
snowDensity = (snowDensity + 25) % (MAX_DROPS + 1);
}
Rectangle windSpeedButton = {10, 130, 100, 30};
if (CheckCollisionPointRec(mousePos, windSpeedButton)) {
for (int i = 0; i < MAX_DROPS; i++) {
drops[i].windSpeed = (float)GetRandomValue(-100, 100) / 100.0f;
}
}
}
// Visit Github below to view the full code
// https://github.com/Sieep-Coding/snow-simulation/tree/master
The Concept
Our snow simulation code is a straightforward example of using Raylib to create an interactive graphical application.
Let’s break down the key components:
Data Structures: We define a
Snowdrop
struct to hold the properties of each snowflake, such as its position, speed, wind speed, and gravity.This structure helps us manage and update each snowflake individually.
Initialization: In the
main
function, we initialize the window and create an array ofSnowdrop
instances.Each snowflake is assigned random properties to give the effect of a natural snowfall.
User Interface: The
DrawUI
function renders a simple user interface where users can adjust the snowflake color, size, density, and wind speed.Clicking on various buttons allows us to interactively modify these parameters.
Rendering: In the main loop, we update the position of each snowflake based on its properties and redraw the scene.
Snowflakes that move off the screen are reset to the top, creating a continuous snowfall effect.
Interaction: Mouse clicks are used to change the properties of the snowflakes.
This adds an interactive element, allowing users to customize their snowy scene in real-time.
Key Takeaways
Modular Design: By separating the snowflake properties, UI elements, and rendering logic, the code remains clean and easy to understand. Each component handles a specific aspect of the simulation.
User Interaction: Incorporating interactive elements into graphics programming not only makes the application more engaging but also demonstrates how user input can influence graphical outputs.
Raylib Simplicity: Raylib provides an intuitive API for 2D graphics programming, making it an excellent choice for beginners and rapid prototyping.
Creating a snow simulation with Raylib offers a fun way to learn graphics programming and interact with your creations.
Whether you’re adding features or just experimenting, this example is a solid foundation for exploring more advanced graphics concepts.☃️
-Nick
Reply