Cleanup, touchups, new death animation on hero.
This commit is contained in:
98
game.go
98
game.go
@@ -25,9 +25,12 @@ const (
|
||||
|
||||
var (
|
||||
tilesetImage *ebiten.Image
|
||||
altarImage *ebiten.Image
|
||||
|
||||
//go:embed grasstile.png
|
||||
tileset_img []byte
|
||||
//go:embed altar.png
|
||||
altar_img []byte
|
||||
)
|
||||
|
||||
type Game struct {
|
||||
@@ -64,6 +67,12 @@ func init() {
|
||||
log.Fatal(err)
|
||||
}
|
||||
tilesetImage = ebiten.NewImageFromImage(img)
|
||||
|
||||
img, _, err = image.Decode(bytes.NewReader(altar_img))
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
altarImage = ebiten.NewImageFromImage(img)
|
||||
}
|
||||
|
||||
func (g *Game) Initialize() {
|
||||
@@ -87,6 +96,7 @@ func (g *Game) Initialize() {
|
||||
g.score = 0
|
||||
g.reset = false
|
||||
|
||||
//clean up all targets
|
||||
for j := 0; j < len(g.targets); j++ {
|
||||
g.targets[j] = nil
|
||||
}
|
||||
@@ -97,6 +107,10 @@ func (g *Game) Initialize() {
|
||||
g.timer = 0
|
||||
g.runtime = 0.
|
||||
|
||||
g.projectiles = make(map[int]*Projectile)
|
||||
g.initialized = true
|
||||
g.reset = false
|
||||
|
||||
}
|
||||
|
||||
func (g *Game) Update() error {
|
||||
@@ -119,10 +133,6 @@ func (g *Game) Update() error {
|
||||
|
||||
if !g.initialized || g.reset {
|
||||
g.Initialize()
|
||||
|
||||
g.projectiles = make(map[int]*Projectile)
|
||||
g.initialized = true
|
||||
g.reset = false
|
||||
} else {
|
||||
g.StepGame()
|
||||
}
|
||||
@@ -221,8 +231,6 @@ func (g *Game) StepGame() {
|
||||
|
||||
if !g.Paused {
|
||||
|
||||
g.UpdateHeroPosition()
|
||||
|
||||
g.hero.Update()
|
||||
g.explosion.Update()
|
||||
|
||||
@@ -230,10 +238,11 @@ func (g *Game) StepGame() {
|
||||
g.UpdateProjectiles()
|
||||
|
||||
if !g.gameover {
|
||||
g.UpdateHeroPosition()
|
||||
//append new projectiles
|
||||
g.AppendProjectiles()
|
||||
//add new target with increasing frequency
|
||||
g.AddNewTargets()
|
||||
g.SpawnEnemies()
|
||||
//handle pulsewave updates
|
||||
g.HandlePulseWaveUpdate()
|
||||
}
|
||||
@@ -243,11 +252,29 @@ func (g *Game) StepGame() {
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) AddNewTargets() {
|
||||
func (g *Game) SpawnEnemies() {
|
||||
f := 40000 / (g.counter + 1)
|
||||
if g.counter%f == 0 {
|
||||
g.targets = append(g.targets, NewMover())
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: rand.Float64() * 640, Y: rand.Float64() * 480})
|
||||
|
||||
x0 := rand.Float64() * 640
|
||||
y0 := rand.Float64() * 480
|
||||
quadrant := rand.IntN(3)
|
||||
|
||||
switch quadrant {
|
||||
case 0:
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: x0, Y: -MOVER_HEIGHT})
|
||||
case 1:
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: x0, Y: screenHeight + MOVER_HEIGHT})
|
||||
case 2:
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: -MOVER_WIDTH, Y: y0})
|
||||
case 3:
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: screenWidth + x0, Y: y0})
|
||||
default:
|
||||
g.targets[len(g.targets)-1].SetOrigin(Coordinates{X: x0, Y: y0})
|
||||
fmt.Println("WTF " + string(quadrant))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,13 +358,14 @@ func (g *Game) UpdateTargets() {
|
||||
dy := g.hero.Pos.Y - target.Pos.Y
|
||||
angle := math.Atan2(dy, dx)
|
||||
|
||||
maxspeed := 3.
|
||||
//maxspeed := (float64(g.counter) + 1.) / 1000.
|
||||
maxspeed := 2.9
|
||||
target.Pos.X += maxspeed * math.Cos(angle)
|
||||
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 {
|
||||
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.hero.Action < MoverActionDying {
|
||||
g.heroCollisionMask.Clear()
|
||||
g.heroCollisionMask.DrawImage(g.hero.Sprite, nil)
|
||||
|
||||
@@ -352,8 +380,8 @@ func (g *Game) UpdateTargets() {
|
||||
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
|
||||
//fmt.Println("pixel death")
|
||||
g.hero.SetHit()
|
||||
g.gameover = true
|
||||
break
|
||||
}
|
||||
@@ -381,7 +409,7 @@ func (g *Game) AppendProjectiles() {
|
||||
func (g *Game) HandleInput() {
|
||||
if len(g.gamepadIDs) > 0 {
|
||||
if ebiten.IsGamepadButtonPressed(0, ebiten.GamepadButton11) {
|
||||
if !g.explosion.Active {
|
||||
if !g.explosion.Active && !g.gameover {
|
||||
g.explosion.SetOrigin(g.hero.Pos)
|
||||
g.explosion.Reset()
|
||||
g.explosion.ToggleActivate()
|
||||
@@ -397,18 +425,20 @@ func (g *Game) HandleInput() {
|
||||
}
|
||||
|
||||
//account for controller sensitivity
|
||||
xaxis := ebiten.StandardGamepadAxisValue(0, ebiten.StandardGamepadAxisRightStickHorizontal)
|
||||
yaxis := ebiten.StandardGamepadAxisValue(0, ebiten.StandardGamepadAxisRightStickVertical)
|
||||
if !g.gameover {
|
||||
xaxis := ebiten.StandardGamepadAxisValue(0, ebiten.StandardGamepadAxisRightStickHorizontal)
|
||||
yaxis := ebiten.StandardGamepadAxisValue(0, ebiten.StandardGamepadAxisRightStickVertical)
|
||||
|
||||
if yaxis <= 0.09 && yaxis >= -0.09 {
|
||||
yaxis = 0
|
||||
}
|
||||
if xaxis <= 0.09 && xaxis >= -0.09 {
|
||||
xaxis = 0
|
||||
}
|
||||
if yaxis <= 0.09 && yaxis >= -0.09 {
|
||||
yaxis = 0
|
||||
}
|
||||
if xaxis <= 0.09 && xaxis >= -0.09 {
|
||||
xaxis = 0
|
||||
}
|
||||
|
||||
inputangle := math.Atan2(yaxis, xaxis)
|
||||
g.hero.SetAngle(inputangle)
|
||||
inputangle := math.Atan2(yaxis, xaxis)
|
||||
g.hero.SetAngle(inputangle)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -427,18 +457,19 @@ func (g *Game) UpdateHeroPosition() {
|
||||
|
||||
func (g *Game) ConstructBackground() {
|
||||
g.background = ebiten.NewImage(screenWidth, screenHeight)
|
||||
BLOCK_SIZE := 32
|
||||
|
||||
for i := 0; i < 640/16; i++ {
|
||||
for j := 0; j < 480/16; j++ {
|
||||
|
||||
//select random tile in x and y from tileset
|
||||
idx_x := rand.IntN(256 / 16)
|
||||
idx_y := rand.IntN(256 / 16)
|
||||
idx_y := rand.IntN(256 / BLOCK_SIZE)
|
||||
idx_x := rand.IntN(256 / BLOCK_SIZE)
|
||||
|
||||
x0 := 16 * idx_x
|
||||
y0 := 16 * idx_y
|
||||
x1 := x0 + 16
|
||||
y1 := y0 + 16
|
||||
x0 := BLOCK_SIZE * idx_x
|
||||
y0 := BLOCK_SIZE * idx_y
|
||||
x1 := x0 + BLOCK_SIZE
|
||||
y1 := y0 + BLOCK_SIZE
|
||||
|
||||
//translate for grid element we're painting
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
@@ -446,4 +477,11 @@ func (g *Game) ConstructBackground() {
|
||||
g.background.DrawImage(tilesetImage.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), op)
|
||||
}
|
||||
}
|
||||
|
||||
ax := float64(rand.IntN(640/BLOCK_SIZE) * BLOCK_SIZE)
|
||||
ay := float64(rand.IntN(480/BLOCK_SIZE) * BLOCK_SIZE)
|
||||
|
||||
op := &ebiten.DrawImageOptions{}
|
||||
op.GeoM.Translate(ax, ay)
|
||||
g.background.DrawImage(altarImage, op)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user