mirror of
https://github.com/P3D-Legacy/P3D-Legacy.git
synced 2025-07-31 01:35:20 +02:00
Fixed crash that occurs when exiting to the main menu through the pause screen while the game window is minimized or not active in general.
286 lines
11 KiB
VB.net
286 lines
11 KiB
VB.net
Public Class PauseScreen
|
|
|
|
Inherits Screen
|
|
|
|
Dim mainIndex As Integer = 0
|
|
Dim quitIndex As Integer = 0
|
|
Dim mainTexture As Texture2D
|
|
Dim leftEscapeKey As Boolean = False
|
|
Dim menuIndex As Integer = 0
|
|
|
|
Dim canCreateAutosave As Boolean = True
|
|
|
|
Public Sub New(ByVal currentScreen As Screen)
|
|
Me.Identification = Identifications.PauseScreen
|
|
Me.CanBePaused = False
|
|
Me.MouseVisible = True
|
|
Me.CanChat = False
|
|
|
|
If Not currentScreen Is Nothing Then
|
|
Me.PreScreen = currentScreen
|
|
End If
|
|
|
|
Me.mainTexture = TextureManager.GetTexture("GUI\Menus\Menu")
|
|
|
|
If Core.Player.IsGameJoltSave = True Then
|
|
Me.canCreateAutosave = False
|
|
Else
|
|
If Me.PreScreen IsNot Nothing AndAlso Camera.Name IsNot Nothing Then
|
|
If Camera.Name <> "Overworld" Then
|
|
Me.canCreateAutosave = False
|
|
Else
|
|
Dim s As Screen = Me.PreScreen
|
|
While s.Identification <> Identifications.OverworldScreen And Not s.PreScreen Is Nothing
|
|
s = s.PreScreen
|
|
End While
|
|
If s.Identification = Identifications.OverworldScreen Then
|
|
If CType(s, OverworldScreen).ActionScript.IsReady = False Then
|
|
Me.canCreateAutosave = False
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
Public Overrides Sub Draw()
|
|
Me.PreScreen.Draw()
|
|
|
|
Canvas.DrawRectangle(New Rectangle(0, 0, Core.ScreenSize.Width, Core.ScreenSize.Height), New Color(0, 0, 0, 150))
|
|
Dim pX As Integer = CInt(Core.ScreenSize.Width / 2) - CInt(FontManager.InGameFont.MeasureString(Localization.GetString("pause_menu_title")).X / 2)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Localization.GetString("pause_menu_title"), New Vector2(pX - 7, CInt(Core.ScreenSize.Height / 6.8) + 3), Color.Black)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Localization.GetString("pause_menu_title"), New Vector2(pX - 10, CInt(Core.ScreenSize.Height / 6.8)), Color.White)
|
|
|
|
If Me.menuIndex = 0 Then
|
|
DrawMenu()
|
|
Else
|
|
DrawQuit()
|
|
End If
|
|
|
|
If Me.canCreateAutosave = False Then
|
|
Dim text As String = Localization.GetString("pause_menu_autosave_fail")
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, text, New Vector2(9, Core.ScreenSize.Height - FontManager.InGameFont.MeasureString(text).Y), Color.Black)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, text, New Vector2(5, Core.ScreenSize.Height - FontManager.InGameFont.MeasureString(text).Y - 4), Color.White)
|
|
End If
|
|
|
|
Dim d As New Dictionary(Of Buttons, String)
|
|
d.Add(Buttons.A, "Accept")
|
|
d.Add(Buttons.B, "Go back")
|
|
|
|
DrawGamePadControls(d)
|
|
End Sub
|
|
|
|
Public Overrides Sub Update()
|
|
If PreScreen.Identification = Identifications.OverworldScreen And JoinServerScreen.Online = True Then
|
|
Screen.Level.Update()
|
|
End If
|
|
|
|
Screen.TextBox.reDelay = 0.0F
|
|
|
|
If Core.GameInstance.IsActive = True Then
|
|
If Me.menuIndex = 0 Then
|
|
UpdateMain()
|
|
Else
|
|
UpdateQuit()
|
|
End If
|
|
End If
|
|
End Sub
|
|
|
|
#Region "MainMenu"
|
|
|
|
Private Sub DrawMenu()
|
|
For i = 0 To 1
|
|
Dim Text As String = ""
|
|
Select Case i
|
|
Case 0
|
|
Text = Localization.GetString("pause_menu_back_to_game")
|
|
Case 1
|
|
Text = Localization.GetString("pause_menu_quit_to_menu")
|
|
End Select
|
|
|
|
If i = mainIndex Then
|
|
Canvas.DrawImageBorder(TextureManager.GetTexture(mainTexture, New Rectangle(0, 48, 48, 48)), 2, New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180, 220 + i * 128, 320, 64), True)
|
|
Else
|
|
Canvas.DrawImageBorder(TextureManager.GetTexture(mainTexture, New Rectangle(0, 0, 48, 48)), 2, New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180, 220 + i * 128, 320, 64), True)
|
|
End If
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Text, New Vector2(CInt(Core.ScreenSize.Width / 2) - (FontManager.InGameFont.MeasureString(Text).X / 2) - 10, 256 + i * 128), Color.Black)
|
|
Next
|
|
End Sub
|
|
|
|
Private Sub UpdateMain()
|
|
If Controls.Up(True, True, True) = True Then
|
|
Me.mainIndex -= 1
|
|
End If
|
|
If Controls.Down(True, True, True) = True Then
|
|
Me.mainIndex += 1
|
|
End If
|
|
|
|
If Core.GameInstance.IsMouseVisible = True Then
|
|
For i = 0 To 1
|
|
If Core.ScaleScreenRec(New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180, 220 + i * 128, 320 + 32, 64 + 32)).Contains(MouseHandler.MousePosition) = True Then
|
|
Me.mainIndex = i
|
|
|
|
If Controls.Accept(True, False) = True Then
|
|
Select Case Me.mainIndex
|
|
Case 0
|
|
SoundManager.PlaySound("select")
|
|
ClickContinue()
|
|
Case 1
|
|
SoundManager.PlaySound("select")
|
|
ClickQuit()
|
|
End Select
|
|
End If
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
Me.mainIndex = CInt(MathHelper.Clamp(Me.mainIndex, 0, 1))
|
|
|
|
If Controls.Accept(False, True) = True Then
|
|
Select Case Me.mainIndex
|
|
Case 0
|
|
SoundManager.PlaySound("select")
|
|
ClickContinue()
|
|
Case 1
|
|
SoundManager.PlaySound("select")
|
|
ClickQuit()
|
|
End Select
|
|
End If
|
|
|
|
If Controls.Dismiss() = True Or KeyBoardHandler.KeyPressed(KeyBindings.EscapeKey) = True And leftEscapeKey = True Or ControllerHandler.ButtonPressed(Buttons.Start) = True Then
|
|
SoundManager.PlaySound("select")
|
|
ClickContinue()
|
|
End If
|
|
|
|
If KeyBoardHandler.KeyDown(KeyBindings.EscapeKey) = False And ControllerHandler.ButtonDown(Buttons.Start) = False Then
|
|
Me.leftEscapeKey = True
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub ClickContinue()
|
|
Core.SetScreen(Me.PreScreen)
|
|
End Sub
|
|
|
|
Private Sub ClickQuit()
|
|
If Me.canCreateAutosave = True Then
|
|
QuitGame()
|
|
Else
|
|
Me.menuIndex = 1
|
|
Me.quitIndex = 0
|
|
End If
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
#Region "QuitMenu"
|
|
|
|
Private Sub DrawQuit()
|
|
Dim pX As Integer = CInt(Core.ScreenSize.Width / 2) - CInt(FontManager.InGameFont.MeasureString(Localization.GetString("pause_menu_confirmation")).X / 2)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Localization.GetString("pause_menu_confirmation"), New Vector2(pX - 7, CInt(Core.ScreenSize.Height / 6.8) + 3 + 110), Color.Black)
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Localization.GetString("pause_menu_confirmation"), New Vector2(pX - 10, CInt(Core.ScreenSize.Height / 6.8) + 110), Color.White)
|
|
|
|
For i = 0 To 1
|
|
Dim Text As String = ""
|
|
Dim x As Integer = 0
|
|
Select Case i
|
|
Case 0
|
|
Text = Localization.GetString("pause_menu_no")
|
|
x = -200
|
|
Case 1
|
|
Text = Localization.GetString("pause_menu_yes")
|
|
x = 200
|
|
End Select
|
|
|
|
If i = quitIndex Then
|
|
Canvas.DrawImageBorder(TextureManager.GetTexture(mainTexture, New Rectangle(0, 48, 48, 48)), 2, New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180 + x, 320, 320, 64), True)
|
|
Else
|
|
Canvas.DrawImageBorder(TextureManager.GetTexture(mainTexture, New Rectangle(0, 0, 48, 48)), 2, New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180 + x, 320, 320, 64), True)
|
|
End If
|
|
|
|
Core.SpriteBatch.DrawInterfaceString(FontManager.InGameFont, Text, New Vector2(CInt(Core.ScreenSize.Width / 2) - (FontManager.InGameFont.MeasureString(Text).X / 2) - 10 + x, 356), Color.Black)
|
|
Next
|
|
End Sub
|
|
|
|
Private Sub UpdateQuit()
|
|
If Controls.Left(True, True, True) = True Then
|
|
Me.quitIndex -= 1
|
|
End If
|
|
If Controls.Right(True, True, True) = True Then
|
|
Me.quitIndex += 1
|
|
End If
|
|
|
|
If Core.GameInstance.IsMouseVisible = True Then
|
|
For i = 0 To 1
|
|
Dim x As Integer = -200
|
|
If i = 1 Then
|
|
x = 200
|
|
End If
|
|
|
|
If Core.ScaleScreenRec(New Rectangle(CInt(Core.ScreenSize.Width / 2) - 180 + x, 320, 320 + 32, 64 + 32)).Contains(MouseHandler.MousePosition) = True Then
|
|
Me.quitIndex = i
|
|
|
|
If Controls.Accept(True, False) = True Then
|
|
Select Case Me.quitIndex
|
|
Case 0
|
|
SoundManager.PlaySound("select")
|
|
ClickBack()
|
|
Case 1
|
|
SoundManager.PlaySound("select")
|
|
ClickConfirmationQuit()
|
|
End Select
|
|
End If
|
|
End If
|
|
Next
|
|
End If
|
|
|
|
Me.quitIndex = CInt(MathHelper.Clamp(Me.quitIndex, 0, 1))
|
|
|
|
If Controls.Accept(False, True) = True Then
|
|
Select Case Me.quitIndex
|
|
Case 0
|
|
SoundManager.PlaySound("select")
|
|
ClickBack()
|
|
Case 1
|
|
SoundManager.PlaySound("select")
|
|
ClickConfirmationQuit()
|
|
End Select
|
|
End If
|
|
|
|
If Controls.Dismiss(False, True) = True Then
|
|
SoundManager.PlaySound("select")
|
|
ClickBack()
|
|
End If
|
|
End Sub
|
|
|
|
Private Sub ClickBack()
|
|
Me.menuIndex = 0
|
|
End Sub
|
|
|
|
Private Sub ClickConfirmationQuit()
|
|
Me.QuitGame()
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
Private Sub QuitGame()
|
|
If JoinServerScreen.Online = True Then
|
|
Core.ServersManager.ServerConnection.Disconnect()
|
|
End If
|
|
Chat.ClearChat()
|
|
ScriptStorage.Clear()
|
|
Core.SetScreen(New PressStartScreen())
|
|
Core.Player.loadedSave = False
|
|
End Sub
|
|
|
|
Public Overrides Sub ChangeTo()
|
|
MusicManager.MasterVolume /= 4
|
|
MusicManager.UpdateVolume()
|
|
End Sub
|
|
|
|
Public Overrides Sub ChangeFrom()
|
|
MusicManager.MasterVolume *= 4
|
|
MusicManager.UpdateVolume()
|
|
End Sub
|
|
End Class |