3
# Copyright (C) 2004, 2008 Christof Petig and Ingo Konrad
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 3 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program; if not, see <http://www.gnu.org/licenses/>.
29
class Gcompris_hexagon:
30
"""The hexagon activity"""
32
def __init__(self, gcomprisBoard):
33
self.gcomprisBoard = gcomprisBoard
36
# These are used to let us restart only after the bonus is displayed.
37
# When the bonus is displayed, it call us first with pause(1) and then with pause(0)
38
self.board_paused = 0;
43
self.gcomprisBoard.level=1
44
self.gcomprisBoard.maxlevel=9
45
self.gcomprisBoard.sublevel=1
46
self.gcomprisBoard.number_of_sublevel=1
47
gcompris.bar_set(gcompris.BAR_LEVEL)
48
gcompris.set_default_background(self.gcomprisBoard.canvas.get_root_item())
49
gcompris.bar_set_level(self.gcomprisBoard)
60
def key_press(self, keyval, commit_str, preedit_str):
63
# Called by gcompris core
64
def pause(self, pause):
66
self.board_paused = pause
68
# When the bonus is displayed, it call us first with pause(1) and then with pause(0)
70
if(pause == 0 and self.gamewon):
72
self.set_level(self.gcomprisBoard.level)
77
# Called by gcompris when the user click on the level icon
78
def set_level(self, level):
79
self.gcomprisBoard.level=level
80
self.gcomprisBoard.sublevel=1
81
# Set the level in the control bar
82
gcompris.bar_set_level(self.gcomprisBoard);
84
if(self.gcomprisBoard.level == 1):
88
elif(self.gcomprisBoard.level == 2):
92
elif(self.gcomprisBoard.level == 3):
96
elif(self.gcomprisBoard.level == 4):
100
elif(self.gcomprisBoard.level == 5):
104
elif(self.gcomprisBoard.level == 6):
108
elif(self.gcomprisBoard.level == 7):
112
elif(self.gcomprisBoard.level == 8):
116
elif(self.gcomprisBoard.level == 9):
124
# ----------------------------------------------------------------------
125
# ----------------------------------------------------------------------
126
# ----------------------------------------------------------------------
128
def game_start(self):
130
self.rootitem = goocanvas.Group(parent = self.gcomprisBoard.canvas.get_root_item())
132
self.random_catx = random.randrange(self.nbx)
133
self.random_caty = random.randrange(self.nby)
136
self.gamewon = False;
137
# Remove the root item removes all the others inside it
138
if self.rootitem != None:
139
self.rootitem.remove()
142
def paint_hex(self, x, y, color=0x0099FFCCL):
143
ax = 30+self.sqrt3*self.r*x
147
ax+=self.sqrt3/2*self.r
149
for i in range (len(self.cx)):
150
pts.append ((ax+self.cx [i], ay+self.cy [i]))
152
s = goocanvas.Polyline (parent = self.rootitem,
153
points = goocanvas.Points(pts),
155
stroke_color = "black",
156
fill_color_rgba = color,
160
def paint_skin(self):
163
self.sqrt3 = math.sqrt(3)
165
self.cx.append(int(self.r*math.cos(math.pi/6+i*math.pi/3)))
166
self.cy.append(int(self.r*math.sin(math.pi/6+i*math.pi/3)))
167
for x in range (self.nbx):
168
for y in range (self.nby):
169
s = self.paint_hex(x, y)
171
s.connect ("button_press_event", self.on_click, x-int(y/2), y)
173
def coloring(self,dist):
177
g = long(4*0xFF*dist)
180
r = 0xFF-long(4*(dist-0.25)*0xFF)
182
g = 0xFF-long(4*(dist-0.5)*0xFF)
183
b = long(0xFF*4*(dist-0.5))
186
r = long(0xFF*4*(dist-0.75))
189
color = r*0x1000000+g*0x10000+b*0x100+0xFF
192
def on_click (self, widget, target, event=None, x=0, y=0):
193
if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1 :
195
catdistance = self.distance_cat(x,y)
196
#print self.random_catx, self.random_caty,x,y,catdistance
199
gcompris.sound.play_ogg("sounds/smudge.wav")
202
self.increment_level()
204
gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.GNU)
206
gcompris.sound.play_ogg("sounds/bleep.wav")
208
color = self.coloring (catdistance/30.0)
209
widget.props.fill_color_rgba = color;
213
position = 19 + self.sqrt3 * self.r * self.random_catx
214
if self.random_caty % 2:
215
position += self.sqrt3/2 * self.r
216
pixbuf2 = gcompris.utils.load_pixmap \
217
("hexagon/strawberry.svg")
219
w2 = pixbuf2.get_width() * h2/pixbuf2.get_height()
220
img = goocanvas.Image (parent = self.rootitem,
221
pixbuf = pixbuf2.scale_simple(w2, h2,
222
gtk.gdk.INTERP_BILINEAR),
224
y = 14+1.5*self.random_caty*self.r)
226
def distance_cat (self,x,y):
227
dx = self.random_catx-x-int(self.random_caty/2)
228
dy = self.random_caty-y
231
return abs(dx)+abs(dy)
233
return max(abs(dx),abs(dy))
235
# Code that increments the sublevel and level
236
# And bail out if no more levels are available
237
# return 1 if continue, 0 if bail out
238
def increment_level(self):
239
self.gcomprisBoard.sublevel += 1
241
if(self.gcomprisBoard.sublevel>self.gcomprisBoard.number_of_sublevel):
243
self.gcomprisBoard.sublevel=1
244
self.gcomprisBoard.level += 1
245
if(self.gcomprisBoard.level > self.gcomprisBoard.maxlevel):
246
self.gcomprisBoard.level = self.gcomprisBoard.maxlevel