diff options
Diffstat (limited to 'objects.go')
-rw-r--r-- | objects.go | 76 |
1 files changed, 57 insertions, 19 deletions
@@ -9,7 +9,7 @@ import ( ) const ( - SPRING_FORCE = 10 + SPRING_FORCE = 8 ) type Direction int @@ -34,14 +34,17 @@ type GameObject struct { friction float32 resistance float32 - image *ebiten.Image + images []*ebiten.Image onGround bool onCollideUp func(this, other *GameObject) bool onCollideDown func(this, other *GameObject) bool onCollideLeft func(this, other *GameObject) bool onCollideRight func(this, other *GameObject) bool Draw func (o * GameObject, screen *ebiten.Image, tilemap Tilemap) + UpdateFunc func (o * GameObject, tilemap Tilemap, others []*GameObject) movable bool + state int + delta int } @@ -49,7 +52,22 @@ type Player struct { GameObject } +func UpdateSpring(o * GameObject, tilemap Tilemap, others []*GameObject) { + if o.delta % 3 == 0 { + if o.state == 1 { + o.state = 0 + } else if o.state == 2 { + o.state = 1 + } + } +} + func (o * GameObject) Update(tilemap Tilemap, others []*GameObject) { + if o.UpdateFunc != nil { + o.UpdateFunc(o, tilemap, others) + } + o.delta += 1 + var direction Direction o.vy += gravity @@ -57,6 +75,7 @@ func (o * GameObject) Update(tilemap Tilemap, others []*GameObject) { o.vy *= o.resistance o.x += o.vx + if o.vx > 0 { direction = RIGHT @@ -98,8 +117,8 @@ func GetObjectAt(objects []*GameObject, x, y float32) *GameObject { } func (object * GameObject) CollidePoint(x, y float32) bool { - maxX := object.x + float32(object.image.Bounds().Dx()) - maxY := object.y + float32(object.image.Bounds().Dy()) + maxX := object.x + float32(object.images[0].Bounds().Dx()) + maxY := object.y + float32(object.images[0].Bounds().Dy()) minX := object.x minY := object.y return x >= minX && x < maxX && y >= minY && y < maxY @@ -149,21 +168,22 @@ func ShadowDraw(screen *ebiten.Image, image *ebiten.Image, x, y float32, alpha f } func DrawObject(o * GameObject, screen *ebiten.Image, tilemap Tilemap) { - ShadowDraw(screen, o.image, o.x, o.y, o.alpha) + image := o.images[o.state] + ShadowDraw(screen, image, o.x, o.y, o.alpha) if o.highlight { - vector.StrokeRect(screen, o.x, o.y, float32(o.image.Bounds().Dx()), float32(o.image.Bounds().Dy()), hightlightBorder, color.RGBA{255, 100, 100, 255}, false) + vector.StrokeRect(screen, o.x, o.y, float32(image.Bounds().Dx()), float32(image.Bounds().Dy()), hightlightBorder, color.RGBA{255, 100, 100, 255}, false) } } func (object * GameObject) Collide(other *GameObject) bool { - maxX1 := object.x + float32(object.image.Bounds().Dx()) - maxY1 := object.y + float32(object.image.Bounds().Dy()) + maxX1 := object.x + float32(object.images[0].Bounds().Dx()) + maxY1 := object.y + float32(object.images[0].Bounds().Dy()) minX1 := object.x minY1 := object.y - maxX2 := other.x + float32(other.image.Bounds().Dx()) - maxY2 := other.y + float32(other.image.Bounds().Dy()) + maxX2 := other.x + float32(other.images[0].Bounds().Dx()) + maxY2 := other.y + float32(other.images[0].Bounds().Dy()) minX2 := other.x minY2 := other.y @@ -189,8 +209,8 @@ func (object * GameObject) MoveRight() { func (object * GameObject) ToRect() image.Rectangle { - width := object.image.Bounds().Dx() - height := object.image.Bounds().Dy() + width := object.images[0].Bounds().Dx() + height := object.images[0].Bounds().Dy() x := int(object.x) y := int(object.y) return image.Rect(x, y, x+width, y+height) @@ -221,7 +241,9 @@ func NewPlayer(game *Game, x, y float32) *GameObject{ playerImage := ebiten.NewImageFromImage(characterImage) - player.image = playerImage.SubImage(image.Rect(4, 8, 27, 32)).(*ebiten.Image) + player.images = []*ebiten.Image{ + playerImage.SubImage(image.Rect(4, 8, 27, 32)).(*ebiten.Image), + } player.Draw = DrawObject player.movable = false @@ -231,7 +253,9 @@ func NewPlayer(game *Game, x, y float32) *GameObject{ func NewExit(game *Game, x, y float32) *GameObject{ exit := NewObject(game, x, y) - exit.image = tilesImage.SubImage(image.Rect(0, 16, 32, 48)).(*ebiten.Image) + exit.images = []*ebiten.Image{ + tilesImage.SubImage(image.Rect(0, 16, 32, 48)).(*ebiten.Image), + } exit.onCollideUp = OnCollideExit exit.onCollideDown = OnCollideExit exit.onCollideLeft = OnCollideExit @@ -244,7 +268,9 @@ func NewExit(game *Game, x, y float32) *GameObject{ func NewBox(game *Game, x, y float32) *GameObject{ box := NewObject(game, x, y) - box.image = tilesImage.SubImage(image.Rect(160, 0, 176, 16)).(*ebiten.Image) + box.images = []*ebiten.Image{ + tilesImage.SubImage(image.Rect(160, 0, 176, 16)).(*ebiten.Image), + } return box } @@ -252,8 +278,13 @@ func NewBox(game *Game, x, y float32) *GameObject{ func NewSpring(game *Game, x, y float32) *GameObject{ spring := NewObject(game, x, y) - spring.image = tilesImage.SubImage(image.Rect(176, 0, 192, 16)).(*ebiten.Image) + spring.images = []*ebiten.Image{ + tilesImage.SubImage(image.Rect(176, 0, 192, 16)).(*ebiten.Image), + tilesImage.SubImage(image.Rect(176, 16, 192, 32)).(*ebiten.Image), + tilesImage.SubImage(image.Rect(176, 32, 192, 48)).(*ebiten.Image), + } spring.onCollideUp = OnCollideSpring + spring.UpdateFunc = UpdateSpring return spring } @@ -262,7 +293,10 @@ func NewSpike(game *Game, x, y float32) *GameObject{ spike := NewObject(game, x, y) spike.offsetY = 3 - spike.image = tilesImage.SubImage(image.Rect(192, 3, 208, 16)).(*ebiten.Image) + spike.images = []*ebiten.Image{ + tilesImage.SubImage(image.Rect(192, 3, 208, 16)).(*ebiten.Image), + } + spike.onCollideUp = OnCollideSpike return spike @@ -272,7 +306,9 @@ func NewLeftSpike(game *Game, x, y float32) *GameObject{ spike := NewObject(game, x, y) spike.offsetX = 3 - spike.image = tilesImage.SubImage(image.Rect(195, 16, 208, 32)).(*ebiten.Image) + spike.images = []*ebiten.Image{ + tilesImage.SubImage(image.Rect(195, 16, 208, 32)).(*ebiten.Image), + } spike.onCollideRight = OnCollideSpike return spike @@ -293,8 +329,10 @@ func OnCollideExit(this, other *GameObject) bool { } func OnCollideSpring(this, other *GameObject) bool { - other.vy -= SPRING_FORCE + other.vy = -SPRING_FORCE other.onGround = true + this.state = 2 + this.delta = 1 return false } |