Mercurial > rinkhals
annotate gamelib/misc.py @ 369:25f7d4824250
Disable timers during move_foxes loop to stop events piling up too much
author | Neil Muller <drnlmuller@gmail.com> |
---|---|
date | Thu, 10 Sep 2009 15:18:39 +0000 |
parents | 35f09e0ccd16 |
children | 2d0ff46118e2 |
rev | line source |
---|---|
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
1 # Holder for misc useful classes |
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
2 |
241
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
3 import random |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
4 |
336 | 5 from pygame.locals import KEYDOWN, K_ESCAPE |
6 from pgu import gui | |
7 | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
8 class Position(object): |
100 | 9 """2D position / vector""" |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
10 |
100 | 11 def __init__(self, x, y): |
12 self.x = x | |
13 self.y = y | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
14 |
100 | 15 def to_tuple(self): |
16 return self.x, self.y | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
17 |
100 | 18 def dist(self, b): |
19 """Gives the distance to another position""" | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
20 |
107 | 21 return max(abs(self.x - b.x), abs(self.y - b.y)) |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
22 |
100 | 23 def __sub__(self, b): |
24 return Position(self.x - b.x, self.y - b.y) | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
25 |
100 | 26 def __add__(self, b): |
27 return Position(self.x + b.x, self.y + b.y) | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
28 |
100 | 29 def left_of(self, b): |
30 return self.x < b.x | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
31 |
100 | 32 def right_of(self, b): |
33 return self.x > b.x | |
69
18db99fda6bd
Move spawing code from engine to gameboard - seems more natural.
Neil Muller <drnlmuller@gmail.com>
parents:
diff
changeset
|
34 |
100 | 35 def __eq__(self, b): |
36 return self.x == b.x and self.y == b.y | |
241
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
37 |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
38 class WeightedSelection(object): |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
39 def __init__(self, weightings=None): |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
40 self.weightings = [] |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
41 self.total = 0 |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
42 if weightings: |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
43 for item, weight in weightings: |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
44 self.weightings.append((item, weight)) |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
45 self.total += weight |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
46 |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
47 def choose(self): |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
48 roll = random.uniform(0, self.total) |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
49 for item, weight in self.weightings: |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
50 if roll < weight: |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
51 return item |
1a7000c8211c
Demolition foxes, including better fox selection.
Jeremy Thurgood <firxen@gmail.com>
parents:
107
diff
changeset
|
52 roll -= weight |
336 | 53 |
54 class CheckDialog(gui.Dialog): | |
55 def __init__(self, **params): | |
347
35f09e0ccd16
Make 'Esc' cancel the 'Are You Sure?' dialog. Fix dialog title
Neil Muller <drnlmuller@gmail.com>
parents:
336
diff
changeset
|
56 title = gui.Label('Are You Sure?') |
336 | 57 self.do_quit = False |
58 self.running = True | |
59 tbl = gui.Table() | |
60 tbl.tr() | |
61 tbl.td(gui.Label("Do you REALLY want to exit this game?"), colspan=2) | |
62 tbl.tr() | |
63 tbl.td(gui.Spacer(0, 15), colspan=2) | |
64 tbl.tr() | |
65 yes_button = gui.Button('Yes') | |
66 yes_button.connect(gui.CLICK, self.clicked, True) | |
67 no_button = gui.Button('No') | |
68 no_button.connect(gui.CLICK, self.clicked, False) | |
69 tbl.td(no_button, align=-1) | |
70 tbl.td(yes_button, align=1) | |
71 gui.Dialog.__init__(self, title, tbl, **params) | |
72 | |
73 def clicked(self, val): | |
74 self.do_quit = val | |
75 self.running = False | |
76 self.close() | |
77 | |
78 def event(self, e): | |
79 if e.type == KEYDOWN and e.key == K_ESCAPE: | |
347
35f09e0ccd16
Make 'Esc' cancel the 'Are You Sure?' dialog. Fix dialog title
Neil Muller <drnlmuller@gmail.com>
parents:
336
diff
changeset
|
80 self.clicked(False) |
336 | 81 return True |
82 return gui.Dialog.event(self, e) | |
83 | |
84 def check_exit(): | |
85 dialog = CheckDialog() | |
86 dialog.open() | |
87 return dialog | |
88 | |
89 |