changeset 247:8c0c132b422f

Button widget for cutscene
author Stefano Rivera <stefano@rivera.za.net>
date Thu, 07 Apr 2011 19:25:48 +0200
parents 8dee25fd070d
children 129afb4417cf
files skaapsteker/cutscene.py skaapsteker/widgets/text.py
diffstat 2 files changed, 55 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/skaapsteker/cutscene.py	Thu Apr 07 19:11:08 2011 +0200
+++ b/skaapsteker/cutscene.py	Thu Apr 07 19:25:48 2011 +0200
@@ -6,21 +6,33 @@
 
 from . import data
 from .engine import ChangeScene, Scene
-from .widgets.text import Text, unindent_text
+from .widgets.text import Text, ButtonSet, TextButton, unindent_text
 
 class CutScene(Scene):
     def __init__(self, game_state, text, background, music=None):
         super(CutScene, self).__init__(game_state)
-        self.text = text
-        self.text_widget = Text(text, pygame.Rect(20, 20, 800-40, 600-40),
-                                size=24, shadow='gray', wrap=True)
         self.background = data.load_image('backgrounds/' + background)
         self.start_time = pygame.time.get_ticks()
         self.run_time = 60000 # ms
+
         self._background_music = None
         if music and pygame.mixer.get_init():
             self._background_music = data.filepath(music)
 
+        text_widget = Text(text, pygame.Rect(20, 20, 800-40, 600-40),
+                           size=24, shadow='gray', wrap=True)
+        self.widgets.append(text_widget)
+
+        button_set = ButtonSet()
+        button_set.append(TextButton("Continue", (300, 500), size=24, color='yellow'))
+        button_set.callbacks.append(self.done)
+        self.widgets.append(button_set)
+
+    def done(self, selected=None, data=None):
+        # Avoid circular import...
+        from .menuscene import MenuScene
+        ChangeScene.post(MenuScene(self.game_state))
+
     def draw(self, surface, engine):
         viewport = surface.get_clip()
 
@@ -34,15 +46,12 @@
         surface.blit(self.background, viewport.topleft,
                      pygame.Rect((pos, bottom), viewport.size))
 
-        self.text_widget.draw(surface)
         super(CutScene, self).draw(surface, engine)
 
     def dispatch(self, ev):
         if ev.type is KEYDOWN:
             if ev.key in(K_q, K_ESCAPE):
-                # Avoid circular import...
-                from .menuscene import MenuScene
-                ChangeScene.post(MenuScene(self.game_state))
+                self.done()
         super(CutScene, self).dispatch(ev)
 
     def enter(self):
--- a/skaapsteker/widgets/text.py	Thu Apr 07 19:11:08 2011 +0200
+++ b/skaapsteker/widgets/text.py	Thu Apr 07 19:25:48 2011 +0200
@@ -1,5 +1,6 @@
 # -*- coding: utf-8 -*-
 
+import collections
 import os.path
 
 import pygame
@@ -143,3 +144,40 @@
         for option in self.option_widgets:
             option.draw(surface)
         self.selector.draw(surface)
+
+
+class TextButton(Widget):
+    def __init__(self, text, pos, margin=10, **kwargs):
+        textpos = pygame.Rect((pos[0] + margin, pos[1] + margin), (0, 0))
+        self.text = Text(text, textpos, **kwargs)
+        self.rect = pygame.Rect(pos, (0, 0))
+        self.rect.width = self.text.rect.width + 2 * margin
+        self.rect.height = self.text.rect.height + 2 * margin
+
+    def draw(self, surface, selected=False):
+        self.text.draw(surface)
+        pygame.draw.rect(surface, self.text.color, self.rect, 1)
+
+
+class ButtonSet(Widget):
+    def __init__(self):
+        self.options = []
+        self.selected = 0
+        self.callbacks = []
+
+    def append(self, widget, data=None):
+        self.options.append((widget, data))
+
+    def dispatch(self, ev):
+        if ev.type is KEYDOWN:
+            if ev.key == K_UP:
+                self.selected -= 1
+            elif ev.key == K_DOWN:
+                self.selected += 1
+            elif ev.key == K_RETURN:
+                for callback in self.callbacks:
+                    callback(self.selected, self.options[self.selected][1])
+
+    def draw(self, surface):
+        for i, widget in enumerate(self.options):
+            widget[0].draw(surface, i == self.selected)