added player
This commit is contained in:
207
src/entities/player.zig
Normal file
207
src/entities/player.zig
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
const rl = @import("raylib");
|
||||||
|
|
||||||
|
pub const premium_character_path = "/Users/ratludu/Downloads/Sprout Lands - Sprites - premium pack/Characters/Premium Charakter Spritesheet.png";
|
||||||
|
|
||||||
|
const state = enum { idle, hoeForward, walkLeft, walkRight, walkUp, walkDown };
|
||||||
|
const direction = enum { left, right, up, down };
|
||||||
|
const animations = enum { repeating, oneshot };
|
||||||
|
|
||||||
|
pub const Animation = struct {
|
||||||
|
type: animations,
|
||||||
|
first: u32,
|
||||||
|
last: u32,
|
||||||
|
current: u32,
|
||||||
|
|
||||||
|
speed: f32,
|
||||||
|
durationLeft: f32,
|
||||||
|
|
||||||
|
pub fn init(animation_type: animations, first: u32, last: u32, current: u32) Animation {
|
||||||
|
return Animation{
|
||||||
|
.type = animation_type,
|
||||||
|
.first = first,
|
||||||
|
.last = last,
|
||||||
|
.current = current,
|
||||||
|
.speed = 0.1,
|
||||||
|
.durationLeft = 0.1,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn animation_frame(self: *Animation, num_frames_per_row: u32, tile_size: f32) rl.Rectangle {
|
||||||
|
const x: f32 = @as(f32, @floatFromInt(self.current % num_frames_per_row)) * tile_size;
|
||||||
|
const y: f32 = @as(f32, @floatFromInt(self.current / num_frames_per_row)) * tile_size;
|
||||||
|
|
||||||
|
return rl.Rectangle{
|
||||||
|
.x = x,
|
||||||
|
.y = y,
|
||||||
|
.width = tile_size,
|
||||||
|
.height = tile_size,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn animationUpdate(self: *Animation) void {
|
||||||
|
const dt: f32 = rl.getFrameTime();
|
||||||
|
self.durationLeft -= dt;
|
||||||
|
|
||||||
|
if (self.durationLeft <= 0.0) {
|
||||||
|
self.durationLeft = self.speed;
|
||||||
|
self.current += 1;
|
||||||
|
|
||||||
|
if (self.current > self.last) {
|
||||||
|
switch (self.type) {
|
||||||
|
.repeating => blk: {
|
||||||
|
self.current = self.first;
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.oneshot => blk: {
|
||||||
|
self.current = self.last;
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
pub const Player = struct {
|
||||||
|
sourceRect: rl.Rectangle,
|
||||||
|
playerSprite: rl.Texture2D,
|
||||||
|
playerState: state,
|
||||||
|
playerDirection: direction,
|
||||||
|
anim: Animation,
|
||||||
|
|
||||||
|
pub fn init() rl.RaylibError!Player {
|
||||||
|
const player_sprite = try rl.loadTexture(premium_character_path);
|
||||||
|
var source_rect = rl.Rectangle.init(0, 0, 48, 48);
|
||||||
|
_ = &source_rect;
|
||||||
|
|
||||||
|
var anim = Animation.init(.repeating, 0, 7, 0);
|
||||||
|
_ = &anim;
|
||||||
|
|
||||||
|
return Player{
|
||||||
|
.sourceRect = source_rect,
|
||||||
|
.playerSprite = player_sprite,
|
||||||
|
.playerState = state.idle,
|
||||||
|
.playerDirection = direction.down,
|
||||||
|
.anim = anim,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(self: *Player, new_state: state) void {
|
||||||
|
if (new_state == self.playerState) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
self.playerState = new_state;
|
||||||
|
|
||||||
|
switch (self.playerState) {
|
||||||
|
.idle => blk: {
|
||||||
|
idleAnimation(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.hoeForward => blk: {
|
||||||
|
hoeForward(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.walkLeft => blk: {
|
||||||
|
walkLeft(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.walkRight => blk: {
|
||||||
|
walkRight(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.walkUp => blk: {
|
||||||
|
walkUp(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
.walkDown => blk: {
|
||||||
|
walkDown(self);
|
||||||
|
break :blk;
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn animate(self: *Player, screenWidth: i32, screenHeight: i32) void {
|
||||||
|
rl.drawTexturePro(self.playerSprite, self.anim.animation_frame(8, 48), .{ .x = @floatFromInt(@divFloor(screenWidth, 2) - 100 / 2), .y = @floatFromInt(@divFloor(screenHeight, 2) - 100 / 2), .width = 100, .height = 100 }, .{ .x = 0.0, .y = 0.0 }, 0.0, .white);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn idleAnimation(self: *Player) void {
|
||||||
|
var anim = Animation.init(.repeating, 0, 7, 0);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn hoeForward(self: *Player) void {
|
||||||
|
const first = 12 * 8;
|
||||||
|
var anim = Animation.init(.oneshot, first, first + 7, first);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn walkLeft(self: *Player) void {
|
||||||
|
const first = 8 * 7;
|
||||||
|
var anim = Animation.init(.oneshot, first, first + 7, first);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn walkRight(self: *Player) void {
|
||||||
|
const first = 8 * 6;
|
||||||
|
var anim = Animation.init(.oneshot, first, first + 7, first);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn walkUp(self: *Player) void {
|
||||||
|
const first = 8 * 9;
|
||||||
|
var anim = Animation.init(.oneshot, first, first + 7, first);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn walkDown(self: *Player) void {
|
||||||
|
const first = 8 * 8;
|
||||||
|
var anim = Animation.init(.oneshot, first, first + 7, first);
|
||||||
|
_ = &anim;
|
||||||
|
self.anim = anim;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn walkingUpdate(self: *Player) void {
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.a)) {
|
||||||
|
self.update(.walkLeft);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.d)) {
|
||||||
|
self.update(.walkRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.w)) {
|
||||||
|
self.update(.walkUp);
|
||||||
|
}
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.s)) {
|
||||||
|
self.update(.walkDown);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn resetToIdle(self: *Player) void {
|
||||||
|
if (self.anim.current == self.anim.last and self.anim.type == .oneshot) {
|
||||||
|
self.update(.idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rl.isKeyDown(rl.KeyboardKey.a) and self.playerState == .walkLeft) {
|
||||||
|
self.update(.idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rl.isKeyDown(rl.KeyboardKey.d) and self.playerState == .walkRight) {
|
||||||
|
self.update(.idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rl.isKeyDown(rl.KeyboardKey.s) and self.playerState == .walkDown) {
|
||||||
|
self.update(.idle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rl.isKeyDown(rl.KeyboardKey.w) and self.playerState == .walkUp) {
|
||||||
|
self.update(.idle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
54
src/main.zig
54
src/main.zig
@@ -1,6 +1,18 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const Hidden_Leaf_Island = @import("Hidden_Leaf_Island");
|
const Hidden_Leaf_Island = @import("Hidden_Leaf_Island");
|
||||||
const rl = @import("raylib");
|
const rl = @import("raylib");
|
||||||
|
const Entities = @import("entities/player.zig");
|
||||||
|
|
||||||
|
fn toggleFullScreen(windowWidth: i32, windowHeight: i32) void {
|
||||||
|
if (!rl.isWindowFullscreen()) {
|
||||||
|
const monitor = rl.getCurrentMonitor();
|
||||||
|
rl.setWindowSize(rl.getMonitorWidth(monitor), rl.getMonitorHeight(monitor));
|
||||||
|
rl.toggleFullscreen();
|
||||||
|
} else {
|
||||||
|
rl.toggleFullscreen();
|
||||||
|
rl.setWindowSize(windowWidth, windowHeight);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn main() anyerror!void {
|
pub fn main() anyerror!void {
|
||||||
// Initialization
|
// Initialization
|
||||||
@@ -13,31 +25,25 @@ pub fn main() anyerror!void {
|
|||||||
|
|
||||||
rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
|
rl.setTargetFPS(60); // Set our game to run at 60 frames-per-second
|
||||||
//--------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------
|
||||||
const sprite = try rl.loadTexture("/home/ratludu/assets/Sprout Lands - Sprites - premium pack/Characters/Basic Charakter Actions.png");
|
var player = try Entities.Player.init();
|
||||||
defer rl.unloadTexture(sprite);
|
defer rl.unloadTexture(player.playerSprite);
|
||||||
|
|
||||||
const sourceRect = rl.Rectangle{
|
|
||||||
.x = 0.0,
|
|
||||||
.y = 0.0,
|
|
||||||
.width = 32.0,
|
|
||||||
.height = 32.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
const destRect = rl.Rectangle{
|
|
||||||
.x = screenWidth / 2 - 32,
|
|
||||||
.y = screenHeight / 2 - 32,
|
|
||||||
.width = 64.0,
|
|
||||||
.height = 64.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
const positiion = rl.Vector2{
|
|
||||||
.x = destRect.width + destRect.width / 2,
|
|
||||||
.y = destRect.height + destRect.width / 2,
|
|
||||||
};
|
|
||||||
|
|
||||||
// Main game loop
|
// Main game loop
|
||||||
while (!rl.windowShouldClose()) { // Detect window close button or ESC key
|
while (!rl.windowShouldClose()) { // Detect window close button or ESC key
|
||||||
|
// Full screen toggle
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.left_super) and rl.isKeyPressed(rl.KeyboardKey.f)) {
|
||||||
|
toggleFullScreen(screenWidth, screenHeight);
|
||||||
|
}
|
||||||
// Update
|
// Update
|
||||||
|
|
||||||
|
player.resetToIdle();
|
||||||
|
|
||||||
|
if (rl.isKeyDown(rl.KeyboardKey.e)) {
|
||||||
|
player.update(.hoeForward);
|
||||||
|
}
|
||||||
|
player.walkingUpdate();
|
||||||
|
|
||||||
|
player.anim.animationUpdate();
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
// TODO: Update your variables here
|
// TODO: Update your variables here
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
@@ -46,11 +52,11 @@ pub fn main() anyerror!void {
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
rl.beginDrawing();
|
rl.beginDrawing();
|
||||||
defer rl.endDrawing();
|
defer rl.endDrawing();
|
||||||
rl.drawTexturePro(sprite, sourceRect, destRect, positiion, 0.0, .white);
|
|
||||||
|
|
||||||
rl.clearBackground(.white);
|
player.animate(screenWidth, screenHeight);
|
||||||
|
|
||||||
|
rl.clearBackground(.sky_blue);
|
||||||
|
|
||||||
rl.drawText("Congrats! You created your first window!", 190, 200, 20, .light_gray);
|
|
||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user