def enter_frame(self): mouse_position = pygame.mouse.get_pos() if type(self.mode) is self.GrabMode: node,grab_point = self.mode node.position = Vec(mouse_position) + Vec(grab_point) node.adjust_position() elif type(self.mode) in (self.ConnectionMode, self.WaitingPlacement): for s in self.terrain.salles: if s.general_collide(mouse_position): s.change_display("rollover") else: s.change_display("normal") if type(self.mode) is self.ConnectionMode: self.mode.node.change_display("rollover") elif type(self.mode) is self.PlayMode: for s in self.terrain.salles: s.change_display('normal') for p in s.persos: if p.general_collide(mouse_position): p.change_display("rollover") else: p.change_display("normal") elif type(self.mode) is self.MovePersoMode: perso = self.mode.perso for s in self.terrain.salles: if s in perso.salle.destinations: s.change_display('rollover') elif s.general_collide(mouse_position): s.change_display('rollover') else: s.change_display('normal') for p in s.persos: if p is perso: p.change_display("rollover") else: p.change_display("normal") if type(self.mode) in (self.PlayMode, self.FinRound): for p in self.round.persos_morts: p.change_display("normal")
def _update_perso_positions(self): positions = [ self.position + Vec(p) * (self.rect.width / 4) for p in [(0,0),(-1,-1),(+1,+1),(+1,-1),(-1,+1), (0,-1),(+1,0),(0,+1),(-1,0)] ] for i,p in enumerate(self.persos): p.position = positions[i]
def get_alias(self, point): try: color = self.pixsource.get_at( Vec(point) - (0,1) ) except IndexError: return None try: return self.colormap[ tuple(color) ] except KeyError: return None
def draw(self): self.screen.fill(colors.BLACK) pygame.draw.rect(self.screen, colors.BROWN, ( (0, WINDOW_SIZE[1] - 80), (WINDOW_SIZE[0], 80) )) pygame.draw.rect(self.screen, colors.BROWN, ( (WINDOW_SIZE[0] - 130, 0), (130, WINDOW_SIZE[1]) )) mouse_position = pygame.mouse.get_pos() for s in self.terrain.salles: for d in s.destinations: if id(d) < id(s): self.draw_connection_line(d.position, s.position) if type(self.mode) is self.ConnectionMode: self.draw_connection_line(self.mode.node.position, mouse_position) if True: for s in self.terrain.salles: self.draw_salle(s) if self.mode.defaultmode is self.PlayMode: name = self.round.joueur_actuel().name rend = Node.font.render(name, True, colors.BLACK) position = Vec(mouse_position) + (0,30) fontrect = rend.get_rect(center=position) for c,w in zip([colors.WHITE, colors.BROWN],[18,15]): pygame.draw.circle(self.screen, c, position, w) self.screen.blit(rend,fontrect) if self.mode.defaultmode in (self.PlayMode,self.FinRound): self.update_morts_persos_position() for p in self.round.persos_morts: self.draw_perso(p) if self.mode.defaultmode in (self.PlayMode,self.FinRound,self.FinPartie): for i,joueur in enumerate(self.partie.joueurs): text = "({}) {} : {} Point{}".format( ' '.join(map(str,joueur.persos)), joueur.name, joueur.points, "s" if joueur.points != 1 else "" ) rend = Node.font.render(text, True, colors.WHITE) fontrect = rend.get_rect(topright=( WINDOW_SIZE[0] - 10, 10 + i*60 )) self.screen.blit(rend,fontrect)
def draw_perso(self, perso): rend = Node.font.render(perso.name, True, colors.WHITE) fontrect = rend.get_rect(center=perso.position) image = perso.image rect = image.get_rect(center=perso.position) self.screen.blit(image, rect) self.screen.blit(rend,fontrect) if perso.points is not None: texte = str(perso.points) rend = Node.font.render(texte, True, colors.WHITE) fontrect = rend.get_rect(center=Vec(perso.position) - (0,30)) self.screen.blit(rend,fontrect)
def treat_event(self, event): mouse_position = pygame.mouse.get_pos() if event.type == pygame.QUIT: self.finished = True elif event.type == pygame.MOUSEBUTTONDOWN: if type(self.mode) is self.WaitingPlacement: collider = self.find_salle_collider(mouse_position) if collider: if collider.grab_collide(mouse_position): self.mode = self.GrabMode( collider, Vec(collider.position) - mouse_position ) elif collider.connection_collide(mouse_position): self.mode = self.ConnectionMode(collider) else: self.mode = self.WaitingPlacement() else: if len(self.terrain.salles) < self.terrain.maximum_salles: new_node = Node(mouse_position) if len(self.terrain.salles): self.terrain.salles[-1].make_liaison(new_node) self.terrain.add_salle(new_node) self.mode = self.GrabMode(new_node, (0,0)) else: self.mode = self.WaitingPlacement() elif type(self.mode) is self.PlayMode: perso = self.find_pion_collider(mouse_position) if perso: salle = perso.salle if len(salle.persos) > 1: self.kill(perso) else: destinations = salle.destinations if len(destinations) == 1: self.move_perso(perso, next(iter(destinations))) else: self.mode = self.MovePersoMode(perso) elif type(self.mode) is self.MovePersoMode: perso = self.mode.perso collider = self.find_salle_collider(mouse_position) if collider and collider != perso.salle: try: self.move_perso(perso,collider) except ValueError: pass elif event.type == pygame.MOUSEBUTTONUP: if type(self.mode) is self.ConnectionMode: node = self.mode.node collider = self.find_salle_collider(mouse_position) if collider: try: node.remove_liaison(collider) except KeyError: node.make_liaison(collider) if self.mode.defaultmode is self.WaitingPlacement: self.mode = self.WaitingPlacement() elif event.type == pygame.KEYDOWN: if type(self.mode) in (self.WaitingPlacement, self.FinRound): if event.key == pygame.K_p: self.try_begin_game()
def _get_collision_alias(self,point): relpoint = Vec(point) - self.rect.topleft return self.collision.get_alias(relpoint)