flip sprites
This commit is contained in:
parent
a4d803fc57
commit
a249dc3cf9
@ -41,6 +41,7 @@ font_id: FontName.EnumArray,
|
|||||||
pistol_mask: Gfx.TextureId,
|
pistol_mask: Gfx.TextureId,
|
||||||
bomb_mask: Gfx.TextureId,
|
bomb_mask: Gfx.TextureId,
|
||||||
laser_mask: Gfx.TextureId,
|
laser_mask: Gfx.TextureId,
|
||||||
|
bullet: Gfx.TextureId,
|
||||||
dungeon_tilemap: Tilemap,
|
dungeon_tilemap: Tilemap,
|
||||||
|
|
||||||
skeleton: Gfx.Sprite,
|
skeleton: Gfx.Sprite,
|
||||||
@ -89,14 +90,13 @@ pub fn init(gpa: std.mem.Allocator) !Assets {
|
|||||||
.rgba = laser_mask_image.rgba8_pixels
|
.rgba = laser_mask_image.rgba8_pixels
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
const skeleton_image = try STBImage.load(@embedFile("assets/skeleton.png"));
|
||||||
const creatures_image = try STBImage.load(@embedFile("assets/tiny-creatures/tilemap_packed.png"));
|
defer skeleton_image.deinit();
|
||||||
defer creatures_image.deinit();
|
const skeleton_texture = try Gfx.addTexture(&.{
|
||||||
const creatures_texture = try Gfx.addTexture(&.{
|
|
||||||
.{
|
.{
|
||||||
.width = creatures_image.width,
|
.width = skeleton_image.width,
|
||||||
.height = creatures_image.height,
|
.height = skeleton_image.height,
|
||||||
.rgba = creatures_image.rgba8_pixels
|
.rgba = skeleton_image.rgba8_pixels
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -120,17 +120,23 @@ pub fn init(gpa: std.mem.Allocator) !Assets {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const creatures_tilemap = Tilemap{
|
const bullet_image = try STBImage.load(@embedFile("assets/bullet.png"));
|
||||||
.texture = creatures_texture,
|
defer bullet_image.deinit();
|
||||||
.tile_size = .init(16, 16)
|
const bullet_texture = try Gfx.addTexture(&.{
|
||||||
};
|
.{
|
||||||
|
.width = bullet_image.width,
|
||||||
|
.height = bullet_image.height,
|
||||||
|
.rgba = bullet_image.rgba8_pixels
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const snake = Gfx.Sprite{
|
const snake = Gfx.Sprite{
|
||||||
.texture = snake_texture,
|
.texture = snake_texture,
|
||||||
.uv = .unit
|
.uv = .unit
|
||||||
};
|
};
|
||||||
const skeleton = Gfx.Sprite{
|
const skeleton = Gfx.Sprite{
|
||||||
.texture = creatures_texture,
|
.texture = skeleton_texture,
|
||||||
.uv = creatures_tilemap.getTileUV(1, 0)
|
.uv = .unit
|
||||||
};
|
};
|
||||||
const fire_spirit = Gfx.Sprite{
|
const fire_spirit = Gfx.Sprite{
|
||||||
.texture = fire_spirit_texture,
|
.texture = fire_spirit_texture,
|
||||||
@ -181,6 +187,7 @@ pub fn init(gpa: std.mem.Allocator) !Assets {
|
|||||||
.fire_spirit = fire_spirit,
|
.fire_spirit = fire_spirit,
|
||||||
.map = map,
|
.map = map,
|
||||||
.tilesets = tilesets,
|
.tilesets = tilesets,
|
||||||
|
.bullet = bullet_texture,
|
||||||
.dungeon_tilemap = .{
|
.dungeon_tilemap = .{
|
||||||
.texture = dungeon_texture,
|
.texture = dungeon_texture,
|
||||||
.tile_size = .init(16, 16)
|
.tile_size = .init(16, 16)
|
||||||
|
|||||||
BIN
src/assets/bullet.png
Normal file
BIN
src/assets/bullet.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 279 B |
BIN
src/assets/skeleton.png
Normal file
BIN
src/assets/skeleton.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 413 B |
@ -57,6 +57,7 @@ const Player = struct {
|
|||||||
last_shot_at: ?Nanoseconds = null,
|
last_shot_at: ?Nanoseconds = null,
|
||||||
invincible_until: ?Nanoseconds = null,
|
invincible_until: ?Nanoseconds = null,
|
||||||
gun: Gun = .pistol,
|
gun: Gun = .pistol,
|
||||||
|
facing_left: bool = false,
|
||||||
|
|
||||||
pub fn getRect(self: Player) Rect {
|
pub fn getRect(self: Player) Rect {
|
||||||
const pos = self.kinetic.pos;
|
const pos = self.kinetic.pos;
|
||||||
@ -93,6 +94,7 @@ const Enemy = struct {
|
|||||||
speed: f32,
|
speed: f32,
|
||||||
size: f32,
|
size: f32,
|
||||||
sprite: Sprite,
|
sprite: Sprite,
|
||||||
|
facing_left: bool = false,
|
||||||
|
|
||||||
target: ?Vec2 = null,
|
target: ?Vec2 = null,
|
||||||
distance_to_target: ?f32 = null,
|
distance_to_target: ?f32 = null,
|
||||||
@ -327,7 +329,6 @@ fn drawMap(self: *CombatScreen, frame: *Engine.Frame) void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResult {
|
pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResult {
|
||||||
|
|
||||||
const dt = frame.deltaTime();
|
const dt = frame.deltaTime();
|
||||||
|
|
||||||
var result = TickResult{
|
var result = TickResult{
|
||||||
@ -476,6 +477,10 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul
|
|||||||
}
|
}
|
||||||
dir = dir.normalized();
|
dir = dir.normalized();
|
||||||
|
|
||||||
|
if (dir.x != 0) {
|
||||||
|
self.player.facing_left = dir.x < 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (frame.isKeyPressed(._1)) {
|
if (frame.isKeyPressed(._1)) {
|
||||||
self.player.gun = .pistol;
|
self.player.gun = .pistol;
|
||||||
} else if (frame.isKeyPressed(._2)) {
|
} else if (frame.isKeyPressed(._2)) {
|
||||||
@ -548,18 +553,32 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
frame.drawRectangle(.{
|
{
|
||||||
.rect = self.player.getRect(),
|
var sprite = Engine.Graphics.Sprite{
|
||||||
.color = rgb(255, 255, 255),
|
|
||||||
.sprite = .{
|
|
||||||
.texture = switch (self.player.gun) {
|
.texture = switch (self.player.gun) {
|
||||||
.pistol => self.assets.pistol_mask,
|
.pistol => self.assets.pistol_mask,
|
||||||
.bomb => self.assets.bomb_mask,
|
.bomb => self.assets.bomb_mask,
|
||||||
.laser => self.assets.laser_mask,
|
.laser => self.assets.laser_mask,
|
||||||
},
|
},
|
||||||
.uv = .unit
|
.uv = .unit
|
||||||
|
};
|
||||||
|
|
||||||
|
const sprite_size = sprite.getSize();
|
||||||
|
if (self.player.facing_left) {
|
||||||
|
sprite = sprite.flipHorizontal();
|
||||||
}
|
}
|
||||||
});
|
const pos = self.player.kinetic.pos;
|
||||||
|
frame.drawRectangle(.{
|
||||||
|
.rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y),
|
||||||
|
.color = rgb(255, 255, 255),
|
||||||
|
.sprite = sprite
|
||||||
|
});
|
||||||
|
|
||||||
|
frame.drawRectangle(.{
|
||||||
|
.rect = self.player.getRect(),
|
||||||
|
.color = rgba(255, 255, 255, 0.5),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
for (self.bullets.items) |*bullet| {
|
for (self.bullets.items) |*bullet| {
|
||||||
bullet.kinetic.vel = bullet.dir.multiplyScalar(bullet.speed);
|
bullet.kinetic.vel = bullet.dir.multiplyScalar(bullet.speed);
|
||||||
@ -576,9 +595,20 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const pos = bullet.kinetic.pos;
|
||||||
|
const sprite_size = Engine.Graphics.getTextureSize(self.assets.bullet);
|
||||||
|
frame.drawRectangle(.{
|
||||||
|
.rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y),
|
||||||
|
.color = rgb(255, 255, 255),
|
||||||
|
.sprite = .{
|
||||||
|
.texture = self.assets.bullet,
|
||||||
|
.uv = .unit
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
frame.drawRectangle(.{
|
frame.drawRectangle(.{
|
||||||
.rect = bullet_rect,
|
.rect = bullet_rect,
|
||||||
.color = rgb(200, 20, 255)
|
.color = rgba(200, 20, 255, 0.5)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -772,6 +802,7 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul
|
|||||||
if (to_target.length() > 1) {
|
if (to_target.length() > 1) {
|
||||||
const dir_to_target = to_target.normalized();
|
const dir_to_target = to_target.normalized();
|
||||||
enemy.kinetic.vel = dir_to_target.multiplyScalar(enemy.speed);
|
enemy.kinetic.vel = dir_to_target.multiplyScalar(enemy.speed);
|
||||||
|
enemy.facing_left = enemy.kinetic.vel.x < 0;
|
||||||
} else {
|
} else {
|
||||||
enemy.kinetic.vel = .zero;
|
enemy.kinetic.vel = .zero;
|
||||||
}
|
}
|
||||||
@ -796,17 +827,21 @@ pub fn tick(self: *CombatScreen, state: *State, frame: *Engine.Frame) !TickResul
|
|||||||
|
|
||||||
enemy.kinetic.update(dt, .{});
|
enemy.kinetic.update(dt, .{});
|
||||||
|
|
||||||
frame.drawRectangle(.{
|
|
||||||
.rect = enemy_rect,
|
|
||||||
.color = rgba(20, 20, 200, 0.2),
|
|
||||||
});
|
|
||||||
|
|
||||||
const pos = enemy.kinetic.pos;
|
const pos = enemy.kinetic.pos;
|
||||||
const sprite_size = enemy.sprite.getSize();
|
const sprite_size = enemy.sprite.getSize();
|
||||||
|
var sprite = enemy.sprite;
|
||||||
|
if (enemy.facing_left) {
|
||||||
|
sprite = sprite.flipHorizontal();
|
||||||
|
}
|
||||||
frame.drawRectangle(.{
|
frame.drawRectangle(.{
|
||||||
.rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y),
|
.rect = Rect.initCentered(pos.x, pos.y, sprite_size.x, sprite_size.y),
|
||||||
.color = rgb(255, 255, 255),
|
.color = rgb(255, 255, 255),
|
||||||
.sprite = enemy.sprite
|
.sprite = sprite
|
||||||
|
});
|
||||||
|
|
||||||
|
frame.drawRectangle(.{
|
||||||
|
.rect = enemy_rect,
|
||||||
|
.color = rgba(20, 20, 200, 0.2),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -92,6 +92,17 @@ pub const Sprite = struct {
|
|||||||
texture: TextureId,
|
texture: TextureId,
|
||||||
uv: Rect,
|
uv: Rect,
|
||||||
|
|
||||||
|
pub fn flipHorizontal(self: Sprite) Sprite {
|
||||||
|
var uv = self.uv;
|
||||||
|
uv.pos.x += uv.size.x;
|
||||||
|
uv.size.x *= -1;
|
||||||
|
|
||||||
|
return Sprite{
|
||||||
|
.texture = self.texture,
|
||||||
|
.uv = uv
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
pub fn getSize(self: Sprite) Vec2 {
|
pub fn getSize(self: Sprite) Vec2 {
|
||||||
const texture_info = getTextureInfo(self.texture);
|
const texture_info = getTextureInfo(self.texture);
|
||||||
const texture_size = Vec2.initFromInt(u32, texture_info.width, texture_info.height);
|
const texture_size = Vec2.initFromInt(u32, texture_info.width, texture_info.height);
|
||||||
@ -456,3 +467,8 @@ pub fn getTextureInfo(id: TextureId) TextureInfo {
|
|||||||
const texture = textures.items[@intFromEnum(id)];
|
const texture = textures.items[@intFromEnum(id)];
|
||||||
return texture.info;
|
return texture.info;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn getTextureSize(id: TextureId) Vec2 {
|
||||||
|
const texture_info = getTextureInfo(id);
|
||||||
|
return Vec2.initFromInt(u32, texture_info.width, texture_info.height);
|
||||||
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user