From 26b2bee88c55a0f745099f1b2838d817bb712e09 Mon Sep 17 00:00:00 2001 From: Tim Sarbin Date: Sat, 26 Oct 2019 00:26:48 -0400 Subject: [PATCH] Fixed UI bugs. Added credits scene. --- Common/Sprite.go | 2 +- Engine.go | 2 +- Scenes/Credits.go | 54 ++++++++++++++++++++++++ Scenes/{SceneMainMenu.go => MainMenu.go} | 9 +++- Scenes/SceneProvider.go | 6 +++ Sound/AudioProvider.go | 5 +++ 6 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 Scenes/Credits.go rename Scenes/{SceneMainMenu.go => MainMenu.go} (90%) create mode 100644 Scenes/SceneProvider.go diff --git a/Common/Sprite.go b/Common/Sprite.go index b6789366..d57ad99c 100644 --- a/Common/Sprite.go +++ b/Common/Sprite.go @@ -112,7 +112,7 @@ func CreateSprite(data []byte, palette Palette) *Sprite { result.Frames[ix].Image, _ = ebiten.NewImage(int(result.Frames[ix].Width), int(result.Frames[ix].Height), ebiten.FilterNearest) newData := make([]byte, result.Frames[ix].Width*result.Frames[ix].Height*4) for ii := uint32(0); ii < result.Frames[ix].Width*result.Frames[ix].Height; ii++ { - if result.Frames[ix].ImageData[ii] == -1 { + if result.Frames[ix].ImageData[ii] < 1 { // TODO: Is this == -1 or < 1? continue } newData[ii*4] = palette.Colors[result.Frames[ix].ImageData[ii]].R diff --git a/Engine.go b/Engine.go index 2b388b9d..6230ee31 100644 --- a/Engine.go +++ b/Engine.go @@ -63,7 +63,7 @@ func CreateEngine() *Engine { result.LoadingSprite = result.LoadSprite(ResourcePaths.LoadingScreen, Palettes.Loading) loadingSpriteSizeX, loadingSpriteSizeY := result.LoadingSprite.GetSize() result.LoadingSprite.MoveTo(int(400-(loadingSpriteSizeX/2)), int(300+(loadingSpriteSizeY/2))) - result.SetNextScene(Scenes.CreateMainMenu(result, result.UIManager, result.SoundManager)) + result.SetNextScene(Scenes.CreateMainMenu(result, result, result.UIManager, result.SoundManager)) return result } diff --git a/Scenes/Credits.go b/Scenes/Credits.go new file mode 100644 index 00000000..b0bf647e --- /dev/null +++ b/Scenes/Credits.go @@ -0,0 +1,54 @@ +package Scenes + +import ( + "github.com/essial/OpenDiablo2/Common" + "github.com/essial/OpenDiablo2/Palettes" + "github.com/essial/OpenDiablo2/ResourcePaths" + "github.com/essial/OpenDiablo2/Sound" + "github.com/essial/OpenDiablo2/UI" + "github.com/hajimehoshi/ebiten" +) + +// Credits represents the credits scene +type Credits struct { + uiManager *UI.Manager + soundManager *Sound.Manager + fileProvider Common.FileProvider + sceneProvider SceneProvider + creditsBackground *Common.Sprite +} + +// CreateCredits creates an instance of the credits scene +func CreateCredits(fileProvider Common.FileProvider, sceneProvider SceneProvider, uiManager *UI.Manager, soundManager *Sound.Manager) *Credits { + result := &Credits{ + fileProvider: fileProvider, + uiManager: uiManager, + soundManager: soundManager, + sceneProvider: sceneProvider, + } + return result +} + +// Load is called to load the resources for the credits scene +func (v *Credits) Load() []func() { + return []func(){ + func() { + v.creditsBackground = v.fileProvider.LoadSprite(ResourcePaths.CreditsBackground, Palettes.Sky) + }, + } +} + +// Unload unloads the data for the credits scene +func (v *Credits) Unload() { + +} + +// Render renders the credits scene +func (v *Credits) Render(screen *ebiten.Image) { + v.creditsBackground.DrawSegments(screen, 4, 3, 0) +} + +// Update runs the update logic on the credits scene +func (v *Credits) Update() { + +} diff --git a/Scenes/SceneMainMenu.go b/Scenes/MainMenu.go similarity index 90% rename from Scenes/SceneMainMenu.go rename to Scenes/MainMenu.go index 100fdf9b..ea7bba69 100644 --- a/Scenes/SceneMainMenu.go +++ b/Scenes/MainMenu.go @@ -18,6 +18,7 @@ type MainMenu struct { uiManager *UI.Manager soundManager *Sound.Manager fileProvider Common.FileProvider + sceneProvider SceneProvider trademarkBackground *Common.Sprite background *Common.Sprite diabloLogoLeft *Common.Sprite @@ -33,11 +34,12 @@ type MainMenu struct { } // CreateMainMenu creates an instance of MainMenu -func CreateMainMenu(fileProvider Common.FileProvider, uiManager *UI.Manager, soundManager *Sound.Manager) *MainMenu { +func CreateMainMenu(fileProvider Common.FileProvider, sceneProvider SceneProvider, uiManager *UI.Manager, soundManager *Sound.Manager) *MainMenu { result := &MainMenu{ fileProvider: fileProvider, uiManager: uiManager, soundManager: soundManager, + sceneProvider: sceneProvider, showTrademarkScreen: true, } return result @@ -100,6 +102,7 @@ func (v *MainMenu) Load() []func() { v.creditsButton = UI.CreateButton(UI.ButtonTypeShort, v.fileProvider, "CREDITS") v.creditsButton.MoveTo(264, 505) v.creditsButton.SetVisible(false) + v.creditsButton.OnActivated(func() { v.onCreditsButtonClicked() }) v.uiManager.AddWidget(v.creditsButton) }, } @@ -109,6 +112,10 @@ func (v *MainMenu) onExitButtonClicked() { os.Exit(0) } +func (v *MainMenu) onCreditsButtonClicked() { + v.sceneProvider.SetNextScene(CreateCredits(v.fileProvider, v.sceneProvider, v.uiManager, v.soundManager)) +} + // Unload unloads the data for the main menu func (v *MainMenu) Unload() { diff --git a/Scenes/SceneProvider.go b/Scenes/SceneProvider.go new file mode 100644 index 00000000..19e12e1e --- /dev/null +++ b/Scenes/SceneProvider.go @@ -0,0 +1,6 @@ +package Scenes + +// SceneProvider provides the ability to change scenes +type SceneProvider interface { + SetNextScene(nextScene Scene) +} diff --git a/Sound/AudioProvider.go b/Sound/AudioProvider.go index 950a74fd..458d6ffb 100644 --- a/Sound/AudioProvider.go +++ b/Sound/AudioProvider.go @@ -13,6 +13,7 @@ type Manager struct { fileProvider Common.FileProvider audioContext *audio.Context // The Audio context bgmAudio *audio.Player // The audio player + lastBgm string } // CreateManager creates a sound provider @@ -30,6 +31,10 @@ func CreateManager(fileProvider Common.FileProvider) *Manager { // PlayBGM plays an infinitely looping background track func (v *Manager) PlayBGM(song string) { + if v.lastBgm == song { + return + } + v.lastBgm = song go func() { if v.bgmAudio != nil { v.bgmAudio.Close()