make controls work with keyboard and gamepads
This commit is contained in:
parent
70256a1547
commit
eb305add94
@ -12,11 +12,11 @@ pub fn build(b: *std.Build) void {
|
|||||||
.optimize = optimize,
|
.optimize = optimize,
|
||||||
});
|
});
|
||||||
|
|
||||||
raylib.addTo(b, exe, target, optimize, .{});
|
|
||||||
|
|
||||||
const git_submodule_run = b.addSystemCommand(&.{"git", "submodule", "update", "--init", "--recursive"});
|
const git_submodule_run = b.addSystemCommand(&.{"git", "submodule", "update", "--init", "--recursive"});
|
||||||
exe.step.dependOn(&git_submodule_run.step);
|
exe.step.dependOn(&git_submodule_run.step);
|
||||||
|
|
||||||
|
raylib.addTo(b, exe, target, optimize, .{});
|
||||||
|
|
||||||
b.installArtifact(exe);
|
b.installArtifact(exe);
|
||||||
|
|
||||||
const run_cmd = b.addRunArtifact(exe);
|
const run_cmd = b.addRunArtifact(exe);
|
||||||
|
@ -2,6 +2,7 @@ const rl = @import("raylib");
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const assert = std.debug.assert;
|
const assert = std.debug.assert;
|
||||||
|
const PlayerInput = @import("player-input.zig");
|
||||||
|
|
||||||
const friction = 0.99;
|
const friction = 0.99;
|
||||||
const walkForce = 4000;
|
const walkForce = 4000;
|
||||||
@ -151,7 +152,6 @@ pub fn tick(self: *Self) !void {
|
|||||||
|
|
||||||
const screenWidth: f32 = @floatFromInt(rl.GetScreenWidth());
|
const screenWidth: f32 = @floatFromInt(rl.GetScreenWidth());
|
||||||
const screenHeight: f32 = @floatFromInt(rl.GetScreenHeight());
|
const screenHeight: f32 = @floatFromInt(rl.GetScreenHeight());
|
||||||
const mouseDelta = rl.GetMouseDelta();
|
|
||||||
|
|
||||||
self.camera.offset.x = screenWidth/2;
|
self.camera.offset.x = screenWidth/2;
|
||||||
self.camera.offset.y = screenHeight/2;
|
self.camera.offset.y = screenHeight/2;
|
||||||
@ -173,44 +173,9 @@ pub fn tick(self: *Self) !void {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
var moveDx: f32 = 0;
|
player.handDirection = PlayerInput.getHandPosition();
|
||||||
var moveDy: f32 = 0;
|
|
||||||
if (rl.IsKeyDown(rl.KeyboardKey.KEY_W)) {
|
|
||||||
moveDy -= 1;
|
|
||||||
}
|
|
||||||
if (rl.IsKeyDown(rl.KeyboardKey.KEY_S)) {
|
|
||||||
moveDy += 1;
|
|
||||||
}
|
|
||||||
if (rl.IsKeyDown(rl.KeyboardKey.KEY_A)) {
|
|
||||||
moveDx -= 1;
|
|
||||||
}
|
|
||||||
if (rl.IsKeyDown(rl.KeyboardKey.KEY_D)) {
|
|
||||||
moveDx += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
var handDx: f32 = mouseDelta.x;
|
|
||||||
var handDy: f32 = mouseDelta.y;
|
|
||||||
|
|
||||||
var gamepad: i32 = 0;
|
|
||||||
if (rl.IsGamepadAvailable(gamepad)) {
|
|
||||||
moveDx += rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_LEFT_X);
|
|
||||||
moveDy += rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_LEFT_Y);
|
|
||||||
|
|
||||||
handDx += rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_RIGHT_X);
|
|
||||||
handDy += rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_RIGHT_Y);
|
|
||||||
}
|
|
||||||
|
|
||||||
var moveDir = rl.Vector2{ .x = moveDx, .y = moveDy };
|
|
||||||
moveDir = rl.Vector2Normalize(moveDir);
|
|
||||||
if (moveDir.x != 0 or moveDir.y != 0) {
|
|
||||||
player.handDirection = moveDir;
|
|
||||||
}
|
|
||||||
if (handDx != 0 or handDy != 0) {
|
|
||||||
player.handDirection.x = handDx;
|
|
||||||
player.handDirection.y = handDy;
|
|
||||||
player.handDirection = player.handDirection.normalize();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
const moveDir = PlayerInput.getWalkDirection();
|
||||||
player.acceleration = moveDir;
|
player.acceleration = moveDir;
|
||||||
player.acceleration = rl.Vector2Scale(player.acceleration, walkForce);
|
player.acceleration = rl.Vector2Scale(player.acceleration, walkForce);
|
||||||
|
|
||||||
|
90
src/player-input.zig
Normal file
90
src/player-input.zig
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
const rl = @import("raylib");
|
||||||
|
const std = @import("std");
|
||||||
|
|
||||||
|
const gamepad: i32 = 0;
|
||||||
|
|
||||||
|
var mouseHandPosition: rl.Vector2 = .{ .x = 0, .y = 0 };
|
||||||
|
const mouseHandRadius = 100.0;
|
||||||
|
|
||||||
|
fn clampVector(vec: rl.Vector2) rl.Vector2 {
|
||||||
|
if (vec.length2() > 1) {
|
||||||
|
return vec.normalize();
|
||||||
|
}
|
||||||
|
|
||||||
|
return vec;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getKeyboardWalkDirection() rl.Vector2 {
|
||||||
|
var dx: f32 = 0;
|
||||||
|
var dy: f32 = 0;
|
||||||
|
if (rl.IsKeyDown(rl.KeyboardKey.KEY_W)) {
|
||||||
|
dy -= 1;
|
||||||
|
}
|
||||||
|
if (rl.IsKeyDown(rl.KeyboardKey.KEY_S)) {
|
||||||
|
dy += 1;
|
||||||
|
}
|
||||||
|
if (rl.IsKeyDown(rl.KeyboardKey.KEY_A)) {
|
||||||
|
dx -= 1;
|
||||||
|
}
|
||||||
|
if (rl.IsKeyDown(rl.KeyboardKey.KEY_D)) {
|
||||||
|
dx += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rl.Vector2{ .x = dx, .y = dy };
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getGamepadWalkDirection() ?rl.Vector2 {
|
||||||
|
if (!rl.IsGamepadAvailable(gamepad)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const x = rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_LEFT_X);
|
||||||
|
const y = rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_LEFT_Y);
|
||||||
|
|
||||||
|
if (@fabs(x) < 0.001 and @fabs(y) < 0.001) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clampVector(.{ .x = x, .y = y });
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getWalkDirection() rl.Vector2 {
|
||||||
|
var walkDirection = getKeyboardWalkDirection().normalize();
|
||||||
|
if (getGamepadWalkDirection()) |dir| {
|
||||||
|
walkDirection = dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
return walkDirection;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getGamepadHandPosition() ?rl.Vector2 {
|
||||||
|
if (!rl.IsGamepadAvailable(gamepad)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const x = rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_RIGHT_X);
|
||||||
|
const y = rl.GetGamepadAxisMovement(gamepad, .GAMEPAD_AXIS_RIGHT_Y);
|
||||||
|
|
||||||
|
if (@fabs(x) < 0.001 and @fabs(y) < 0.001) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clampVector(.{ .x = x, .y = y });
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getMouseHandPosition() rl.Vector2 {
|
||||||
|
const mouseDelta = rl.GetMouseDelta();
|
||||||
|
|
||||||
|
mouseHandPosition = clampVector(mouseHandPosition.add(mouseDelta.scale(1.0/mouseHandRadius)));
|
||||||
|
|
||||||
|
return mouseHandPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getHandPosition() rl.Vector2 {
|
||||||
|
var handPosition = getMouseHandPosition();
|
||||||
|
if (getGamepadHandPosition()) |pos| {
|
||||||
|
handPosition = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return clampVector(handPosition);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user