From 63491512c71e98319072d2e9007550818d243f43 Mon Sep 17 00:00:00 2001 From: ashen <167728161+222448082Ashen@users.noreply.github.com> Date: Wed, 13 May 2026 20:53:06 +0530 Subject: [PATCH 1/2] Add JSON config and usage examples Add a sample game_config.json and multiple usage examples demonstrating reading/writing a game configuration from JSON. Files added: json/game_config.json, examples in C#, C# (OOP), C++, Python, and a short .txt explanation. Each example shows creating a JSON config, saving to file, loading it with json_from_file, extracting gameTitle, windowWidth/Height and backgroundColor, applying those settings to open a window and display values, and cleaning up resources. --- json/game_config.json | 8 +++ .../json/json_from_file-1-example-oop.cs | 60 +++++++++++++++++++ .../json/json_from_file-1-example.cpp | 60 +++++++++++++++++++ .../json/json_from_file-1-example.cs | 53 ++++++++++++++++ .../json/json_from_file-1-example.py | 53 ++++++++++++++++ .../json/json_from_file-1-example.txt | 5 ++ 6 files changed, 239 insertions(+) create mode 100644 json/game_config.json create mode 100644 public/usage-examples/json/json_from_file-1-example-oop.cs create mode 100644 public/usage-examples/json/json_from_file-1-example.cpp create mode 100644 public/usage-examples/json/json_from_file-1-example.cs create mode 100644 public/usage-examples/json/json_from_file-1-example.py create mode 100644 public/usage-examples/json/json_from_file-1-example.txt diff --git a/json/game_config.json b/json/game_config.json new file mode 100644 index 000000000..728ebbcf7 --- /dev/null +++ b/json/game_config.json @@ -0,0 +1,8 @@ +{ + "backgroundColor.b": 235, + "backgroundColor.g": 206, + "backgroundColor.r": 135, + "gameTitle": "My SplashKit Game", + "windowHeight": 600, + "windowWidth": 800 +} \ No newline at end of file diff --git a/public/usage-examples/json/json_from_file-1-example-oop.cs b/public/usage-examples/json/json_from_file-1-example-oop.cs new file mode 100644 index 000000000..e55ed3cb9 --- /dev/null +++ b/public/usage-examples/json/json_from_file-1-example-oop.cs @@ -0,0 +1,60 @@ +using SplashKitSDK; +using static SplashKitSDK.SplashKit; + +class JsonConfigLoadExample +{ + static void Main() + { + // Initialize audio system + OpenAudio(); + + // First, create a sample configuration file + dynamic config = CreateJson(); + JsonSetString(config, "gameTitle", "My SplashKit Game"); + JsonSetNumber(config, "windowWidth", 800); + JsonSetNumber(config, "windowHeight", 600); + JsonSetNumber(config, "backgroundColor.r", 135); + JsonSetNumber(config, "backgroundColor.g", 206); + JsonSetNumber(config, "backgroundColor.b", 235); + + // Save the configuration to a file + JsonToFile(config, "game_config.json"); + + // Now demonstrate loading it back + // This is what json_from_file does + dynamic loadedConfig = JsonFromFile("game_config.json"); + + // Extract the configuration values + string gameTitle = JsonReadString(loadedConfig, "gameTitle"); + double windowWidth = JsonReadNumber(loadedConfig, "windowWidth"); + double windowHeight = JsonReadNumber(loadedConfig, "windowHeight"); + int bgRed = (int)JsonReadNumber(loadedConfig, "backgroundColor.r"); + int bgGreen = (int)JsonReadNumber(loadedConfig, "backgroundColor.g"); + int bgBlue = (int)JsonReadNumber(loadedConfig, "backgroundColor.b"); + + // Create window with loaded dimensions + OpenWindow(gameTitle, (int)windowWidth, (int)windowHeight); + + // Create a color from the loaded RGB values + Color backgroundColor = RGBColor(bgRed, bgGreen, bgBlue); + + // Display the loaded configuration + ClearScreen(backgroundColor); + + DrawText("Configuration Loaded Successfully!", ColorBlack(), 50, 50); + DrawText("Game Title: " + gameTitle, ColorBlack(), 50, 100); + DrawText("Window Size: " + windowWidth + "x" + windowHeight, ColorBlack(), 50, 150); + DrawText("Background Color: RGB(" + bgRed + ", " + bgGreen + ", " + bgBlue + ")", ColorBlack(), 50, 200); + + RefreshScreen(); + + // Wait 3 seconds before closing + Delay(3000); + + // Cleanup + CloseAllWindows(); + FreeJson(config); + FreeJson(loadedConfig); + CloseAudio(); + } +} \ No newline at end of file diff --git a/public/usage-examples/json/json_from_file-1-example.cpp b/public/usage-examples/json/json_from_file-1-example.cpp new file mode 100644 index 000000000..27c276a3a --- /dev/null +++ b/public/usage-examples/json/json_from_file-1-example.cpp @@ -0,0 +1,60 @@ +#include "splashkit.h" +#include + +int main() +{ + // Initialize audio system + open_audio(); + + // First, create a sample configuration file + // This would typically already exist in your project + json config = create_json(); + json_set_string(config, "gameTitle", "My SplashKit Game"); + json_set_number(config, "windowWidth", 800); + json_set_number(config, "windowHeight", 600); + json_set_number(config, "backgroundColor.r", 135); + json_set_number(config, "backgroundColor.g", 206); + json_set_number(config, "backgroundColor.b", 235); + + // Save the configuration to a file + json_to_file(config, "game_config.json"); + + // Now demonstrate loading it back + // This is what json_from_file does + json loaded_config = json_from_file("game_config.json"); + + // Extract the configuration values + string game_title = json_read_string(loaded_config, "gameTitle"); + double window_width = json_read_number(loaded_config, "windowWidth"); + double window_height = json_read_number(loaded_config, "windowHeight"); + int bg_red = json_read_number(loaded_config, "backgroundColor.r"); + int bg_green = json_read_number(loaded_config, "backgroundColor.g"); + int bg_blue = json_read_number(loaded_config, "backgroundColor.b"); + + // Create window with loaded dimensions + open_window(game_title, window_width, window_height); + + // Create a color from the loaded RGB values + color background_color = rgb_color(bg_red, bg_green, bg_blue); + + // Display the loaded configuration + clear_screen(background_color); + + draw_text("Configuration Loaded Successfully!", COLOR_BLACK, 50, 50); + draw_text("Game Title: " + game_title, COLOR_BLACK, 50, 100); + draw_text("Window Size: " + to_string((int)window_width) + "x" + to_string((int)window_height), COLOR_BLACK, 50, 150); + draw_text("Background Color: RGB(" + to_string(bg_red) + ", " + to_string(bg_green) + ", " + to_string(bg_blue) + ")", COLOR_BLACK, 50, 200); + + refresh_screen(); + + // Wait 3 seconds before closing + delay(3000); + + // Cleanup + close_all_windows(); + free_json(config); + free_json(loaded_config); + close_audio(); + + return 0; +} \ No newline at end of file diff --git a/public/usage-examples/json/json_from_file-1-example.cs b/public/usage-examples/json/json_from_file-1-example.cs new file mode 100644 index 000000000..985e477ff --- /dev/null +++ b/public/usage-examples/json/json_from_file-1-example.cs @@ -0,0 +1,53 @@ +using SplashKitSDK; + +// Initialize audio system +SplashKit.OpenAudio(); + +// First, create a sample configuration file +dynamic config = SplashKit.CreateJson(); +SplashKit.JsonSetString(config, "gameTitle", "My SplashKit Game"); +SplashKit.JsonSetNumber(config, "windowWidth", 800); +SplashKit.JsonSetNumber(config, "windowHeight", 600); +SplashKit.JsonSetNumber(config, "backgroundColor.r", 135); +SplashKit.JsonSetNumber(config, "backgroundColor.g", 206); +SplashKit.JsonSetNumber(config, "backgroundColor.b", 235); + +// Save the configuration to a file +SplashKit.JsonToFile(config, "game_config.json"); + +// Now demonstrate loading it back +// This is what json_from_file does +dynamic loadedConfig = SplashKit.JsonFromFile("game_config.json"); + +// Extract the configuration values +string gameTitle = SplashKit.JsonReadString(loadedConfig, "gameTitle"); +double windowWidth = SplashKit.JsonReadNumber(loadedConfig, "windowWidth"); +double windowHeight = SplashKit.JsonReadNumber(loadedConfig, "windowHeight"); +int bgRed = (int)SplashKit.JsonReadNumber(loadedConfig, "backgroundColor.r"); +int bgGreen = (int)SplashKit.JsonReadNumber(loadedConfig, "backgroundColor.g"); +int bgBlue = (int)SplashKit.JsonReadNumber(loadedConfig, "backgroundColor.b"); + +// Create window with loaded dimensions +SplashKit.OpenWindow(gameTitle, (int)windowWidth, (int)windowHeight); + +// Create a color from the loaded RGB values +Color backgroundColor = SplashKit.RGBColor(bgRed, bgGreen, bgBlue); + +// Display the loaded configuration +SplashKit.ClearScreen(backgroundColor); + +SplashKit.DrawText("Configuration Loaded Successfully!", SplashKit.ColorBlack(), 50, 50); +SplashKit.DrawText("Game Title: " + gameTitle, SplashKit.ColorBlack(), 50, 100); +SplashKit.DrawText("Window Size: " + windowWidth + "x" + windowHeight, SplashKit.ColorBlack(), 50, 150); +SplashKit.DrawText("Background Color: RGB(" + bgRed + ", " + bgGreen + ", " + bgBlue + ")", SplashKit.ColorBlack(), 50, 200); + +SplashKit.RefreshScreen(); + +// Wait 3 seconds before closing +SplashKit.Delay(3000); + +// Cleanup +SplashKit.CloseAllWindows(); +SplashKit.FreeJson(config); +SplashKit.FreeJson(loadedConfig); +SplashKit.CloseAudio(); \ No newline at end of file diff --git a/public/usage-examples/json/json_from_file-1-example.py b/public/usage-examples/json/json_from_file-1-example.py new file mode 100644 index 000000000..b69fee2c9 --- /dev/null +++ b/public/usage-examples/json/json_from_file-1-example.py @@ -0,0 +1,53 @@ +from splashkit import * + +# Initialize audio system +open_audio() + +# First, create a sample configuration file +config = create_json() +json_set_string(config, "gameTitle", "My SplashKit Game") +json_set_number_integer(config, "windowWidth", 800) +json_set_number_integer(config, "windowHeight", 600) +json_set_number_integer(config, "backgroundColor.r", 135) +json_set_number_integer(config, "backgroundColor.g", 206) +json_set_number_integer(config, "backgroundColor.b", 235) + +# Save the configuration to a file +json_to_file(config, "game_config.json") + +# Now demonstrate loading it back +# This is what json_from_file does +loaded_config = json_from_file("game_config.json") + +# Extract the configuration values +game_title = json_read_string(loaded_config, "gameTitle") +window_width = json_read_number(loaded_config, "windowWidth") +window_height = json_read_number(loaded_config, "windowHeight") +bg_red = int(json_read_number(loaded_config, "backgroundColor.r")) +bg_green = int(json_read_number(loaded_config, "backgroundColor.g")) +bg_blue = int(json_read_number(loaded_config, "backgroundColor.b")) + +# Create window with loaded dimensions +open_window(game_title, int(window_width), int(window_height)) + +# Create a color from the loaded RGB values +background_color = rgb_color(bg_red, bg_green, bg_blue) + +# Display the loaded configuration +clear_screen(background_color) + +draw_text_no_font_no_size("Configuration Loaded Successfully!", color_black(), 50, 50) +draw_text_no_font_no_size(f"Game Title: {game_title}", color_black(), 50, 100) +draw_text_no_font_no_size(f"Window Size: {int(window_width)}x{int(window_height)}", color_black(), 50, 150) +draw_text_no_font_no_size(f"Background Color: RGB({bg_red}, {bg_green}, {bg_blue})", color_black(), 50, 200) + +refresh_screen() + +# Wait 3 seconds before closing +delay(3000) + +# Cleanup +close_all_windows() +free_json(config) +free_json(loaded_config) +close_audio() \ No newline at end of file diff --git a/public/usage-examples/json/json_from_file-1-example.txt b/public/usage-examples/json/json_from_file-1-example.txt new file mode 100644 index 000000000..227362b91 --- /dev/null +++ b/public/usage-examples/json/json_from_file-1-example.txt @@ -0,0 +1,5 @@ +Loading Game Configuration from JSON + +This example demonstrates how to load game settings from a JSON configuration file. +It shows how to read various data types from JSON (strings, numbers) and apply them +to configure the game window and display values. \ No newline at end of file From ba522af659957fdec9615d1f63b69820eae0d881 Mon Sep 17 00:00:00 2001 From: ashen <167728161+222448082Ashen@users.noreply.github.com> Date: Wed, 13 May 2026 20:53:45 +0530 Subject: [PATCH 2/2] Add JSON example screenshot image Add a new usage example image for the JSON `json_from_file` example at public/usage-examples/json/json_from_file-1-example.png to support documentation and visual reference. --- .../json/json_from_file-1-example.png | Bin 0 -> 20156 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/usage-examples/json/json_from_file-1-example.png diff --git a/public/usage-examples/json/json_from_file-1-example.png b/public/usage-examples/json/json_from_file-1-example.png new file mode 100644 index 0000000000000000000000000000000000000000..8c57a42aab6b9ab36c7754870bb3ba447072e3a0 GIT binary patch literal 20156 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 D3Qn|+ literal 0 HcmV?d00001