WIP | Implement basic menu rendering

This commit is contained in:
Dusk 2022-08-13 14:35:35 +02:00
parent 735ff622a0
commit a46d4ede0d
5 changed files with 102 additions and 31 deletions

View File

@ -10,20 +10,20 @@ const Action = @import("Action.zig");
const Self = @This();
action_list: [3]Action = .{
// Action.init(SDL.SDL_SCANCODE_RIGHT, actionRight), // Tab Right
// Action.init(SDL.SDL_SCANCODE_LEFT, actionLeft), // Tab left
action_list: [5]Action = .{
Action.init(SDL.Scancode.right, actionTabRight), // Tab Right
Action.init(SDL.Scancode.left, actionTabLeft), // Tab left
Action.init(SDL.Scancode.down, actionSelDown), // Go down
Action.init(SDL.Scancode.up, actionSelUp), // Go up
Action.init(SDL.Scancode.@"return", actionSelect), // Select
},
tab_list: [2]MenuTab = [2]MenuTab{
MenuTab.init("1P", &.{
tab_list: [2]MenuTab = .{
MenuTab.init("1P", .{255, 127, 0}, &.{
MenuSelection.init("Play", play),
MenuSelection.init("Print", print),
}),
MenuTab.init("Options", &.{
MenuTab.init("Options", .{127, 0, 255}, &.{
MenuSelection.init("Play", play),
MenuSelection.init("Print", print),
}),
@ -40,15 +40,15 @@ state: State = State.main_menu,
holding_down: bool = false,
holding_enter: bool = false,
pub fn init(renderer: Renderer.Renderer) Self {
return Self{.renderer = Renderer.init(renderer)};
pub fn init(renderer: *Renderer.Renderer) Self {
return Self{ .renderer = Renderer.init(renderer) };
}
fn getSel(self: *Self) MenuSelection {
pub fn getSel(self: Self) MenuSelection {
return self.tab_list[self.tab].contents[self.sel];
}
fn getTab(self: *Self) MenuTab {
pub fn getTab(self: Self) MenuTab {
return self.tab_list[self.tab];
}
@ -77,9 +77,35 @@ pub fn tick(self: *Self) State {
//\\Selection: {s}
//\\
//, .{ tab.name, sel.name });
self.renderer.render(self.*);
return self.state;
}
pub fn getPrevTab(self: Self) usize {
if (self.tab == 0) {
return self.tab_list.len - 1;
} else {
return self.tab - 1;
}
}
pub fn getNextTab(self: Self) usize {
if (self.tab == self.tab_list.len - 1) {
return 0;
} else {
return self.tab + 1;
}
}
fn actionTabLeft(self: *Self) void {
self.tab = self.getPrevTab();
}
fn actionTabRight(self: *Self) void {
self.tab = self.getNextTab();
}
fn actionSelDown(self: *Self) void {
self.sel += 1;
self.sel %= self.tab_list[self.tab].contents.len;

View File

@ -7,12 +7,14 @@ const Self = @This();
name: []const u8,
contents: []MenuSelection,
contents_buffer: [50]MenuSelection,
color: [3]u8, // Make this const
pub fn init(name: []const u8, contents: []const MenuSelection) Self {
var ret = Self {
pub fn init(name: []const u8, color: [3]u8, contents: []const MenuSelection) Self {
var ret = Self{
.name = name,
.contents = undefined,
.contents_buffer = undefined,
.color = color,
};
std.mem.copy(MenuSelection, &ret.contents_buffer, contents);
ret.contents = ret.contents_buffer[0..contents.len];

View File

@ -7,10 +7,47 @@ const color = @import("../color.zig");
const Self = @This();
renderer: Renderer,
renderer: *Renderer,
pub fn init(renderer: Renderer) Self {
return Self {
pub fn init(renderer: *Renderer) Self {
return Self{
.renderer = renderer,
};
}
pub fn render(self: Self, main_menu: MainMenu) void {
const width = 100;
const spacing = 10;
const height = 20;
const tabs = [_]usize{
main_menu.getPrevTab(),
main_menu.tab,
main_menu.getNextTab(),
};
for (tabs) |tab, tab_i| {
const curr_tab = main_menu.tab_list[tab];
for (curr_tab.contents) |_, sel_i| {
self.renderer.setColor(curr_tab.color[0], curr_tab.color[1], curr_tab.color[2], 255);
if (main_menu.sel == sel_i and tab_i == 1) {
self.renderer.setColor(0, 255, 0, 255);
}
// Auxiliary variables to claculate the center of the screen
const wsize = self.renderer.getOutputSize();
const screen_width = @intCast(usize, wsize.width);
const total_spacing = (tabs.len-1) * spacing;
const total_width = (tabs.len * width);
// Move it from the left to the center
const centering = (screen_width - (total_width + total_spacing)) / 2;
const x = @intCast(i32, tab_i * (width+spacing) + centering);
const y = @intCast(i32, 10 + (height + spacing) * sel_i);
self.renderer.fillRectangle(x, y, width, height);
}
}
}

View File

@ -170,17 +170,23 @@ fn renderRectangle(self: *Self, x: i32, y: i32, w: i32, h: i32) void {
const i = self.vbo_index;
const vertex_data = [36]f32{
xf, yf, // up-left
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
xf + wf, yf, // up-right
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
xf, yf + hf,
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
xf + wf, yf + hf, // down-right
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
xf + wf, yf,
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
xf, yf + hf, // down-left
self.color[0], self.color[1], self.color[2], self.color[3],
self.color[0], self.color[1],
self.color[2], self.color[3],
};
std.mem.copy(f32, self.vbo[i .. i + 36], &vertex_data);
self.vbo_index += 36;

View File

@ -11,7 +11,7 @@ pub fn main() !void {
var renderer = try Renderer.init();
defer renderer.deinit();
var main_menu = MainMenu.init(renderer);
var main_menu = MainMenu.init(&renderer);
var game = Game.init(&renderer);
var current_state: State = main_menu.state;