From 89aa323b301d97ab551da96a1d52aa8455058ba1 Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Mon, 29 Jul 2024 21:27:40 +0200 Subject: [PATCH 1/5] feat(arcade): add an easy to drop in splashscreen --- arcade/gui/experimental/splash.py | 57 ++++++++++++++++++++++++++++++ arcade/gui/widgets/image.py | 6 ++++ arcade/resources/system/logo.png | Bin 0 -> 54445 bytes 3 files changed, 63 insertions(+) create mode 100644 arcade/gui/experimental/splash.py create mode 100644 arcade/resources/system/logo.png diff --git a/arcade/gui/experimental/splash.py b/arcade/gui/experimental/splash.py new file mode 100644 index 000000000..a1945c983 --- /dev/null +++ b/arcade/gui/experimental/splash.py @@ -0,0 +1,57 @@ +""" +An experimental splash screen for arcade. + +This is a simple splash screen that shows the arcade logo +for a few seconds before the actual game starts. + +If arcade is properly installed, you can run this script with: +python -m arcade.gui.experimental.splash +""" + +import arcade +from arcade import View +from arcade.gui import UIAnchorLayout, UIBoxLayout, UIImage, UILabel, UIView + + +class ArcadeSplash(UIView): + """This view shows an arcade splash screen before the actual game starts. + + Args: + view: Next view to show after the splash screen. + duration: The duration of the splash screen in seconds. (Default 3 seconds) + """ + + def __init__(self, view: View, duration: int = 3): + super().__init__() + self.view = view + self.duration = duration + self._time = 0 + + anchor = self.ui.add(UIAnchorLayout()) + box = anchor.add(UIBoxLayout(space_between=20)) + self._logo = box.add( + UIImage(texture=arcade.load_texture(":system:/logo.png"), width=400, height=400) + ) + self._logo.alpha = 0 + box.add(UILabel("Python Arcade", text_color=(0, 0, 0, 255), font_size=40, bold=True)) + + def on_show_view(self): + """Set background color and reset time.""" + super().on_show_view() + arcade.set_background_color(arcade.color.WHITE_SMOKE) + self._time = 0 + + def on_update(self, delta_time: float): + """Update the time and switch to the next view after the duration.""" + self._time += delta_time + if self._time >= self.duration: + self.window.show_view(self.view) + + # fade in arcade logo + self._logo.alpha = min(255, int(255 * self._time / self.duration)) + + +if __name__ == "__main__": + window = arcade.Window() + window.show_view(ArcadeSplash(View())) + arcade.run() diff --git a/arcade/gui/widgets/image.py b/arcade/gui/widgets/image.py index 1df3e4151..a38c01e96 100644 --- a/arcade/gui/widgets/image.py +++ b/arcade/gui/widgets/image.py @@ -24,6 +24,10 @@ class UIImage(UIWidget): """ texture: Union[Texture, NinePatchTexture] = Property() # type: ignore + """Texture to show""" + alpha: int = Property(255) # type: ignore + """Alpha value of the texture, value between 0 and 255. + 0 is fully transparent, 255 is fully visible.""" def __init__( self, @@ -41,6 +45,7 @@ def __init__( **kwargs, ) bind(self, "texture", self.trigger_render) + bind(self, "alpha", self.trigger_full_render) @override def do_render(self, surface: Surface): @@ -53,4 +58,5 @@ def do_render(self, surface: Surface): width=self.content_width, height=self.content_height, tex=self.texture, + alpha=self.alpha, ) diff --git a/arcade/resources/system/logo.png b/arcade/resources/system/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cb40370100488c60d0f6b4b4d9f47d8935444a37 GIT binary patch literal 54445 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 W^wf-V?w=|McnoyzYFEG!(f Date: Mon, 29 Jul 2024 21:28:23 +0200 Subject: [PATCH 2/5] feat(arcade): add an easy to drop in splashscreen --- arcade/gui/experimental/splash.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arcade/gui/experimental/splash.py b/arcade/gui/experimental/splash.py index a1945c983..b45485cf0 100644 --- a/arcade/gui/experimental/splash.py +++ b/arcade/gui/experimental/splash.py @@ -25,7 +25,7 @@ def __init__(self, view: View, duration: int = 3): super().__init__() self.view = view self.duration = duration - self._time = 0 + self._time = 0.0 anchor = self.ui.add(UIAnchorLayout()) box = anchor.add(UIBoxLayout(space_between=20)) @@ -39,7 +39,7 @@ def on_show_view(self): """Set background color and reset time.""" super().on_show_view() arcade.set_background_color(arcade.color.WHITE_SMOKE) - self._time = 0 + self._time = 0.0 def on_update(self, delta_time: float): """Update the time and switch to the next view after the duration.""" From 94097ee892ecf09e225079cac5922caf68c3b1b3 Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Tue, 30 Jul 2024 23:22:00 +0200 Subject: [PATCH 3/5] feat(arcade): add dark mode, drop UIManager usage --- arcade/future/splash.py | 78 +++++++++++++++++++++++++++++++ arcade/gui/experimental/splash.py | 57 ---------------------- 2 files changed, 78 insertions(+), 57 deletions(-) create mode 100644 arcade/future/splash.py delete mode 100644 arcade/gui/experimental/splash.py diff --git a/arcade/future/splash.py b/arcade/future/splash.py new file mode 100644 index 000000000..4c0d1a3f5 --- /dev/null +++ b/arcade/future/splash.py @@ -0,0 +1,78 @@ +""" +An experimental splash screen for arcade. + +This is a simple splash screen that shows the arcade logo +for a few seconds before the actual game starts. + +If arcade is properly installed, you can run this script with: +python -m arcade.gui.experimental.splash +""" + +import arcade +from arcade import View, Sprite, SpriteList, Text + + +class ArcadeSplash(View): + """This view shows an arcade splash screen before the actual game starts. + + Args: + view: Next view to show after the splash screen. + duration: The duration of the splash screen in seconds. (Default 3 seconds) + dark_mode: If True, the splash screen will be shown in dark mode. (Default False) + """ + + def __init__(self, view: View, duration: int = 3, dark_mode: bool = False): + super().__init__() + self._next_view = view + self._duration = duration + self._time = 0.0 + self._dark_mode = dark_mode + + _text_color = (255, 255, 255, 255) if dark_mode else (0, 0, 0, 255) + self._bg_color = (0, 0, 0, 255) if dark_mode else arcade.color.WHITE_SMOKE + + self._sprites = SpriteList() + self._logo = Sprite( + arcade.load_texture(":system:/logo.png"), + center_x=self.window.center_x, + center_y=self.window.center_y, + ) + self._logo.size = 300, 300 + self._sprites.append(self._logo) + + self._text = Text( + "Python Arcade", + anchor_x="center", + x=self.window.center_x, + y=self._logo.bottom - 20, + color=_text_color, + font_size=40, + bold=True, + ) + + def on_show_view(self): + """Set background color and reset time.""" + arcade.set_background_color(self._bg_color) + self._time = 0.0 + self._logo.alpha = 0 + + def on_update(self, delta_time: float): + """Update the time and switch to the next view after the duration.""" + self._time += delta_time + if self._time >= self._duration: + self.window.show_view(self._next_view) + + # fade in arcade logo + self._logo.alpha = min(255, int(255 * self._time / self._duration)) + + def on_draw(self): + """Draw the sprites and text.""" + self.clear() + self._sprites.draw() + self._text.draw() + + +if __name__ == "__main__": + window = arcade.Window() + window.show_view(ArcadeSplash(ArcadeSplash(dark_mode=True, view=arcade.View()))) + arcade.run() diff --git a/arcade/gui/experimental/splash.py b/arcade/gui/experimental/splash.py deleted file mode 100644 index b45485cf0..000000000 --- a/arcade/gui/experimental/splash.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -An experimental splash screen for arcade. - -This is a simple splash screen that shows the arcade logo -for a few seconds before the actual game starts. - -If arcade is properly installed, you can run this script with: -python -m arcade.gui.experimental.splash -""" - -import arcade -from arcade import View -from arcade.gui import UIAnchorLayout, UIBoxLayout, UIImage, UILabel, UIView - - -class ArcadeSplash(UIView): - """This view shows an arcade splash screen before the actual game starts. - - Args: - view: Next view to show after the splash screen. - duration: The duration of the splash screen in seconds. (Default 3 seconds) - """ - - def __init__(self, view: View, duration: int = 3): - super().__init__() - self.view = view - self.duration = duration - self._time = 0.0 - - anchor = self.ui.add(UIAnchorLayout()) - box = anchor.add(UIBoxLayout(space_between=20)) - self._logo = box.add( - UIImage(texture=arcade.load_texture(":system:/logo.png"), width=400, height=400) - ) - self._logo.alpha = 0 - box.add(UILabel("Python Arcade", text_color=(0, 0, 0, 255), font_size=40, bold=True)) - - def on_show_view(self): - """Set background color and reset time.""" - super().on_show_view() - arcade.set_background_color(arcade.color.WHITE_SMOKE) - self._time = 0.0 - - def on_update(self, delta_time: float): - """Update the time and switch to the next view after the duration.""" - self._time += delta_time - if self._time >= self.duration: - self.window.show_view(self.view) - - # fade in arcade logo - self._logo.alpha = min(255, int(255 * self._time / self.duration)) - - -if __name__ == "__main__": - window = arcade.Window() - window.show_view(ArcadeSplash(View())) - arcade.run() From 6d59ca72d8db611083f46121990b788c8ebab2d5 Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Wed, 31 Jul 2024 20:38:23 +0200 Subject: [PATCH 4/5] feat(splash): fix type hints --- arcade/future/splash.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arcade/future/splash.py b/arcade/future/splash.py index 4c0d1a3f5..6cd09deb9 100644 --- a/arcade/future/splash.py +++ b/arcade/future/splash.py @@ -31,7 +31,7 @@ def __init__(self, view: View, duration: int = 3, dark_mode: bool = False): _text_color = (255, 255, 255, 255) if dark_mode else (0, 0, 0, 255) self._bg_color = (0, 0, 0, 255) if dark_mode else arcade.color.WHITE_SMOKE - self._sprites = SpriteList() + self._sprites: SpriteList[Sprite] = SpriteList() self._logo = Sprite( arcade.load_texture(":system:/logo.png"), center_x=self.window.center_x, From 50661b12da25073c7a383b7316d7fb2991693fca Mon Sep 17 00:00:00 2001 From: Maic Siemering Date: Wed, 31 Jul 2024 20:49:37 +0200 Subject: [PATCH 5/5] feat(splash): fix type hints --- arcade/future/splash.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arcade/future/splash.py b/arcade/future/splash.py index 6cd09deb9..07479d697 100644 --- a/arcade/future/splash.py +++ b/arcade/future/splash.py @@ -9,7 +9,7 @@ """ import arcade -from arcade import View, Sprite, SpriteList, Text +from arcade import Sprite, SpriteList, Text, View class ArcadeSplash(View):