More optimizations
This commit is contained in:
@@ -34,6 +34,7 @@ type GameplayScreen struct {
|
||||
world *world.World
|
||||
projectiles *projectile.Manager
|
||||
portals *portal.Manager
|
||||
mapManager *maps.Manager
|
||||
bounds hero.Bounds
|
||||
lastTick time.Time
|
||||
gameStartTime time.Time
|
||||
@@ -47,22 +48,19 @@ type GameplayScreen struct {
|
||||
showSaveNotification bool
|
||||
|
||||
portalVisibility *bool
|
||||
|
||||
currentMap *maps.Map
|
||||
allMaps map[string]*maps.Map
|
||||
}
|
||||
|
||||
func NewGameplayScreen(screenWidth, screenHeight int, fpsEnabled *bool, portalVisibility *bool) *GameplayScreen {
|
||||
func NewGameplayScreen(screenWidth, screenHeight int, mapManager *maps.Manager, fpsEnabled *bool, portalVisibility *bool) *GameplayScreen {
|
||||
cfg := config.Default()
|
||||
plains, desert := maps.CreateDefaultMaps(float64(screenWidth), float64(screenHeight))
|
||||
|
||||
allMaps := make(map[string]*maps.Map)
|
||||
allMaps["plains"] = plains
|
||||
allMaps["desert"] = desert
|
||||
|
||||
// Ensure we have a current map
|
||||
if mapManager.CurrentMap() == nil {
|
||||
// Fallback or error later
|
||||
}
|
||||
currentMap := mapManager.CurrentMap()
|
||||
|
||||
portalMgr := portal.NewManager()
|
||||
|
||||
for _, p := range plains.Portals {
|
||||
for _, p := range currentMap.Portals {
|
||||
portalMgr.AddPortal(p)
|
||||
}
|
||||
|
||||
@@ -87,11 +85,12 @@ func NewGameplayScreen(screenWidth, screenHeight int, fpsEnabled *bool, portalVi
|
||||
X: cfg.HUD.X,
|
||||
Y: cfg.HUD.Y,
|
||||
Color: color.White,
|
||||
ScreenName: "Plains",
|
||||
ScreenName: currentMap.DisplayName,
|
||||
},
|
||||
world: plains.World,
|
||||
world: currentMap.World,
|
||||
projectiles: projectile.NewManager(),
|
||||
portals: portalMgr,
|
||||
mapManager: mapManager,
|
||||
bounds: hero.Bounds{
|
||||
Width: float64(screenWidth),
|
||||
Height: float64(screenHeight),
|
||||
@@ -101,8 +100,6 @@ func NewGameplayScreen(screenWidth, screenHeight int, fpsEnabled *bool, portalVi
|
||||
gameStartTime: time.Now(),
|
||||
fpsEnabled: fpsEnabled,
|
||||
portalVisibility: portalVisibility,
|
||||
currentMap: plains,
|
||||
allMaps: allMaps,
|
||||
}
|
||||
|
||||
gs.portals.OnTransition = gs.handlePortalTransition
|
||||
@@ -166,13 +163,13 @@ func (g *GameplayScreen) checkPortalCollision() {
|
||||
}
|
||||
|
||||
func (g *GameplayScreen) handlePortalTransition(event portal.TransitionEvent) {
|
||||
destMap, exists := g.allMaps[event.DestinationMap]
|
||||
if !exists {
|
||||
destMap, destPortal := g.mapManager.ResolveTransition(event)
|
||||
if destMap == nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Switch to destination map
|
||||
g.currentMap = destMap
|
||||
g.mapManager.SetCurrentMap(destMap.ID)
|
||||
g.world = destMap.World
|
||||
|
||||
// Clear and reload portals for new map
|
||||
@@ -190,7 +187,6 @@ func (g *GameplayScreen) handlePortalTransition(event portal.TransitionEvent) {
|
||||
}
|
||||
|
||||
// Find destination portal and position hero
|
||||
destPortal := destMap.GetPortalByID(event.DestinationPortal)
|
||||
if destPortal != nil {
|
||||
// Position hero based on which side they're entering from
|
||||
switch destPortal.Side {
|
||||
@@ -229,21 +225,18 @@ func (g *GameplayScreen) trackFPS(delta time.Duration) {
|
||||
// Rendering
|
||||
func (g *GameplayScreen) Draw(screen *ebiten.Image) {
|
||||
cfg := config.Default()
|
||||
bgColor := cfg.Visual.BackgroundColor
|
||||
if g.currentMap != nil {
|
||||
bgColor = g.currentMap.BackgroundColor
|
||||
|
||||
currentMap := g.mapManager.CurrentMap()
|
||||
if currentMap != nil {
|
||||
currentMap.Draw(screen)
|
||||
g.hud.ScreenName = currentMap.DisplayName
|
||||
} else {
|
||||
screen.Fill(cfg.Visual.BackgroundColor)
|
||||
}
|
||||
screen.Fill(bgColor)
|
||||
|
||||
g.world.Draw(screen)
|
||||
g.portals.Draw(screen)
|
||||
g.projectiles.Draw(screen)
|
||||
g.hero.Draw(screen)
|
||||
|
||||
if g.currentMap != nil {
|
||||
g.hud.ScreenName = g.currentMap.DisplayName
|
||||
}
|
||||
|
||||
staminaColor := cfg.Visual.StaminaNormalColor
|
||||
if g.hero.Stamina < g.hero.MaxStamina*config.StaminaLowThreshold {
|
||||
staminaColor = cfg.Visual.StaminaLowColor
|
||||
@@ -326,11 +319,9 @@ func (g *GameplayScreen) Reset() {
|
||||
screenWidth := int(g.bounds.Width)
|
||||
screenHeight := int(g.bounds.Height)
|
||||
|
||||
plains, desert := maps.CreateDefaultMaps(float64(screenWidth), float64(screenHeight))
|
||||
g.allMaps = make(map[string]*maps.Map)
|
||||
g.allMaps["plains"] = plains
|
||||
g.allMaps["desert"] = desert
|
||||
g.currentMap = plains
|
||||
g.mapManager.Reset()
|
||||
g.mapManager.SetCurrentMap("plains")
|
||||
currentMap := g.mapManager.CurrentMap()
|
||||
|
||||
g.hero = hero.New(hero.Config{
|
||||
StartX: cfg.Hero.StartX,
|
||||
@@ -342,10 +333,10 @@ func (g *GameplayScreen) Reset() {
|
||||
StaminaDrain: cfg.Hero.StaminaDrain,
|
||||
StaminaRegen: cfg.Hero.StaminaRegen,
|
||||
})
|
||||
g.world = plains.World
|
||||
g.world = currentMap.World
|
||||
g.projectiles = projectile.NewManager()
|
||||
g.portals = portal.NewManager()
|
||||
for _, p := range plains.Portals {
|
||||
for _, p := range currentMap.Portals {
|
||||
g.portals.AddPortal(p)
|
||||
}
|
||||
g.portals.OnTransition = g.handlePortalTransition
|
||||
@@ -372,9 +363,9 @@ func (g *GameplayScreen) Reset() {
|
||||
}
|
||||
|
||||
func (g *GameplayScreen) SaveState() *save.GameState {
|
||||
currentMapID := "map1"
|
||||
if g.currentMap != nil {
|
||||
currentMapID = g.currentMap.ID
|
||||
currentMapID := "plains"
|
||||
if g.mapManager.CurrentMap() != nil {
|
||||
currentMapID = g.mapManager.CurrentMap().ID
|
||||
}
|
||||
return &save.GameState{
|
||||
CurrentMap: currentMapID,
|
||||
@@ -390,17 +381,18 @@ func (g *GameplayScreen) LoadState(state *save.GameState) {
|
||||
screenWidth := int(g.bounds.Width)
|
||||
screenHeight := int(g.bounds.Height)
|
||||
|
||||
plains, desert := maps.CreateDefaultMaps(float64(screenWidth), float64(screenHeight))
|
||||
g.allMaps = make(map[string]*maps.Map)
|
||||
g.allMaps["plains"] = plains
|
||||
g.allMaps["desert"] = desert
|
||||
|
||||
// load the saved map or default to plains
|
||||
savedMap := g.allMaps[state.CurrentMap]
|
||||
if savedMap == nil {
|
||||
savedMap = plains
|
||||
g.mapManager.Reset()
|
||||
|
||||
mapID := state.CurrentMap
|
||||
if mapID == "" {
|
||||
mapID = "plains"
|
||||
}
|
||||
g.currentMap = savedMap
|
||||
|
||||
if err := g.mapManager.SetCurrentMap(mapID); err != nil {
|
||||
// Fallback to plains if map not found
|
||||
g.mapManager.SetCurrentMap("plains")
|
||||
}
|
||||
currentMap := g.mapManager.CurrentMap()
|
||||
|
||||
g.hero = hero.New(hero.Config{
|
||||
StartX: state.HeroX,
|
||||
@@ -413,10 +405,10 @@ func (g *GameplayScreen) LoadState(state *save.GameState) {
|
||||
StaminaRegen: cfg.Hero.StaminaRegen,
|
||||
})
|
||||
g.hero.Stamina = state.HeroStamina
|
||||
g.world = g.currentMap.World
|
||||
g.world = currentMap.World
|
||||
g.projectiles = projectile.NewManager()
|
||||
g.portals = portal.NewManager()
|
||||
for _, p := range g.currentMap.Portals {
|
||||
for _, p := range currentMap.Portals {
|
||||
g.portals.AddPortal(p)
|
||||
}
|
||||
g.portals.OnTransition = g.handlePortalTransition
|
||||
|
||||
Reference in New Issue
Block a user