doodle/play_scene.go

148 lines
2.8 KiB
Go
Raw Normal View History

2018-06-21 02:00:46 +00:00
package doodle
import (
"git.kirsle.net/apps/doodle/doodads"
2018-06-21 02:00:46 +00:00
"git.kirsle.net/apps/doodle/events"
"git.kirsle.net/apps/doodle/level"
"git.kirsle.net/apps/doodle/render"
2018-06-21 02:00:46 +00:00
)
// PlayScene manages the "Edit Level" game mode.
type PlayScene struct {
// Configuration attributes.
Filename string
Canvas render.Grid
// Private variables.
canvas render.Grid
2018-06-21 02:00:46 +00:00
// Canvas size
width int32
height int32
// Player character
player doodads.Doodad
2018-06-21 02:00:46 +00:00
}
// Name of the scene.
func (s *PlayScene) Name() string {
return "Play"
}
// Setup the play scene.
func (s *PlayScene) Setup(d *Doodle) error {
// Given a filename or map data to play?
if s.Canvas != nil {
log.Debug("PlayScene.Setup: loading map from given canvas")
s.canvas = s.Canvas
} else if s.Filename != "" {
log.Debug("PlayScene.Setup: loading map from file %s", s.Filename)
s.LoadLevel(s.Filename)
s.Filename = ""
}
s.player = doodads.NewPlayer()
2018-06-21 02:00:46 +00:00
if s.canvas == nil {
log.Debug("PlayScene.Setup: no grid given, initializing empty grid")
s.canvas = render.Grid{}
2018-06-21 02:00:46 +00:00
}
2018-06-21 02:00:46 +00:00
s.width = d.width // TODO: canvas width = copy the window size
s.height = d.height
d.Flash("Entered Play Mode. Press 'E' to edit this map.")
2018-06-21 02:00:46 +00:00
return nil
}
// Loop the editor scene.
func (s *PlayScene) Loop(d *Doodle, ev *events.State) error {
// Switching to Edit Mode?
if ev.KeyName.Read() == "e" {
log.Info("Edit Mode, Go!")
d.Goto(&EditorScene{
Canvas: s.canvas,
})
return nil
}
s.movePlayer(ev)
return nil
2018-06-21 02:00:46 +00:00
}
// Draw the pixels on this frame.
func (s *PlayScene) Draw(d *Doodle) error {
// Clear the canvas and fill it with white.
d.Engine.Clear(render.White)
2018-06-21 02:00:46 +00:00
s.canvas.Draw(d.Engine)
2018-06-21 02:00:46 +00:00
// Draw our hero.
s.player.Draw(d.Engine)
2018-06-21 02:00:46 +00:00
return nil
}
// movePlayer updates the player's X,Y coordinate based on key pressed.
func (s *PlayScene) movePlayer(ev *events.State) {
delta := s.player.Position()
var playerSpeed int32 = 8
var gravity int32 = 2
2018-06-21 02:00:46 +00:00
if ev.Down.Now {
delta.Y += playerSpeed
2018-06-21 02:00:46 +00:00
}
if ev.Left.Now {
delta.X -= playerSpeed
2018-06-21 02:00:46 +00:00
}
if ev.Right.Now {
delta.X += playerSpeed
2018-06-21 02:00:46 +00:00
}
if ev.Up.Now {
delta.Y -= playerSpeed
}
// Apply gravity.
delta.Y += gravity
// Draw a ray and check for collision.
var lastOk = s.player.Position()
for point := range render.IterLine2(s.player.Position(), delta) {
s.player.MoveTo(point)
if _, ok := doodads.CollidesWithGrid(s.player, &s.canvas); ok {
s.player.MoveTo(lastOk)
} else {
lastOk = s.player.Position()
}
2018-06-21 02:00:46 +00:00
}
s.player.MoveTo(lastOk)
2018-06-21 02:00:46 +00:00
}
// LoadLevel loads a level from disk.
func (s *PlayScene) LoadLevel(filename string) error {
s.canvas = render.Grid{}
2018-06-21 02:00:46 +00:00
m, err := level.LoadJSON(filename)
if err != nil {
return err
}
for _, point := range m.Pixels {
pixel := level.Pixel{
X: point.X,
Y: point.Y,
2018-06-21 02:00:46 +00:00
}
s.canvas[pixel] = nil
2018-06-21 02:00:46 +00:00
}
return nil
}
// Destroy the scene.
func (s *PlayScene) Destroy() error {
return nil
}