class MiniGrill: def __init__(self): self.image = image.load(data_file('grill.png')) self.rect = Rect(500, 250, self.image) window.game_window.push_handlers(self.on_mouse_press) window.game_window.push_handlers(self.on_mouse_motion) self.highlighted = False self.active = False def on_mouse_motion(self, x, y, dx, dy): if self.rect.collide_point(x, y): self.highlighted = True else: self.highlighted = False def on_mouse_press(self, x, y, button, modifiers): if self.rect.collide_point(x, y): self.active = True def draw(self): if self.highlighted: glColor4f(0.5, 0.1, 1, 1) else: glColor4f(1, 1, 1, 1) self.image.blit(*self.rect.bottomleft) glColor4f(1, 1, 1, 1)
class Beef(GrillObject): def __init__(self): GrillObject.__init__(self) self.image = image.load(data_file('beef.png')) self.rect = Rect(520, 230, self.image) self.cooking = False self.reset() def reset(self): GrillObject.reset(self) self.cooking_time = 15 self.red = 1 self.brown_time = 3 self.cooked = False self.burnt = False self.rect.bottomleft = (580, 230) def handler(self, pos): if self.rect.collide_point(*pos): self.set_active() self.cooking = False self.highlighted = False return True return False def set_active(self): GrillObject.set_active(self) events.Fire('BeefTaken') #print "beef taken" def set_inactive(self, pos): GrillObject.set_inactive(self, pos) events.Fire('BeefDropped') #print "beef dropped" def update(self, tick): if self.cooking: self.brown_time -= tick if self.brown_time < 0: self.brown_time = 3 self.red -= 0.1 self.cooking_time -= tick if self.cooking_time < 0: if not self.cooked: self.cooked = True events.Fire('BeefCooked') events.Fire('NewHint', random.choice(COOKED_PHRASES)) elif self.cooking_time < -15 and not self.burnt: events.Fire('BeefBurnt') events.Fire('NewHint', random.choice(BURN_PHRASES)) self.burnt = True def draw(self): if self.highlighted: glColor4f(0.5, 0.1, 1, 1) else: glColor4f(self.red, self.red, self.red, 1) self.image.blit(*self.rect.bottomleft) glColor4f(1, 1, 1, 1) def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): if self.active: self.rect.center = (x, y)
class Grill: def __init__(self): self.image = image.load(data_file('biggrill.png')) self.beef = Beef() self.spritzer = Spritzer() self.table = Table() self.exit = Exit() self.rect = Rect(150, 300, 300, 200) self.flareups = [] self.flareup_range = (10, 50) self.flareup_counter = randint(*self.flareup_range) / 10.0 window.game_window.push_handlers(self.on_mouse_press) window.game_window.push_handlers(self.on_mouse_release) window.game_window.push_handlers(self.on_mouse_motion) #events.AddListener(self) self.active = False self.beef_hint_done = False self.flareup_hint_done = False def update(self, tick): self.beef.update(tick) if self.beef.cooking: self.flareup_counter -= tick #print self.flareup_counter if self.flareup_counter <= 0: if len(self.flareups) < 2: if not self.flareup_hint_done: events.Fire('NewHint', 'I can put out flare ups with the spritzer') self.flareup_hint_done = True #print "flare ups hint" self.flareups.append(FlareUp()) self.flareup_counter = randint(*self.flareup_range) / 10.0 #print "flareup" events.Fire('FlareUp') if self.beef.burnt: self.active = False self.spritzer.update(tick) for fire in self.flareups: fire.update(tick) def draw(self): self.image.blit(120, 100) self.exit.draw() self.table.draw() #self.draw_rect() self.beef.draw() for fire in self.flareups: fire.draw() self.spritzer.draw() def check_flareups(self, x, y): for fire in self.flareups: #x += self.spritzer.rect.width/2 #y += self.spritzer.rect.height/2 rect_x = x - fire.rect.x - fire.rect.width/2 rect_y = y + self.spritzer.rect.height/2 - fire.rect.y if rect_x < 100 and abs(rect_y) < 40: #print "hit fire" fire.lives -= 1 if fire.lives <= 0: self.flareups.remove(fire) break def on_mouse_press(self, x, y, button, modifiers): if not self.active: return if self.spritzer.active: if self.table.rect.collide_point(x, y): self.spritzer.set_inactive((x, y)) return #print "spritz" self.spritzer.spritz((x, y)) events.Fire('Spritz') self.check_flareups(x, y) return if self.exit.rect.collide_point(x, y): self.active = False if self.spritzer.handler((x, y)): return if self.beef.handler((x, y)): return def on_mouse_release(self, x, y, button, modifiers): if self.beef.active: self.beef.set_inactive((x, y)) if self.rect.collide_point(self.beef.rect.center): events.Fire('BeefCooking') self.beef.cooking = True #print "cookin'!" def on_mouse_motion(self, x, y, dx, dy): if not self.beef_hint_done and self.active: events.Fire('NewHint', 'I need to put the steak on the grill.') self.beef_hint_done = True def draw_rect(self): glColor4f(0, 0, 1, .5) glBegin(GL_POLYGON) glVertex2d(*self.rect.bottomleft) glVertex2d(*self.rect.topleft) glVertex2d(*self.rect.topright) glVertex2d(*self.rect.bottomright) glEnd() glColor4f(1, 1, 1, 1)
class GarbageCan: def __init__(self): self.image_opened = image.load(data_file('garbagecan-open.png')) self.image_closed = image.load(data_file('garbagecan-closed.png')) self.image_lid = image.load(data_file('garbagecan-lid.png')) self.image_opened.anchor_x = self.image_opened.width/2 self.image_opened.anchor_y = self.image_opened.height/2 self.image_closed.anchor_x = self.image_opened.width/2 self.image_closed.anchor_y = self.image_opened.height/2 self.candidateLeaves = {} self.opened = True self.lid_active = False self.can_active = False self.fallen = False self.can_highlighted = False self.lid_highlighted = True self.can_rect = Rect(0, 0, self.image_closed) self.can_rect.center = (80, 90) self.can_sprite = Sprite(self.image_opened) self.can_sprite.set_position(self.can_rect.x, self.can_rect.y) self.lid_rect = Rect(20, 40, self.image_lid) window.game_window.push_handlers(self.on_mouse_release) window.game_window.push_handlers(self.on_mouse_press) window.game_window.push_handlers(self.on_mouse_drag) window.game_window.push_handlers(self.on_mouse_motion) events.AddListener(self) def update(self, timechange): pass def draw(self): if not self.can_active: if self.can_highlighted: self.can_sprite.color = (255, 20, 25) else: self.can_sprite.color = (255, 255, 255) else: self.can_sprite.color = (255, 255, 255) self.can_sprite.draw() glColor4f(1, 1, 1, 1) if not self.lid_active: if self.lid_highlighted: glColor4f(1, 0.1, 0.1, 1) else: glColor4f(1, 1, 1, 1) if self.opened: self.image_lid.blit(*self.lid_rect.bottomleft) glColor4f(1, 1, 1, 1) def on_mouse_press(self, x, y, button, modifiers): if self.opened and self.lid_rect.collide_point(x, y): self.set_lid_active() elif self.collides(x, y): self.fallen = False self.set_can_active() self.can_sprite.rotation = 0 if self.opened: self.can_sprite.image = self.image_opened else: self.can_sprite.image = self.image_closed def set_can_active(self): window.game_window.set_mouse_visible(False) self.can_active = True events.Fire('CanTaken') def set_lid_active(self): window.game_window.set_mouse_visible(False) self.lid_active = True events.Fire('LidTaken') def collides(self, x,y): cs = self.can_sprite return (x > cs.x - cs.image.width/2 and x < cs.x + cs.image.width/2 and y > cs.y - cs.image.height/2 and y < cs.y + cs.image.height/2 ) def on_mouse_release(self, x, y, button, modifiers): window.game_window.set_mouse_visible(True) #print "x=%d y=%d" % (x, y) if self.lid_active: if self.collides(x, y): self.can_sprite.image = self.image_closed self.opened = False events.Fire('LidClosed') else: self.lid_rect.x = x self.lid_rect.y = y events.Fire('LidDropped') self.lid_active = False elif self.can_active: self.can_sprite.rotation = 0 #self.can_sprite.set_position(x,y) self.can_active = False events.Fire('CanDropped') def on_mouse_motion(self, x, y, dx, dy): if self.collides(x, y): self.can_highlighted = True else: self.can_highlighted = False if self.lid_rect.collide_point(x, y): self.lid_highlighted = True else: self.lid_highlighted = False def on_mouse_drag(self, x, y, dx, dy, buttons, modifiers): if self.can_active: self.can_sprite.x = x self.can_sprite.y = y #self.can_rect.centerx = x #self.can_rect.centery = y #self.can_sprite.set_position(self.can_rect.x, self.can_rect.y) dist = math.sqrt(abs(dx*dx + dy*dy)) self.can_sprite.rotation = dx / 10.0 * 45 if dist > 10: self.fallen = True self.can_active = False if dx > 0: self.can_sprite.rotation = 90 else: self.can_sprite.rotation = -90 events.Fire('CanTipped') if not self.opened: self.opened = True self.can_sprite.image = self.image_opened self.lid_rect.bottomleft = self.can_rect.bottomleft self.lid_rect.x += dx * 5 self.lid_rect.y += dy * 5 for leaf in self.candidateLeaves: if self.collides(leaf.x, leaf.y): leaf.die() elif self.lid_active: self.lid_rect.center = (x, y) def On_LeafSweptOff(self, leaf): self.candidateLeaves[leaf] = 1 def On_LeafDeath(self, leaf): if leaf in self.candidateLeaves: del self.candidateLeaves[leaf]