From 89349f466f8caf5a663799a685205c3c7cbba686 Mon Sep 17 00:00:00 2001 From: iegod Date: Wed, 6 Nov 2024 07:42:21 -0500 Subject: [PATCH] New hero sprite, timer and score added, death added, reset added. --- fonts/FFForward.ttf | Bin 0 -> 40760 bytes fonts/agencyb.ttf | Bin 0 -> 60656 bytes fonts/arcade_n.ttf | Bin 0 -> 26500 bytes fonts/fonts.go | 85 +++++++++++++++++++++++++ game.go | 147 ++++++++++++++++++++++++++++++++------------ go.mod | 7 ++- hero.go | 120 ++++++++++++++++++++++++++++++++++++ hero.png | Bin 0 -> 1150 bytes main.go | 2 +- 9 files changed, 319 insertions(+), 42 deletions(-) create mode 100644 fonts/FFForward.ttf create mode 100644 fonts/agencyb.ttf create mode 100644 fonts/arcade_n.ttf create mode 100644 fonts/fonts.go create mode 100644 hero.go create mode 100644 hero.png diff --git a/fonts/FFForward.ttf b/fonts/FFForward.ttf new file mode 100644 index 0000000000000000000000000000000000000000..250624a5f6e67751c8a4d1017fb961c8ba73fbae GIT binary patch literal 40760 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 0 && size > 0 && fnt != nil { + face, err = opentype.NewFace(fnt, &opentype.FaceOptions{ + Size: size, + DPI: dpi, + Hinting: font.HintingVertical, + }) + if err != nil { + log.Fatal(err) + } + } + return face +} + +func init() { + SurviveFont = FontStruct{} + + fnt := LoadFontFatal(fonts.MPlus1pRegular_ttf) + SurviveFont.Standard = GetFaceFatal(fnt, FontDPI, FontSizeStandard) + SurviveFont.Large = GetFaceFatal(fnt, FontDPI, FontSizeLarge) + + fnt2 := LoadFontFatal(agency_ttf) + SurviveFont.Glitch = GetFaceFatal(fnt2, FontDPI, FontSizeLarge) + SurviveFont.GlitchBig = GetFaceFatal(fnt2, FontDPI, FontSizeBig) + + fnt3 := LoadFontFatal(arcade_ttf) + SurviveFont.Arcade = GetFaceFatal(fnt3, FontDPI, FontSizeArcade) + SurviveFont.ArcadeLarge = GetFaceFatal(fnt3, FontDPI, FontSizeArcadeBig) + SurviveFont.ArcadeHuge = GetFaceFatal(fnt3, FontDPI, FontSizeArcadeHuge) +} diff --git a/game.go b/game.go index 872c1a8..3f70137 100644 --- a/game.go +++ b/game.go @@ -1,13 +1,16 @@ package main import ( + "fmt" "image/color" "log" "math" "math/rand/v2" + "mover/fonts" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" + "github.com/hajimehoshi/ebiten/v2/text" "github.com/hajimehoshi/ebiten/v2/vector" ) @@ -17,16 +20,22 @@ const ( ) type Game struct { - collisionMask *ebiten.Image - projectileMask *ebiten.Image + collisionMask *ebiten.Image + projectileMask *ebiten.Image + heroCollisionMask *ebiten.Image + heroCollisionCpy *ebiten.Image Pos Coordinates Paused bool initialized bool - mover *Mover + gameover bool + reset bool + runtime float64 + hero *Hero projectiles map[int]*Projectile explosion *Explosion + score int counter int timer int targets []*Mover @@ -41,15 +50,31 @@ func (g *Game) Initialize() { origin := Coordinates{X: 640 / 2, Y: 480 / 2} - g.mover = NewMover() - g.mover.SetOrigin(origin) - g.mover.ToggleRotate() + g.hero = NewHero() + g.hero.SetOrigin(origin) + g.hero.ToggleRotate() + + g.gameover = false g.collisionMask = ebiten.NewImage(screenWidth, screenHeight) g.projectileMask = ebiten.NewImage(screenWidth, screenHeight) + g.heroCollisionMask = ebiten.NewImage(MOVER_WIDTH, MOVER_HEIGHT) + g.heroCollisionCpy = ebiten.NewImage(MOVER_WIDTH, MOVER_HEIGHT) g.explosion = NewExplosion() g.explosion.SetOrigin(origin) + g.score = 0 + g.reset = false + + for j := 0; j < len(g.targets); j++ { + g.targets[j] = nil + } + g.targets = g.targets[:0] + + g.score = 0 + g.counter = 0 + g.timer = 0 + g.runtime = 0. } @@ -71,11 +96,12 @@ func (g *Game) Update() error { } } - if !g.initialized { + if !g.initialized || g.reset { g.Initialize() g.projectiles = make(map[int]*Projectile) g.initialized = true + g.reset = false } else { g.StepGame() } @@ -87,19 +113,29 @@ func (g *Game) Update() error { func (g *Game) Draw(screen *ebiten.Image) { - g.mover.Draw() + g.hero.Draw() op := &ebiten.DrawImageOptions{} - /* - dx := 40 * math.Cos(float64(g.counter)/16) - dy := 40 * math.Sin(float64(g.counter)/16) - a := float64(g.counter) / (math.Pi * 2) - */ + if !g.gameover { + g.runtime = float64(g.counter) / 60. + } + + s := fmt.Sprintf("%02.3f", g.runtime) + if !g.gameover { + text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White) + text.Draw(screen, fmt.Sprintf("SCORE: %d", g.score*10), fonts.SurviveFont.Arcade, 640/2+100, 25, color.White) + } else { + if (g.counter/30)%2 == 0 { + text.Draw(screen, "TIME: "+s, fonts.SurviveFont.Arcade, 640/2-250, 25, color.White) + text.Draw(screen, fmt.Sprintf("SCORE: %d", g.score*10), fonts.SurviveFont.Arcade, 640/2+100, 25, color.White) + } + } + op.GeoM.Translate(-MOVER_WIDTH/2, -MOVER_HEIGHT/2) - op.GeoM.Rotate(g.mover.Angle) - op.GeoM.Translate(g.mover.Pos.X, g.mover.Pos.Y) - screen.DrawImage(g.mover.Sprite, op) + op.GeoM.Rotate(g.hero.Angle) + op.GeoM.Translate(g.hero.Pos.X, g.hero.Pos.Y) + screen.DrawImage(g.hero.Sprite, op) for _, target := range g.targets { target.Draw() @@ -142,10 +178,13 @@ func (g *Game) CleanupTargets() { i++ } } + //then culling the last elements of the slice - /*if len(g.targets)-i > 0 { - fmt.Printf("Removing %d elements\n", len(g.targets)-i) - }*/ + if len(g.targets)-i > 0 { + // fmt.Printf("Removing %d elements\n", len(g.targets)-i) + g.score += len(g.targets) - i + } + for j := i; j < len(g.targets); j++ { g.targets[j] = nil } @@ -160,20 +199,20 @@ func (g *Game) StepGame() { g.UpdateHeroPosition() - g.mover.Update() + g.hero.Update() g.explosion.Update() g.UpdateTargets() g.UpdateProjectiles() - //append new projectiles - g.AppendProjectiles() - - //add new target with increasing frequency - g.AddNewTargets() - - //handle pulsewave updates - g.HandlePulseWaveUpdate() + if !g.gameover { + //append new projectiles + g.AppendProjectiles() + //add new target with increasing frequency + g.AddNewTargets() + //handle pulsewave updates + g.HandlePulseWaveUpdate() + } g.CleanupTargets() g.counter++ @@ -198,8 +237,8 @@ func (g *Game) HandlePulseWaveUpdate() { //check collisions for _, target := range g.targets { - dx := target.Pos.X - g.mover.Pos.X - dy := target.Pos.Y - g.mover.Pos.Y + dx := target.Pos.X - g.hero.Pos.X + dy := target.Pos.Y - g.hero.Pos.Y r := math.Sqrt(dx*dx + dy*dy) if r >= g.explosion.Radius-5 && r <= g.explosion.Radius+5 && target.Action <= MoverActionDamaged && !target.Touched { @@ -261,9 +300,9 @@ func (g *Game) UpdateProjectiles() { func (g *Game) UpdateTargets() { for _, target := range g.targets { - if !target.Hit { - dx := g.mover.Pos.X - target.Pos.X - dy := g.mover.Pos.Y - target.Pos.Y + if !target.Hit && g.hero.Action < MoverActionDying { + dx := g.hero.Pos.X - target.Pos.X + dy := g.hero.Pos.Y - target.Pos.Y angle := math.Atan2(dy, dx) maxspeed := 3. @@ -271,6 +310,30 @@ func (g *Game) UpdateTargets() { target.Pos.Y += maxspeed * math.Sin(angle) } + //compute collision with hero + if g.hero.Pos.X >= target.Pos.X-MOVER_WIDTH/2 && g.hero.Pos.X <= target.Pos.X+MOVER_WIDTH/2 && g.hero.Pos.Y >= target.Pos.Y-MOVER_HEIGHT/2 && g.hero.Pos.Y <= target.Pos.Y+MOVER_HEIGHT/2 && target.Action < MoverActionDying { + g.heroCollisionMask.Clear() + g.heroCollisionMask.DrawImage(g.hero.Sprite, nil) + + op := &ebiten.DrawImageOptions{} + op.GeoM.Reset() + op.Blend = ebiten.BlendSourceIn + op.GeoM.Translate((g.hero.Pos.X-target.Pos.X)-MOVER_WIDTH/2, (g.hero.Pos.Y-target.Pos.Y)-MOVER_HEIGHT/2) + g.heroCollisionMask.DrawImage(target.Sprite, op) + + //var pixels []byte = make([]byte, MOVER_WIDTH*MOVER_HEIGHT*4) + var pixels []byte = make([]byte, MOVER_HEIGHT*MOVER_HEIGHT*4) + g.heroCollisionMask.ReadPixels(pixels) + for i := 0; i < len(pixels); i = i + 4 { + if pixels[i+3] != 0 { + fmt.Println("pixel death") + g.hero.Action = MoverActionDying + g.gameover = true + break + } + } + } + target.Update() } } @@ -284,8 +347,8 @@ func (g *Game) ResetTargetTouches() { func (g *Game) AppendProjectiles() { if g.counter%14 == 0 && ebiten.IsGamepadButtonPressed(0, ebiten.GamepadButton7) { - g.projectiles[g.counter] = NewProjectile(Coordinates{X: g.mover.Pos.X, Y: g.mover.Pos.Y}, g.mover.Angle, 5.) - g.projectiles[g.counter+1] = NewProjectile(Coordinates{X: g.mover.Pos.X, Y: g.mover.Pos.Y}, g.mover.Angle+math.Pi, 5.) + g.projectiles[g.counter] = NewProjectile(Coordinates{X: g.hero.Pos.X, Y: g.hero.Pos.Y}, g.hero.Angle, 5.) + g.projectiles[g.counter+1] = NewProjectile(Coordinates{X: g.hero.Pos.X, Y: g.hero.Pos.Y}, g.hero.Angle+math.Pi, 5.) } } @@ -293,14 +356,18 @@ func (g *Game) HandleInput() { if len(g.gamepadIDs) > 0 { if ebiten.IsGamepadButtonPressed(0, ebiten.GamepadButton11) { if !g.explosion.Active { - g.explosion.SetOrigin(g.mover.Pos) + g.explosion.SetOrigin(g.hero.Pos) g.explosion.Reset() g.explosion.ToggleActivate() } } if inpututil.IsGamepadButtonJustPressed(0, ebiten.GamepadButton9) { - g.Paused = !g.Paused + if g.gameover { + g.reset = true + } else { + g.Paused = !g.Paused + } } //account for controller sensitivity @@ -315,7 +382,7 @@ func (g *Game) HandleInput() { } inputangle := math.Atan2(yaxis, xaxis) - g.mover.SetAngle(inputangle) + g.hero.SetAngle(inputangle) } } @@ -324,10 +391,10 @@ func (g *Game) UpdateHeroPosition() { inpx := ebiten.GamepadAxisValue(0, 0) inpy := ebiten.GamepadAxisValue(0, 1) if inpx >= 0.15 || inpx <= -0.15 { - g.mover.Pos.X += ebiten.GamepadAxisValue(0, 0) * 5 + g.hero.Pos.X += ebiten.GamepadAxisValue(0, 0) * 5 } if inpy >= 0.15 || inpy <= -0.15 { - g.mover.Pos.Y += ebiten.GamepadAxisValue(0, 1) * 5 + g.hero.Pos.Y += ebiten.GamepadAxisValue(0, 1) * 5 } } diff --git a/go.mod b/go.mod index 2bc8c1e..d86b8a5 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,11 @@ go 1.22.0 toolchain go1.22.8 -require github.com/hajimehoshi/ebiten/v2 v2.8.2 +require ( + github.com/hajimehoshi/ebiten v1.12.12 + github.com/hajimehoshi/ebiten/v2 v2.8.2 + golang.org/x/image v0.20.0 +) require ( github.com/ebitengine/gomobile v0.0.0-20240911145611-4856209ac325 // indirect @@ -13,4 +17,5 @@ require ( github.com/jezek/xgb v1.1.1 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.25.0 // indirect + golang.org/x/text v0.18.0 // indirect ) diff --git a/hero.go b/hero.go new file mode 100644 index 0000000..ae4f3e0 --- /dev/null +++ b/hero.go @@ -0,0 +1,120 @@ +package main + +import ( + "bytes" + "image" + "log" + + _ "embed" + "image/color" + _ "image/png" + + "github.com/hajimehoshi/ebiten/v2" +) + +var ( + heroImage *ebiten.Image + + //go:embed hero.png + hero_img []byte +) + +const ( + HeroActionDefault = iota + HeroActionDamaged + HeroActionDying + HeroActionExploding + HeroActionDead + HeroActionMax +) + +type HeroAction uint + +func init() { + img, _, err := image.Decode(bytes.NewReader(hero_img)) + if err != nil { + log.Fatal(err) + } + heroImage = ebiten.NewImageFromImage(img) +} + +type Hero struct { + Sprite *ebiten.Image + Maks *ebiten.Image + MaksDest *ebiten.Image + Angle float64 + Pos Coordinates + Origin Coordinates + Action HeroAction + cycles int + rotating bool + Toggled bool + Hit bool + Touched bool + dyingcount int +} + +func NewHero() *Hero { + m := &Hero{ + Sprite: ebiten.NewImage(48, 48), + Maks: ebiten.NewImage(48, 48), + MaksDest: ebiten.NewImage(48, 48), + Action: HeroActionDefault, + cycles: 4, + Angle: 0, + rotating: false, + Toggled: false, + dyingcount: 0, + } + + m.Maks.Fill(color.White) + return m +} + +func (m *Hero) ToggleRotate() { + m.rotating = !m.rotating +} + +func (m *Hero) SetAngle(a float64) { + m.Angle = a +} + +func (m *Hero) SetOrigin(coords Coordinates) { + m.Origin = coords + m.Pos = coords +} + +func (m *Hero) Draw() { + m.Sprite.Clear() + m.MaksDest.Clear() + + idx := (m.cycles / 8) % 4 + + y0 := 0 + y1 := 48 + x0 := 48 * idx + x1 := x0 + 48 + + switch m.Action { + case HeroActionDefault: + m.Sprite.DrawImage(heroImage.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), nil) + default: + } +} + +func (m *Hero) Update() { + m.cycles++ +} + +func (m *Hero) SetHit() { + m.Action++ // = (m.Action + 1) % HeroActionMax +} + +func (m *Hero) ToggleColor() { + //m.Toggled = !m.Toggled + if m.Action == HeroActionDefault { + m.Action = HeroActionDamaged + } else if m.Action == HeroActionDamaged { + m.Action = HeroActionDefault + } +} diff --git a/hero.png b/hero.png new file mode 100644 index 0000000000000000000000000000000000000000..a622d0db7abdee898d2d71bf166c6f1fa764faad GIT binary patch literal 1150 zcmV-^1cCdBP) zPiP!f9LGQFpHzsYLAs&Yz%Hbr{-J`xqJfGUPX#Y2_`kgs(TlzGTBSly9;Db)5b@Gf zP$3tQijbmINNdE1HEL*sUCA07DJ@lLqh&qJ{@i_&{WG((*%><>7lE4hiBCTV;N7W@0Vw@;$*DKK_Z0w6O-)8>hcbXjHIXww+z}iV`N!jL z-no$-0Q~svTm|6JvG<(gUf%l*P;1AF)$${+?FZJkgODSe$^atObesW_62YA!|9Jh4 z^3q}jVB*z-EsrY<4>|kRw~2}}fJilw`v7rAa8%^q8!ThBP}jR_V5_&Gc>p2W z(>4PnJ%ZaI|9JiDaJ)Y}aU6i>UfKuL<|*>ka@$}1XtKT<*=OC1Wye{c=EBT$sL?EC z0Fi3Ki~=Pxf{QchV961cYfkTHI)_ecW*8wO# zu`AGZtR4M>!x?~u`L6@jQw9*JCU6EwY6Q1K{_*-hzh?q~*)wM=u-^N?)7~i8<=;yH z9G~;LrQ^Q&iCtrl0Pxl9S!ds#X&SqCM+RW_=S4v80|*g_wizJl5iI{?``bLmLpvV; zVE)`frIq*YzCHj>uC29fhk5&tr}{Uo3?M`Rg7g7^4j6Ua*$K%|<$W4%d@;GoDqUVo$R*`^BA zGL%0v`Mu58_-SPYSfA-^)r+9>7|H-5)dYSPsCG~2KAmWhSL`r?{pZ=JcT?pbuYWsi zbjr{9wN-CprD1VolmSGl>DtP0{s<<{0fY!Z==(hD#b@&)0IZgloCx+mooH)P z{yO!R^Zg6Qyme~qp4G4jo|`=#RxJ?n_lV2iX!fRC1b?j!DnwX1?&(aC@^~ENOV&jY9sx&b!gr^$JbO!}^Cs89)djgb+dqA%qY@2yu(^A1d+GT%A7U Q0RR9107*qoM6N<$f|Q>&bN~PV literal 0 HcmV?d00001 diff --git a/main.go b/main.go index 72e262c..eac11e0 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ const ( ) func main() { - ver := "Mover Test v0.05" + ver := "survive v0.06" fmt.Println(ver)