Skip to content

Commit 8de2972

Browse files
committed
Starting on a game state system
1 parent 6077a81 commit 8de2972

File tree

4 files changed

+120
-19
lines changed

4 files changed

+120
-19
lines changed

game/game.zig

+29-18
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,28 @@
1-
pub const std = @import("std");
2-
pub const delve = @import("delve");
3-
pub const entities = @import("entities.zig");
4-
pub const basics = @import("../entities/basics.zig");
5-
pub const player = @import("../entities/player.zig");
6-
pub const inventory = @import("../entities/inventory.zig");
7-
pub const character = @import("../entities/character.zig");
8-
pub const box_collision = @import("../entities/box_collision.zig");
9-
pub const quakesolids = @import("../entities/quakesolids.zig");
10-
pub const mover = @import("../entities/mover.zig");
11-
pub const particles = @import("../entities/particle_emitter.zig");
12-
pub const options = @import("options.zig");
13-
pub const spinner = @import("../entities/spinner.zig");
14-
pub const stats = @import("../entities/actor_stats.zig");
15-
pub const weapons = @import("../entities/weapon.zig");
16-
pub const quakemap = @import("../entities/quakemap.zig");
17-
pub const string = @import("../utils/string.zig");
18-
pub const imgui = delve.imgui;
1+
const std = @import("std");
2+
const delve = @import("delve");
3+
const entities = @import("entities.zig");
4+
const game_states = @import("game_states.zig");
5+
const basics = @import("../entities/basics.zig");
6+
const player = @import("../entities/player.zig");
7+
const inventory = @import("../entities/inventory.zig");
8+
const character = @import("../entities/character.zig");
9+
const box_collision = @import("../entities/box_collision.zig");
10+
const quakesolids = @import("../entities/quakesolids.zig");
11+
const mover = @import("../entities/mover.zig");
12+
const particles = @import("../entities/particle_emitter.zig");
13+
const options = @import("options.zig");
14+
const spinner = @import("../entities/spinner.zig");
15+
const stats = @import("../entities/actor_stats.zig");
16+
const weapons = @import("../entities/weapon.zig");
17+
const quakemap = @import("../entities/quakemap.zig");
18+
const string = @import("../utils/string.zig");
19+
const title_screen = @import("states/title_screen.zig");
20+
const imgui = delve.imgui;
1921

2022
pub const GameInstance = struct {
2123
allocator: std.mem.Allocator,
2224
world: *entities.World,
25+
states: game_states.GameStateStack = .{},
2326

2427
player_controller: ?*player.PlayerController = null,
2528
music: ?delve.platform.audio.Sound = null,
@@ -41,6 +44,8 @@ pub const GameInstance = struct {
4144
delve.debug.log("Game instance tearing down", .{});
4245
self.world.deinit();
4346

47+
self.states.deinit();
48+
4449
// some components have globals that need to be cleaned up
4550
box_collision.deinit();
4651
particles.deinit();
@@ -90,6 +95,9 @@ pub const GameInstance = struct {
9095
.stream = true,
9196
.loop = true,
9297
});
98+
99+
const title_scr = try title_screen.TitleScreen.init();
100+
self.states.setState(title_scr);
93101
}
94102

95103
pub fn stop(self: *GameInstance) void {
@@ -103,6 +111,9 @@ pub const GameInstance = struct {
103111
self.world.tick(delta);
104112
self.time += @floatCast(delta);
105113

114+
// TODO: Testing game states
115+
self.states.tick(delta);
116+
106117
if (delve.platform.input.isKeyJustPressed(.K)) {
107118
self.saveGame("test_save_game.json") catch |e| {
108119
delve.debug.warning("Could not write save game to json! {any}", .{e});

game/game_states.zig

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const std = @import("std");
2+
const delve = @import("delve");
3+
4+
pub const GameState = struct {
5+
impl_ptr: *anyopaque, // Pointer to the actual GameState struct
6+
typename: []const u8,
7+
8+
// game state interface methods
9+
_interface_tick: *const fn (self: *anyopaque, delta: f32) void,
10+
_interface_deinit: *const fn (self: *anyopaque) void,
11+
12+
// _interface_draw: *const fn (self: *anyopaque) void,
13+
// _nterface_physics_tick: *const fn (self: *anyopaque, delta: f32) void,
14+
// _interface_deinit: *const fn (self: *anyopaque) void,
15+
16+
pub fn tick(self: *GameState, delta: f32) void {
17+
self._interface_tick(self.impl_ptr, delta);
18+
}
19+
20+
pub fn deinit(self: *GameState) void {
21+
self._interface_deinit(self.impl_ptr);
22+
}
23+
};
24+
25+
/// A stack of game states, so that a pause screen could overlay a game for example
26+
pub const GameStateStack = struct {
27+
current: ?GameState = null,
28+
29+
pub fn setState(self: *GameStateStack, new_state: GameState) void {
30+
// deinit old state for now while we just have one
31+
if (self.current) |*state| {
32+
state.deinit();
33+
}
34+
35+
self.current = new_state;
36+
}
37+
38+
pub fn tick(self: *GameStateStack, delta: f32) void {
39+
if (self.current) |*state| {
40+
state.tick(delta);
41+
}
42+
}
43+
44+
pub fn deinit(self: *GameStateStack) void {
45+
if (self.current) |*state| {
46+
state.deinit();
47+
}
48+
}
49+
};

game/options.zig

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
pub const std = @import("std");
1+
const std = @import("std");
22

33
pub var options: Options = .{};
44

game/states/title_screen.zig

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const std = @import("std");
2+
const delve = @import("delve");
3+
const imgui = delve.imgui;
4+
const game_states = @import("../game_states.zig");
5+
6+
pub const TitleScreen = struct {
7+
pub fn init() !game_states.GameState {
8+
const title_screen: *TitleScreen = try delve.mem.getAllocator().create(TitleScreen);
9+
return .{
10+
.impl_ptr = title_screen,
11+
.typename = @typeName(@This()),
12+
._interface_tick = tick,
13+
._interface_deinit = deinit,
14+
};
15+
}
16+
17+
pub fn tick(self_impl: *anyopaque, delta: f32) void {
18+
_ = self_impl;
19+
_ = delta;
20+
21+
// delve.debug.log("Title screen tick!", .{});
22+
//
23+
const window_flags = imgui.ImGuiWindowFlags_NoTitleBar |
24+
imgui.ImGuiWindowFlags_NoResize |
25+
imgui.ImGuiWindowFlags_NoMove |
26+
imgui.ImGuiWindowFlags_NoScrollbar |
27+
imgui.ImGuiWindowFlags_NoSavedSettings |
28+
imgui.ImGuiWindowFlags_NoInputs;
29+
30+
imgui.igSetNextWindowPos(.{ .x = 40, .y = 180 }, imgui.ImGuiCond_Once, .{ .x = 0, .y = 0 });
31+
imgui.igSetNextWindowSize(.{ .x = 400, .y = 100 }, imgui.ImGuiCond_Once);
32+
_ = imgui.igBegin("Title Screen Window", 0, window_flags);
33+
imgui.igText("Super Boarding Party Title Screen");
34+
imgui.igEnd();
35+
}
36+
37+
pub fn deinit(self_impl: *anyopaque) void {
38+
const self = @as(*TitleScreen, @ptrCast(self_impl));
39+
delve.mem.getAllocator().destroy(self);
40+
}
41+
};

0 commit comments

Comments
 (0)