- fixed obstacle collision and death on obstacle spike - moved player move into separate loop after other collision checks are done - fixed level setup, generation and selection - added test levels for obstacles
		
			
				
	
	
		
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package game
 | |
| 
 | |
| import (
 | |
| 	"log/slog"
 | |
| 	"openquell/assets"
 | |
| 
 | |
| 	"github.com/hajimehoshi/ebiten/v2"
 | |
| )
 | |
| 
 | |
| type LevelScene struct {
 | |
| 	Game         *Game
 | |
| 	CurrentLevel int
 | |
| 	Levels       []*Level
 | |
| 	Next         SceneName
 | |
| 	Whoami       SceneName
 | |
| 	UseCache     bool
 | |
| }
 | |
| 
 | |
| // Implements the actual playing Scene
 | |
| func NewLevelScene(game *Game, startlevel int) Scene {
 | |
| 	scene := &LevelScene{Whoami: Play, Next: Play, Game: game}
 | |
| 
 | |
| 	scene.GenerateLevels(game)
 | |
| 	scene.SetLevel(startlevel)
 | |
| 
 | |
| 	return scene
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) GenerateLevels(game *Game) {
 | |
| 	for _, level := range assets.Levels {
 | |
| 		scene.Levels = append(scene.Levels, NewLevel(game, 32, &level))
 | |
| 	}
 | |
| 
 | |
| 	scene.Game.Levels = scene.Levels
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) SetLevel(level int) {
 | |
| 	scene.CurrentLevel = level
 | |
| 	scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game)
 | |
| }
 | |
| 
 | |
| // Interface methods
 | |
| func (scene *LevelScene) SetNext(next SceneName) {
 | |
| 	scene.Next = next
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) GetNext() SceneName {
 | |
| 	// FIXME: set to winner or options screen
 | |
| 	return scene.Next
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) ResetNext() {
 | |
| 	scene.Next = scene.Whoami
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) Clearscreen() bool {
 | |
| 	return false
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) Update() error {
 | |
| 	scene.Levels[scene.CurrentLevel].Update()
 | |
| 
 | |
| 	switch {
 | |
| 	case ebiten.IsKeyPressed(ebiten.KeyEscape):
 | |
| 		scene.SetNext(Popup)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (scene *LevelScene) Draw(screen *ebiten.Image) {
 | |
| 	if scene.CurrentLevel != scene.Game.Observer.CurrentLevel {
 | |
| 		slog.Debug("level", "current", scene.CurrentLevel, "next", scene.Game.Observer.CurrentLevel)
 | |
| 		scene.CurrentLevel = scene.Game.Observer.CurrentLevel
 | |
| 		scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game)
 | |
| 	}
 | |
| 	screen.Clear()
 | |
| 	scene.Levels[scene.CurrentLevel].Draw(screen)
 | |
| }
 |