From 04d855a92ad17843801cd9762148d77fcd597262 Mon Sep 17 00:00:00 2001 From: Trevor Slocum Date: Sun, 26 Dec 2021 15:13:32 -0800 Subject: [PATCH] Add player weapon system --- asset/asset.go | 2 + asset/image/tileset/tileset.png | Bin 97026 -> 99073 bytes asset/map/m1.tmx | 406 ++++++++++----------------- component/bullet.go | 23 -- component/creep.go | 18 +- component/creepbullet.go | 23 ++ component/playerbullet.go | 23 ++ component/weapon.go | 7 +- entity/{bullet.go => creepbullet.go} | 4 +- entity/player.go | 6 +- entity/playerbullet.go | 30 ++ game/game.go | 1 + system/creep.go | 57 +++- system/input_fire.go | 57 ++++ system/input_move.go | 8 +- system/movement.go | 37 ++- world/world.go | 79 ++++-- 17 files changed, 453 insertions(+), 328 deletions(-) delete mode 100644 component/bullet.go create mode 100644 component/creepbullet.go create mode 100644 component/playerbullet.go rename entity/{bullet.go => creepbullet.go} (80%) create mode 100644 entity/playerbullet.go create mode 100644 system/input_fire.go diff --git a/asset/asset.go b/asset/asset.go index de54d60..d65b381 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -19,6 +19,7 @@ const sampleRate = 44100 var FS embed.FS var ImgWhiteSquare = ebiten.NewImage(8, 8) +var ImgBlackSquare = ebiten.NewImage(8, 8) var ( ImgBat = LoadImage("image/bat.png") @@ -35,6 +36,7 @@ var ( func init() { ImgWhiteSquare.Fill(color.White) + ImgBlackSquare.Fill(color.Black) } func LoadSounds(ctx *audio.Context) { diff --git a/asset/image/tileset/tileset.png b/asset/image/tileset/tileset.png index 85298750d1f31210b5203a8851c82a98745fcfc5..f4dbc9fe0b305d316831a69f922a55b2db43c508 100644 GIT binary patch delta 19839 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 diff --git a/asset/map/m1.tmx b/asset/map/m1.tmx index 7876ec3..d53db1c 100644 --- a/asset/map/m1.tmx +++ b/asset/map/m1.tmx @@ -1,130 +1,130 @@ - + -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50, -50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50 +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27, +27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27 @@ -160,12 +160,12 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2147483684,2147483683,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,2147483693,2147483692,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,35,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,44,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -33,33,33,33,2147483679,50,50,31,33,33,33,33,33,33,33,32,33,33,33,33, +33,33,33,33,2147483679,0,0,31,33,33,33,33,33,33,33,32,33,33,33,33, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -212,12 +212,12 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0, +0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, @@ -251,130 +251,27 @@ 0,61,62,63,5,3,0,0,0,0,0,0,0,0,0,13,14,16,1,28 - - -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,72,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,72,0,0,0,0,0,0,0,72,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,2147483720,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, -0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - - + + + + + + + + + + + + + + + + + + + + + @@ -417,7 +314,10 @@ - - + + + + + diff --git a/component/bullet.go b/component/bullet.go deleted file mode 100644 index 85ed839..0000000 --- a/component/bullet.go +++ /dev/null @@ -1,23 +0,0 @@ -package component - -import ( - . "code.rocketnine.space/tslocum/brownboxbatman/ecs" - "code.rocketnine.space/tslocum/gohan" -) - -type BulletComponent struct { -} - -var BulletComponentID = ECS.NewComponentID() - -func (p *BulletComponent) ComponentID() gohan.ComponentID { - return BulletComponentID -} - -func Bullet(ctx *gohan.Context) *BulletComponent { - c, ok := ctx.Component(BulletComponentID).(*BulletComponent) - if !ok { - return nil - } - return c -} diff --git a/component/creep.go b/component/creep.go index 6b83cd7..99be31d 100644 --- a/component/creep.go +++ b/component/creep.go @@ -8,13 +8,27 @@ import ( ) type CreepComponent struct { + Active bool + Health int FireAmount int FireRate int // In ticks - Ticks int // Ticks until next action - Rand *rand.Rand + FireTicks int //Ticks until next action + + Movement int + Movements [][3]float64 // X, Y, pre-delay in ticks + MovementTicks int // Ticks until next action + + DamageTicks int + + Rand *rand.Rand } +const ( + CreepSnowGunner = iota + 1 + CreepSnowmanHead +) + var CreepComponentID = ECS.NewComponentID() func (p *CreepComponent) ComponentID() gohan.ComponentID { diff --git a/component/creepbullet.go b/component/creepbullet.go new file mode 100644 index 0000000..4b39cf8 --- /dev/null +++ b/component/creepbullet.go @@ -0,0 +1,23 @@ +package component + +import ( + . "code.rocketnine.space/tslocum/brownboxbatman/ecs" + "code.rocketnine.space/tslocum/gohan" +) + +type CreepBulletComponent struct { +} + +var CreepBulletComponentID = ECS.NewComponentID() + +func (p *CreepBulletComponent) ComponentID() gohan.ComponentID { + return CreepBulletComponentID +} + +func CreepBullet(ctx *gohan.Context) *CreepBulletComponent { + c, ok := ctx.Component(CreepBulletComponentID).(*CreepBulletComponent) + if !ok { + return nil + } + return c +} diff --git a/component/playerbullet.go b/component/playerbullet.go new file mode 100644 index 0000000..5bcef66 --- /dev/null +++ b/component/playerbullet.go @@ -0,0 +1,23 @@ +package component + +import ( + . "code.rocketnine.space/tslocum/brownboxbatman/ecs" + "code.rocketnine.space/tslocum/gohan" +) + +type PlayerBulletComponent struct { +} + +var PlayerBulletComponentID = ECS.NewComponentID() + +func (p *PlayerBulletComponent) ComponentID() gohan.ComponentID { + return PlayerBulletComponentID +} + +func PlayerBullet(ctx *gohan.Context) *PlayerBulletComponent { + c, ok := ctx.Component(PlayerBulletComponentID).(*PlayerBulletComponent) + if !ok { + return nil + } + return c +} diff --git a/component/weapon.go b/component/weapon.go index 3727b62..ac89fea 100644 --- a/component/weapon.go +++ b/component/weapon.go @@ -1,8 +1,6 @@ package component import ( - "time" - . "code.rocketnine.space/tslocum/brownboxbatman/ecs" "code.rocketnine.space/tslocum/gohan" ) @@ -12,8 +10,9 @@ type WeaponComponent struct { Damage int - FireRate time.Duration - LastFire time.Time + // In ticks + FireRate int + NextFire int BulletSpeed float64 } diff --git a/entity/bullet.go b/entity/creepbullet.go similarity index 80% rename from entity/bullet.go rename to entity/creepbullet.go index 7c5f57f..a2df9ac 100644 --- a/entity/bullet.go +++ b/entity/creepbullet.go @@ -7,7 +7,7 @@ import ( "code.rocketnine.space/tslocum/gohan" ) -func NewBullet(x, y, xSpeed, ySpeed float64) gohan.Entity { +func NewCreepBullet(x, y, xSpeed, ySpeed float64) gohan.Entity { bullet := ECS.NewEntity() ECS.AddComponent(bullet, &component.PositionComponent{ @@ -24,7 +24,7 @@ func NewBullet(x, y, xSpeed, ySpeed float64) gohan.Entity { Image: asset.ImgWhiteSquare, }) - ECS.AddComponent(bullet, &component.BulletComponent{}) + ECS.AddComponent(bullet, &component.CreepBulletComponent{}) return bullet } diff --git a/entity/player.go b/entity/player.go index c23ebc2..00c49cf 100644 --- a/entity/player.go +++ b/entity/player.go @@ -1,8 +1,6 @@ package entity import ( - "time" - "code.rocketnine.space/tslocum/brownboxbatman/asset" "code.rocketnine.space/tslocum/brownboxbatman/component" . "code.rocketnine.space/tslocum/brownboxbatman/ecs" @@ -18,8 +16,8 @@ func NewPlayer() gohan.Entity { weapon := &component.WeaponComponent{ Damage: 1, - FireRate: 100 * time.Millisecond, - BulletSpeed: 15, + FireRate: 144 / 16, + BulletSpeed: 8, } ECS.AddComponent(player, weapon) diff --git a/entity/playerbullet.go b/entity/playerbullet.go new file mode 100644 index 0000000..7f30384 --- /dev/null +++ b/entity/playerbullet.go @@ -0,0 +1,30 @@ +package entity + +import ( + "code.rocketnine.space/tslocum/brownboxbatman/asset" + "code.rocketnine.space/tslocum/brownboxbatman/component" + . "code.rocketnine.space/tslocum/brownboxbatman/ecs" + "code.rocketnine.space/tslocum/gohan" +) + +func NewPlayerBullet(x, y, xSpeed, ySpeed float64) gohan.Entity { + bullet := ECS.NewEntity() + + ECS.AddComponent(bullet, &component.PositionComponent{ + X: x, + Y: y, + }) + + ECS.AddComponent(bullet, &component.VelocityComponent{ + X: xSpeed, + Y: ySpeed, + }) + + ECS.AddComponent(bullet, &component.SpriteComponent{ + Image: asset.ImgBlackSquare, + }) + + ECS.AddComponent(bullet, &component.PlayerBulletComponent{}) + + return bullet +} diff --git a/game/game.go b/game/game.go index 8ff4bc1..9fcff4e 100644 --- a/game/game.go +++ b/game/game.go @@ -163,6 +163,7 @@ func (g *game) addSystems() { g.movementSystem = system.NewMovementSystem() ecs.AddSystem(system.NewPlayerMoveSystem(g.player, g.movementSystem)) + ecs.AddSystem(system.NewplayerFireSystem()) ecs.AddSystem(g.movementSystem) diff --git a/system/creep.go b/system/creep.go index c947759..521a350 100644 --- a/system/creep.go +++ b/system/creep.go @@ -8,6 +8,7 @@ import ( "github.com/hajimehoshi/ebiten/v2" ) +// pause time, screen X, screen Y type CreepSystem struct { } @@ -37,33 +38,67 @@ func (s *CreepSystem) Update(ctx *gohan.Context) error { creep := component.Creep(ctx) position := component.Position(ctx) + if creep.Health <= 0 { + for i, e := range world.World.CreepEntities { + if e == ctx.Entity { + world.World.CreepRects = append(world.World.CreepRects[:i], world.World.CreepRects[i+1:]...) + world.World.CreepEntities = append(world.World.CreepEntities[:i], world.World.CreepEntities[i+1:]...) + ctx.RemoveEntity() + return nil + } + } + } + // Skip inactive creeps. sx, sy := world.LevelCoordinatesToScreen(position.X, position.Y) - if sx < 0 || sy < 0 || sx > 640 || sy > 480 { + inactive := sx < 0 || sy < 0 || sx > 640 || sy > 480 + if creep.Active != !inactive { + creep.Active = !inactive + } + if inactive { return nil } - randSpeed := func() float64 { - return 0.5 + creep.Rand.Float64()*0.5 + (0.5 - creep.Rand.Float64()) + l := len(creep.Movements) + if l > creep.Movement { + if creep.MovementTicks == 0 { + m := creep.Movements[creep.Movement] + position.X, position.Y = m[0], m[1] + creep.Movement++ + + creep.MovementTicks = int(m[2]) + } + creep.MovementTicks-- + } + + randVelocity := func() (float64, float64) { + for { + vx := creep.Rand.Float64()*0.5 + (0.5 - creep.Rand.Float64()) + vy := creep.Rand.Float64()*0.5 + (0.5 - creep.Rand.Float64()) + if vx > 0.5 || vx < -0.5 || vy > 0.5 || vy < -0.5 { + return vx, vy + } + } } - if creep.Ticks == 0 { + if creep.FireTicks == 0 { for i := 0; i < 8; i++ { - speedA := randSpeed() - speedB := randSpeed() + vx, vy := randVelocity() if creep.Rand.Intn(2) == 0 { - speedA *= -1 + vx *= -1 } if creep.Rand.Intn(2) == 0 { - speedB *= -1 + vy *= -1 } - entity.NewBullet(position.X, position.Y, speedA, speedB) + entity.NewCreepBullet(position.X, position.Y, vx, vy) } - creep.Ticks = creep.FireRate + creep.FireTicks = creep.FireRate } - creep.Ticks-- + // TODO update colorM based on damageticks + + creep.FireTicks-- return nil } diff --git a/system/input_fire.go b/system/input_fire.go new file mode 100644 index 0000000..1960b47 --- /dev/null +++ b/system/input_fire.go @@ -0,0 +1,57 @@ +package system + +import ( + "code.rocketnine.space/tslocum/brownboxbatman/component" + "code.rocketnine.space/tslocum/brownboxbatman/entity" + "code.rocketnine.space/tslocum/brownboxbatman/world" + "code.rocketnine.space/tslocum/gohan" + "github.com/hajimehoshi/ebiten/v2" +) + +const ( + fireSpeed = 1.5 +) + +type playerFireSystem struct { +} + +func NewplayerFireSystem() *playerFireSystem { + return &playerFireSystem{} +} + +func (_ *playerFireSystem) Needs() []gohan.ComponentID { + return []gohan.ComponentID{ + component.PositionComponentID, + component.VelocityComponentID, + component.WeaponComponentID, + component.SpriteComponentID, + } +} + +func (_ *playerFireSystem) Uses() []gohan.ComponentID { + return nil +} + +func (s *playerFireSystem) Update(ctx *gohan.Context) error { + if world.World.GameOver { + return nil + } + + position := component.Position(ctx) + weapon := component.Weapon(ctx) + if ebiten.IsKeyPressed(ebiten.KeyZ) || ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) { + if weapon.NextFire == 0 { + entity.NewPlayerBullet(position.X-8, position.Y-8, 0, -weapon.BulletSpeed) + entity.NewPlayerBullet(position.X+8, position.Y-8, 0, -weapon.BulletSpeed) + weapon.NextFire = weapon.FireRate + } + } + if weapon.NextFire > 0 { + weapon.NextFire-- + } + return nil +} + +func (s *playerFireSystem) Draw(_ *gohan.Context, _ *ebiten.Image) error { + return gohan.ErrSystemWithoutDraw +} diff --git a/system/input_move.go b/system/input_move.go index fde9496..49e2b97 100644 --- a/system/input_move.go +++ b/system/input_move.go @@ -75,10 +75,10 @@ func (s *playerMoveSystem) Update(ctx *gohan.Context) error { return nil }*/ - pressLeft := ebiten.IsKeyPressed(ebiten.KeyA) || ebiten.IsKeyPressed(ebiten.KeyLeft) - pressRight := ebiten.IsKeyPressed(ebiten.KeyD) || ebiten.IsKeyPressed(ebiten.KeyRight) - pressUp := ebiten.IsKeyPressed(ebiten.KeyW) || ebiten.IsKeyPressed(ebiten.KeyUp) - pressDown := ebiten.IsKeyPressed(ebiten.KeyS) || ebiten.IsKeyPressed(ebiten.KeyDown) + pressLeft := ebiten.IsKeyPressed(ebiten.KeyLeft) + pressRight := ebiten.IsKeyPressed(ebiten.KeyRight) + pressUp := ebiten.IsKeyPressed(ebiten.KeyUp) + pressDown := ebiten.IsKeyPressed(ebiten.KeyDown) if (pressLeft && !pressRight) || (pressRight && !pressLeft) { diff --git a/system/movement.go b/system/movement.go index 6c65276..4e17066 100644 --- a/system/movement.go +++ b/system/movement.go @@ -113,21 +113,48 @@ func (s *MovementSystem) Update(ctx *gohan.Context) error { } } - // Check bullet collision. + // Check creepBullet collision. if world.World.NoClip { return nil } - bullet := ECS.Component(ctx.Entity, component.BulletComponentID) bulletSize := 8.0 - if bullet != nil { - r := image.Rect(int(position.X), int(position.Y), int(position.X+bulletSize), int(position.Y+bulletSize)) + bulletRect := image.Rect(int(position.X), int(position.Y), int(position.X+bulletSize), int(position.Y+bulletSize)) + creepBullet := ECS.Component(ctx.Entity, component.CreepBulletComponentID) + playerBullet := ECS.Component(ctx.Entity, component.PlayerBulletComponentID) + + // Check hazard collisions. + if creepBullet != nil || playerBullet != nil { + for _, hazardRect := range world.World.HazardRects { + if bulletRect.Overlaps(hazardRect) { + ctx.RemoveEntity() + return nil + } + } + } + + if creepBullet != nil { playerRect := image.Rect(int(world.World.PlayerX), int(world.World.PlayerY), int(world.World.PlayerX+world.World.PlayerWidth), int(world.World.PlayerY+world.World.PlayerHeight)) - if playerRect.Overlaps(r) { + if bulletRect.Overlaps(playerRect) { world.World.SetGameOver(velocity.X, velocity.Y) return nil } + return nil + } + + if playerBullet != nil { + for i, creepRect := range world.World.CreepRects { + if bulletRect.Overlaps(creepRect) { + creep := ECS.Component(world.World.CreepEntities[i], component.CreepComponentID).(*component.CreepComponent) + if creep.Active { + creep.Health-- + creep.DamageTicks = 144 / 2 + ctx.RemoveEntity() + return nil + } + } + } } return nil diff --git a/world/world.go b/world/world.go index 0727c16..793b1d0 100644 --- a/world/world.go +++ b/world/world.go @@ -6,11 +6,10 @@ import ( "math/rand" "path/filepath" - "code.rocketnine.space/tslocum/brownboxbatman/entity" - "code.rocketnine.space/tslocum/brownboxbatman/asset" "code.rocketnine.space/tslocum/brownboxbatman/component" . "code.rocketnine.space/tslocum/brownboxbatman/ecs" + "code.rocketnine.space/tslocum/brownboxbatman/entity" "code.rocketnine.space/tslocum/gohan" "github.com/hajimehoshi/ebiten/v2" "github.com/lafriks/go-tiled" @@ -33,6 +32,7 @@ var World = &GameWorld{ CamMoving: true, PlayerWidth: 8, PlayerHeight: 32, + TileImages: make(map[uint32]*ebiten.Image), } type GameWorld struct { @@ -64,6 +64,8 @@ type GameWorld struct { Map *tiled.Map ObjectGroups []*tiled.ObjectGroup HazardRects []image.Rectangle + CreepRects []image.Rectangle + CreepEntities []gohan.Entity TriggerEntities []gohan.Entity TriggerRects []image.Rectangle TriggerNames []string @@ -71,6 +73,8 @@ type GameWorld struct { NativeResolution bool BrokenPieceA, BrokenPieceB gohan.Entity + + TileImages map[uint32]*ebiten.Image } func SetMessage(message string) { @@ -112,10 +116,9 @@ func LoadMap(filePath string) { // Load tiles. - tileCache := make(map[uint32]*ebiten.Image) for i := uint32(0); i < uint32(tileset.TileCount); i++ { rect := tileset.GetTileRect(i) - tileCache[i+tileset.FirstGID] = tilesetImg.SubImage(rect).(*ebiten.Image) + World.TileImages[i+tileset.FirstGID] = tilesetImg.SubImage(rect).(*ebiten.Image) } createTileEntity := func(t *tiled.LayerTile, x int, y int) gohan.Entity { @@ -128,7 +131,7 @@ func LoadMap(filePath string) { }) sprite := &component.SpriteComponent{ - Image: tileCache[t.Tileset.FirstGID+t.ID], + Image: World.TileImages[t.Tileset.FirstGID+t.ID], HorizontalFlip: t.HorizontalFlip, VerticalFlip: t.VerticalFlip, DiagonalFlip: t.DiagonalFlip, @@ -147,21 +150,11 @@ func LoadMap(filePath string) { continue // No tile at this position. } - tileImg := tileCache[t.Tileset.FirstGID+t.ID] + tileImg := World.TileImages[t.Tileset.FirstGID+t.ID] if tileImg == nil { continue } - - e := createTileEntity(t, x, y) - if layer.Name == "CREEPS" { - creep := &component.CreepComponent{ - Health: 1, - FireAmount: 8, - FireRate: 144 / 4, - Rand: rand.New(rand.NewSource(int64(t.ID))), - } - ECS.AddComponent(e, creep) - } + createTileEntity(t, x, y) } } } @@ -197,7 +190,7 @@ func LoadMap(filePath string) { Y: obj.Y - 32, }) ECS.AddComponent(mapTile, &component.SpriteComponent{ - Image: tileCache[obj.GID], + Image: World.TileImages[obj.GID], }) World.TriggerNames = append(World.TriggerNames, obj.Name) @@ -208,6 +201,12 @@ func LoadMap(filePath string) { for _, obj := range grp.Objects { World.HazardRects = append(World.HazardRects, ObjectToRect(obj)) } + } else if grp.Name == "CREEPS" { + for _, obj := range grp.Objects { + c := NewCreep(component.CreepSnowGunner, int64(obj.ID), float64(obj.X), float64(obj.Y)) + World.CreepRects = append(World.CreepRects, ObjectToRect(obj)) + World.CreepEntities = append(World.CreepEntities, c) + } } } } @@ -271,15 +270,55 @@ func (w *GameWorld) SetGameOver(vx, vy float64) { ySpeedB = 1.5 } - w.BrokenPieceA = entity.NewBullet(position.X, position.Y, xSpeedA, ySpeedA) + w.BrokenPieceA = entity.NewCreepBullet(position.X, position.Y, xSpeedA, ySpeedA) pieceASprite := &component.SpriteComponent{ Image: asset.ImgBatBroken1, } ECS.AddComponent(w.BrokenPieceA, pieceASprite) - w.BrokenPieceB = entity.NewBullet(position.X, position.Y, xSpeedB, ySpeedB) + w.BrokenPieceB = entity.NewCreepBullet(position.X, position.Y, xSpeedB, ySpeedB) pieceBSprite := &component.SpriteComponent{ Image: asset.ImgBatBroken2, } ECS.AddComponent(w.BrokenPieceB, pieceBSprite) } + +// TODO move +func NewCreep(creepType int, creepID int64, x float64, y float64) gohan.Entity { + creep := ECS.NewEntity() + + ECS.AddComponent(creep, &component.PositionComponent{ + X: x, + Y: y, + }) + + if creepType == component.CreepSnowmanHead { + ECS.AddComponent(creep, &component.VelocityComponent{}) + + ECS.AddComponent(creep, &component.CreepComponent{ + Health: 128, + FireAmount: 1, + FireRate: 144 * 1.5, + Rand: rand.New(rand.NewSource(creepID)), + }) + } else { + ECS.AddComponent(creep, &component.CreepComponent{ + Health: 64, + FireAmount: 8, + FireRate: 144 / 4, + Rand: rand.New(rand.NewSource(creepID)), + }) + } + + img := asset.ImgBat + if creepType == component.CreepSnowmanHead { + img = World.TileImages[8] + } else if creepType == component.CreepSnowGunner { + img = World.TileImages[50] + } + ECS.AddComponent(creep, &component.SpriteComponent{ + Image: img, + }) + + return creep +}