Mercurial > mamba
changeset 343:5bf35267ddc0
Hook up sprite deletion. Framework work for sprite editing & adding
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Fri, 16 Sep 2011 22:24:39 +0200 |
parents | 868a53b96c29 |
children | 214b2bd173a8 |
files | mamba/habitats/editor.py mamba/level.py |
diffstat | 2 files changed, 61 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/mamba/habitats/editor.py Fri Sep 16 22:02:38 2011 +0200 +++ b/mamba/habitats/editor.py Fri Sep 16 22:24:39 2011 +0200 @@ -1,7 +1,7 @@ """Habitat for editing levels.""" import pygame.display -from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2 +from pygame.locals import SWSURFACE, KEYDOWN, K_1, K_2, MOUSEBUTTONDOWN from mamba.engine import Habitat, NewHabitatEvent from mamba.widgets.level import EditLevelWidget @@ -29,6 +29,7 @@ self.edit_widget = EditLevelWidget(self.level) self.container.add(self.edit_widget) self.container.add_callback(KEYDOWN, self.keydown_event) + self.container.add_callback(MOUSEBUTTONDOWN, self.mouse_event) self.mode = 'Tiles' self.sprite_mode = 'Add' @@ -359,6 +360,31 @@ def sprite_tool(self, ev, widget, sprite_mode): """Handle sprite stuff""" self.sprite_mode = sprite_mode + self.level.update_tiles_ascii() # commit any changes self.clear_toolbar() self.setup_toolbar() return True + + def mouse_event(self, ev, widget): + """Handle mouse clicks when we are in sprite mode""" + if self.mode != 'Sprites': + return False + if self.container.paused: + return False + tile_pos = self.edit_widget.convert_pos(ev.pos) + sprite = self.level.get_sprite_at(tile_pos) + if self.sprite_mode == 'Delete' and sprite: + self.level.remove_sprite(sprite) + elif self.sprite_mode == 'Edit' and sprite: + self.edit_sprite(tile_pos, sprite) + elif self.sprite_mode == 'Add' and sprite is None: + self.edit_sprite(tile_pos, sprite) + else: + return True # Don't refresh the level if we're doing nothing + self.level.restart() + # edit sprite can pause the container, so unpause here + self.container.paused = False + return True + + def edit_sprite(self, tile_pos, sprite_line): + pass
--- a/mamba/level.py Fri Sep 16 22:02:38 2011 +0200 +++ b/mamba/level.py Fri Sep 16 22:24:39 2011 +0200 @@ -307,3 +307,37 @@ """Reset the level state""" self.setup_level(self.tiles_ascii, self.sprites_ascii) self.make_background() + + def get_sprite_at(self, sprite_pos): + """Return the sprite line at the given pos, or none if it doesn't + exist""" + for sprite_ascii in self.sprites_ascii: + try: + pos, _sep, rest = sprite_ascii.partition(':') + pos = [int(x.strip()) for x in pos.split(',')] + except ValueError: + continue + if pos[0] == sprite_pos[0] and pos[1] == sprite_pos[1]: + return sprite_ascii + return None + + def remove_sprite(self, sprite): + """Remove the given sprite line from the list of sprites""" + self.sprites_ascii.remove(sprite) + + def validate_sprite(self, sprite): + """Check that the sprite line is valid""" + pos, _sep, rest = sprite.partition(':') + pos = [int(x.strip()) for x in pos.split(',')] + class_name, rest = rest.split(None, 1) + args = rest.split() + sprite_id, args = args[0], args[1:] + try: + cls = sprites.find_sprite(class_name) + except KeyError: + raise InvalidMapError("Unknown Sprite class: %s" % class_name) + sprite = cls(*args) + if sprite_id in self.extra_sprites: + # Check that duplicate id is not at the same position + if self.extra[sprite_id].tile_pos != pos: + raise InvalidMapError('Duplicate sprite id: %s.' % sprite_id)