diff --git a/animationMario.go b/animationMario.go index 2b574a3..588b931 100644 --- a/animationMario.go +++ b/animationMario.go @@ -6,6 +6,8 @@ import ( "log" "os" + "math" + "github.com/disintegration/imaging" ) @@ -14,6 +16,9 @@ type Mario struct { dir image.Point images map[string]image.Image updown string + a float64 + b float64 + angle float64 } func loadMario(file string) image.Image { @@ -53,20 +58,36 @@ func (a *Animation) animateMario() { // what mario does every frame func (a *Animation) updateMarioPosition() { - a.mario.position.X += 1 * a.mario.dir.X - a.mario.position.Y += 1 * a.mario.dir.Y + // Ellipse parameters (centered on canvas) + centerX := a.ctx.Width() / 2 + centerY := a.ctx.Height() / 2 + + // Calculate new position using parametric ellipse equations + t := a.mario.angle + marioX := centerX + a.mario.a*math.Cos(t) + marioY := centerY + a.mario.b*math.Sin(t) - if a.mario.position.Y+a.height > a.ctx.Height() { - a.mario.dir.Y = -1 - a.mario.updown = "marioUp" - } else if a.mario.position.Y-a.height < 0 { - a.mario.updown = "marioDown" - a.mario.dir.Y = 1 + // Update angle to move along the ellipse + a.mario.angle += 0.1 // Adjust speed as needed + if a.mario.angle >= 2*math.Pi { + a.mario.angle -= 2 * math.Pi } - if a.mario.position.X+a.width > a.ctx.Width() { - a.mario.dir.X = -1 - } else if a.mario.position.X-a.width < 0 { - a.mario.dir.X = 1 + // Determine horizontal direction (left/right) for image flipping + if math.Sin(t) > 0 { + a.mario.dir.X = -1 // Moving left + } else { + a.mario.dir.X = 1 // Moving right } + + // Determine vertical direction (up/down) for image selection + if math.Cos(t) > 0 { + a.mario.updown = "marioUp" // Moving downward + } else { + a.mario.updown = "marioDown" // Moving upward + } + + // Update Mario's position + a.mario.position.X = marioX + a.mario.position.Y = marioY }