raylib-zig/examples/core/window_flags.zig

312 lines
11 KiB
Zig

//! # raylib-zig [core] example - window flags
//!
//! Example originally created with raylib-zig 5.0, last time updated with
//! raylib-zig 5.0
//!
//! Example licensed under an unmodified zlib/libpng license, which is an
//! OSI-certified, BSD-like license that allows static linking with closed
//! source software
//!
//! Copyright (c) Nikolas Wipper 2024
const rl = @import("raylib");
const rlm = @import("raymath");
const screen_width = 800;
const screen_height = 450;
pub fn main() anyerror!void {
// Initialization
// -------------------------------------------------------------------------
// Possible window flags
// flag_vsync_hint
// flag_fullscreen_mode -> not working properly -> wrong scaling!
// flag_window_resizable
// flag_window_undecorated
// flag_window_transparent
// flag_window_hidden
// flag_window_minimized -> Not supported on window creation
// flag_window_maximized -> Not supported on window creation
// flag_window_unfocused
// flag_window_topmost
// flag_window_highdpi -> errors after minimize-resize, fb size is recalculated
// flag_window_always_run
// flag_msaa_4x_hint
// Set configuration flags for window creation
// rl.setConfigFlags(
// @enumFromInt(@intFromEnum(rl.ConfigFlags.flag_vsync_hint) | @intFromEnum(rl.ConfigFlags.flag_msaa_4x_hint) | @intFromEnum(rl.ConfigFlags.flag_window_highdpi)),
// );
rl.initWindow(
screen_width,
screen_height,
"raylib-zig [core] example - window flags",
);
defer rl.closeWindow(); // Close window and OpenGL context
var ball_position = rl.Vector2.init(
@floatFromInt(@divFloor(rl.getScreenWidth(), 2)),
@floatFromInt(@divFloor(rl.getScreenHeight(), 2)),
);
var ball_speed = rl.Vector2.init(5, 4);
const ball_radius: f32 = 20;
var frames_counter: i32 = 0;
rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
while (!rl.windowShouldClose()) {
// Update
// ---------------------------------------------------------------------
if (rl.isKeyPressed(.key_f)) rl.toggleFullscreen(); // Modifies window size when scaling!
if (rl.isKeyPressed(.key_r)) {
if (rl.isWindowState(rl.ConfigFlags { .window_resizable = true })) {
rl.clearWindowState(rl.ConfigFlags { .window_resizable = true });
} else {
rl.setWindowState(rl.ConfigFlags { .window_resizable = true });
}
}
if (rl.isKeyPressed(.key_d)) {
if (rl.isWindowState(rl.ConfigFlags { .window_undecorated = true })) {
rl.clearWindowState(rl.ConfigFlags { .window_undecorated = true });
} else {
rl.setWindowState(rl.ConfigFlags { .window_undecorated = true });
}
}
if (rl.isKeyPressed(.key_h)) {
if (!rl.isWindowState(rl.ConfigFlags { .window_hidden = true })) {
rl.setWindowState(rl.ConfigFlags { .window_hidden = true });
}
frames_counter = 0;
}
if (rl.isWindowState(rl.ConfigFlags { .window_hidden = true })) {
frames_counter += 1;
if (frames_counter >= 240) rl.clearWindowState(rl.ConfigFlags { .window_hidden = true }); // Show window after 3 seconds
}
if (rl.isKeyPressed(.key_n)) {
if (!rl.isWindowState(rl.ConfigFlags { .window_minimized = true })) {
rl.minimizeWindow();
}
frames_counter = 0;
}
if (rl.isWindowState(rl.ConfigFlags { .window_minimized = true })) {
frames_counter += 1;
if (frames_counter >= 240) rl.restoreWindow(); // Restore window after 3 seconds
}
if (rl.isKeyPressed(.key_m)) {
// NOTE: Requires `flag_window_resizable` enabled!
if (rl.isWindowState(rl.ConfigFlags { .window_maximized = true })) {
rl.restoreWindow();
} else rl.maximizeWindow();
}
if (rl.isKeyPressed(.key_u)) {
if (rl.isWindowState(rl.ConfigFlags { .window_unfocused = true })) {
rl.clearWindowState(rl.ConfigFlags { .window_unfocused = true });
} else rl.setWindowState(rl.ConfigFlags { .window_unfocused = true });
}
if (rl.isKeyPressed(.key_t)) {
if (rl.isWindowState(rl.ConfigFlags { .window_topmost = true })) {
rl.clearWindowState(rl.ConfigFlags { .window_topmost = true });
} else rl.setWindowState(rl.ConfigFlags { .window_topmost = true });
}
if (rl.isKeyPressed(.key_a)) {
if (rl.isWindowState(rl.ConfigFlags { .window_always_run = true })) {
rl.clearWindowState(rl.ConfigFlags { .window_always_run = true });
} else rl.setWindowState(rl.ConfigFlags { .window_always_run = true });
}
if (rl.isKeyPressed(.key_v)) {
if (rl.isWindowState(rl.ConfigFlags { .vsync_hint = true })) {
rl.clearWindowState(rl.ConfigFlags { .vsync_hint = true });
} else rl.setWindowState(rl.ConfigFlags { .vsync_hint = true });
}
// Bouncing ball logic
ball_position = rlm.vector2Add(ball_position, ball_speed);
if (ball_position.x >= (@as(f32, @floatFromInt(rl.getScreenWidth())) - ball_radius) or ball_position.x <= ball_radius) {
ball_speed.x *= -1;
}
if (ball_position.y >= (@as(f32, @floatFromInt(rl.getScreenHeight())) - ball_radius) or ball_position.y <= ball_radius) {
ball_speed.y *= -1;
}
// ---------------------------------------------------------------------
// Draw
// ---------------------------------------------------------------------
{
rl.beginDrawing();
defer rl.endDrawing();
if (rl.isWindowState(rl.ConfigFlags { .window_transparent = true })) {
rl.clearBackground(rl.Color.blank);
} else rl.clearBackground(rl.Color.ray_white);
rl.drawCircleV(ball_position, ball_radius, rl.Color.maroon);
rl.drawRectangleLinesEx(
rl.Rectangle.init(0, 0, @floatFromInt(rl.getScreenWidth()), @floatFromInt(rl.getScreenHeight())),
4,
rl.Color.ray_white,
);
rl.drawCircleV(rl.getMousePosition(), 10, rl.Color.dark_blue);
rl.drawFPS(10, 10);
rl.drawText(
rl.textFormat("Screen Size: [%i, %i]", .{ rl.getScreenWidth(), rl.getScreenHeight() }),
10,
40,
10,
rl.Color.green,
);
// Draw window state info
rl.drawText(
"Following flags can be set after window creation:",
10,
60,
10,
rl.Color.gray,
);
rl.drawText(
rl.textFormat("[F] flag_fullscreen_mode: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .fullscreen_mode = true }))),
}),
10,
80,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[R] flag_window_resizable: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_resizable = true }))),
}),
10,
100,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[D] flag_window_undecorated: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_undecorated = true }))),
}),
10,
120,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[H] flag_window_hidden: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_hidden = true }))),
}),
10,
140,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[N] flag_window_minimized: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_minimized = true }))),
}),
10,
160,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[M] flag_window_maximized: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_maximized = true }))),
}),
10,
180,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[U] flag_window_unfocused: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_unfocused = true }))),
}),
10,
200,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[T] flag_window_topmost: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_topmost = true }))),
}),
10,
220,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[A] flag_window_always_run: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_always_run = true }))),
}),
10,
240,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("[V] flag_vsync_hint: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .vsync_hint = true }))),
}),
10,
260,
10,
rl.Color.lime,
);
rl.drawText(
"Following flags can only be set before window creation:",
10,
300,
10,
rl.Color.gray,
);
rl.drawText(
rl.textFormat("flag_window_highdpi: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_highdpi = true }))),
}),
10,
320,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("flag_window_transparent: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .window_transparent = true }))),
}),
10,
340,
10,
rl.Color.lime,
);
rl.drawText(
rl.textFormat("flag_msaa_4x_hint: %d", .{
@as(i32, @intFromBool(rl.isWindowState(rl.ConfigFlags { .msaa_4x_hint = true }))),
}),
10,
360,
10,
rl.Color.lime,
);
}
// ---------------------------------------------------------------------
}
}