Mercurial > mamba
annotate mamba/widgets/level.py @ 331:0c25bca380de
Support for loading level from string.
author | Simon Cross <hodgestar@gmail.com> |
---|---|
date | Fri, 16 Sep 2011 21:04:42 +0200 |
parents | a061dd62127c |
children | 170d4a43c00e |
rev | line source |
---|---|
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
1 from pygame.rect import Rect |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
2 from pygame.locals import MOUSEBUTTONDOWN, MOUSEBUTTONUP, MOUSEMOTION |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
3 |
23 | 4 from mamba.widgets.base import Widget |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
5 from mamba.constants import TILE_SIZE |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
6 |
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
7 |
120 | 8 class EditLevelWidget(Widget): |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
9 def __init__(self, level, offset=(0, 0)): |
50 | 10 self.level = level |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
11 level_rect = Rect(offset, level.get_size()) |
264
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
12 self.main_tool = None |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
13 self.tool = None |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
14 self.drawing = False |
120 | 15 super(EditLevelWidget, self).__init__(level_rect) |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
16 |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
23
diff
changeset
|
17 def draw(self, surface): |
110 | 18 self.level.draw(surface) |
21
f76c3f033772
Release early, release broken. Level stuff.
Jeremy Thurgood <firxen@gmail.com>
parents:
diff
changeset
|
19 |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
20 def set_tool(self, new_tool): |
264
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
21 self.main_tool = new_tool |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
22 self.tool = new_tool |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
23 |
24
30d4f3e62bcf
Refactor widgets *again*, add container to Habitat
Stefano Rivera <stefano@rivera.za.net>
parents:
23
diff
changeset
|
24 def event(self, event): |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
25 if event.type == MOUSEBUTTONDOWN: |
264
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
26 if event.button == 1: # Left button |
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
27 self.tool = self.main_tool |
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
28 else: |
2c9cc902928f
Right-click to erase in the level editor.
Jeremy Thurgood <firxen@gmail.com>
parents:
173
diff
changeset
|
29 self.tool = '.' |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
30 self.drawing = True |
272
a061dd62127c
Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
31 if self.tool: |
a061dd62127c
Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
32 self.update_tile(event.pos) |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
33 elif event.type == MOUSEBUTTONUP: |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
34 self.drawing = False |
272
a061dd62127c
Hook up load and new buttons
Neil Muller <drnlmuller@gmail.com>
parents:
264
diff
changeset
|
35 elif event.type == MOUSEMOTION and self.drawing and self.tool: |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
36 # FIXME: Need to consider leaving and re-entering the widget |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
37 self.update_tile(event.pos) |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
38 |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
39 def update_tile(self, pixel_pos): |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
40 """Update the tile at the current mouse position""" |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
41 # We convert our current position into a tile position |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
42 # and replace the tile with the current tool |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
43 tile_pos = (pixel_pos[0] / TILE_SIZE[0], |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
44 pixel_pos[1] / TILE_SIZE[1]) |
173
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
172
diff
changeset
|
45 old_tile = self.level.get_tile(tile_pos) |
172
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
46 if self.tool == '.' and old_tile is None: |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
47 return |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
48 elif old_tile is not None and old_tile.tile_char == self.tool: |
dabf13abb3fd
Add basic drawing to level editor
Neil Muller <drnlmuller@gmail.com>
parents:
120
diff
changeset
|
49 return |
173
71911af9d42d
Refactor drawing code. Correct tile variants when painting
Neil Muller <drnlmuller@gmail.com>
parents:
172
diff
changeset
|
50 self.level.replace_tile(tile_pos, self.tool) |