Mercurial > skaapsteker
view skaapsteker/widgets/bubble.py @ 615:e71e13dbd570
Properly copy pos when creating parts of speech bubbles.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Wed, 04 May 2011 01:28:41 +0200 |
parents | ba66bacbab22 |
children |
line wrap: on
line source
# -*- coding: utf-8 -*- """Widget for in-level dialogue / speech bubbles.""" from pygame.locals import (KEYDOWN, K_RETURN, K_SPACE, SRCALPHA) import pygame.draw import pygame from . import Widget from ..engine import CloseDialog from .text import Text, TextChoice class NotificationWidget(Widget): def __init__(self, text): pos = pygame.Rect((0, 0), (300, 1)) text += u'\n\n» Leave' self._text = Text(text, pos, wrap=True) def draw(self, level_surface): if self._text: self._text.rect.center = level_surface.get_clip().center bgrect = self._text.rect.inflate(10, 10) bgrect2 = bgrect.move(0, 0) # bgrect2.topleft = (0, 0) bgsurf = pygame.Surface(bgrect.size, flags=SRCALPHA) bgsurf.fill((255, 255, 127, 120)) pygame.draw.rect(bgsurf, (0, 0, 0, 120), bgrect2, 1) level_surface.blit(bgsurf, bgrect) self._text.draw(level_surface) def close(self): pass def dispatch(self, ev): if ev.type == KEYDOWN and ev.key in [K_RETURN, K_SPACE]: CloseDialog.post(None) class DialogueWidget(Widget): def __init__(self, npc): self.npc = npc self.dsm = npc.dsm self._text = None self._text_choice = None self._state_update() def _state_update(self): pos = pygame.Rect((0, 0), (300, 1)) state = self.dsm.get_state() if state.text: # pos.move(0, 0) copies pos self._text = Text(state.text, pos.move(0, 0), wrap=True) else: self._text = None options = [(text, i) for (i, text) in self.dsm.choices()] if state.auto_next: text = state.auto_next_text if state.auto_next_text else "Next" options.append((text, "N")) else: options.append(("Leave", "L")) # pos.move(0, 0) copies pos self._text_choice = TextChoice(options, pos.move(0, 0), wrap=True) self._text_choice.callbacks.append(self._selected) def _selected(self, i, data): if data == "L": CloseDialog.post(self.npc) else: if data == "N": self.dsm.auto_next() else: self.dsm.choice(i) if self.dsm.has_text(): self._state_update() else: CloseDialog.post(self.npc) def draw(self, level_surface): if self._text: self._text.rect.center = level_surface.get_clip().center self._text_choice.rect.topleft = self._text.rect.bottomleft self._text_choice.rect.move_ip((0, 10)) bgrect = self._text.rect.union(self._text_choice.rect) bgrect.inflate_ip(10, 10) bgrect2 = bgrect.move(0, 0) # bgrect2.topleft = (0, 0) bgsurf = pygame.Surface(bgrect.size, flags=SRCALPHA) bgsurf.fill((255, 255, 255, 180)) pygame.draw.rect(bgsurf, (0, 0, 0, 120), bgrect2, 1) level_surface.blit(bgsurf, bgrect) self._text.draw(level_surface) self._text_choice.draw(level_surface) def close(self): pass def dispatch(self, ev): self._text_choice.dispatch(ev)