예제 #1
0
 def _assignTask(self, task):
     print(type(task))
     pickup, drop = (task["pickup"]["x"], task["pickup"]["y"]), (
         task["drop"]["x"],
         task["drop"]["y"],
     )
     print(pickup, drop)
     for i in range(len(self.robots)):
         if not self.robots[i].busy:
             print("Angle = ", self.robots[i].getAngle())
             self.robots[i].makeBusy(task)
             self.mutex.release()
             task["robot"] = self.robots[i].id
             self.socketio.emit("assignTo", {
                 "uuid": task["uuid"],
                 "robot": self.robots[i].id
             })
             task["status"] = "Computing Path"
             self.socketio.emit("updateStatus", {
                 "uuid": task["uuid"],
                 "status": "Computing Path"
             })
             finder = PathFinder(self.warehouse)
             _, pos = sim.simxGetObjectPosition(
                 self.warehouse.client,
                 self.robots[i].base,
                 -1,
                 sim.simx_opmode_blocking,
             )
             start = self.warehouse.warehouse_to_img(pos[0], pos[1])
             pickupPathImg, pickupPath = finder.find(
                 start, pickup, self.robots[i].getAngle())
             print("pick found")
             if len(pickupPath) == 0:
                 print("No")
                 task["status"] = "No route"
                 self.socketio.emit("updateStatus", {
                     "uuid": task["uuid"],
                     "status": task["status"]
                 })
                 self.release(i)
                 return
             dropPathImg, dropPath = finder.find(pickup, drop)
             print("drop found")
             if len(dropPath) == 0:
                 print("No")
                 task["status"] = "No route"
                 self.socketio.emit("updateStatus", {
                     "uuid": task["uuid"],
                     "status": task["status"]
                 })
                 self.release(i)
                 return
             task["pickupPath"] = pickupPathImg
             task["dropPath"] = dropPathImg
             self.socketio.emit(
                 "path",
                 {
                     "uuid": task["uuid"],
                     "pickup": pickupPathImg,
                     "drop": dropPathImg,
                 },
             )
             task["status"] = "In Transit"
             self.socketio.emit("updateStatus", {
                 "uuid": task["uuid"],
                 "status": "In Transit"
             })
             print(task["package"]["id"])
             tracker = PathTracker(
                 pickupPath,
                 dropPath,
                 2.8,
                 5,
                 self.robots[i],
                 self.warehouse,
                 self.socketio,
                 task["package"]["id"],
             )
             tracker.track()
             curPos = self.robots[i].getPos()
             mappedPos = self.warehouse.warehouse_to_img(
                 curPos[0], curPos[1])
             self.robots[i].task["status"] = "Finished"
             self.socketio.emit(
                 "updateStatus",
                 {
                     "uuid": self.robots[i].task["uuid"],
                     "status": "Finished"
                 },
             )
             self.socketio.emit(
                 "updateRobotPos",
                 {
                     "id": self.robots[i].id,
                     "x": mappedPos[0],
                     "y": mappedPos[1]
                 },
             )
             self.release(i)
             return
예제 #2
0
def changepoint_path(wav_fn, length, graph=None, markers=None,
    sim_mat=None, avg_duration=None, APP_PATH=None, nchangepoints=4,
    min_start=None):
    """wave filename and graph from that wav, length in seconds"""
    # generate changepoints
    try:
        cpraw = subprocess.check_output([
            APP_PATH + 'music_changepoints/novelty',
            wav_fn, '64', 'rms', 'euc', str(nchangepoints) * 3])
        tmp_changepoints = [float(c) for c in cpraw.split('\n') if len(c) > 0]
        changepoints = []
        cp_idx = 0
        while len(changepoints) < nchangepoints:
            if min_start is None:
                changepoints.append(tmp_changepoints[cp_idx])
            elif tmp_changepoints[cp_idx] >= min_start:
                changepoints.append(tmp_changepoints[cp_idx])
            cp_idx += 1

    except:
        changepoints = novelty(wav_fn, k=64, nchangepoints=nchangepoints)

    print "Change points", changepoints

    if graph is not None:
        edge_lens = [graph[e[0]][e[1]]["duration"]
                     for e in graph.edges_iter()]
        avg_duration = N.mean(edge_lens)
        nodes = sorted(graph.nodes(), key=float)
    else:
        nodes = map(str, markers)

    node_count = int(float(length) / avg_duration)    

    closest_nodes = []
    node_to_cp = {}
    for cp in changepoints:
        closest_nodes.append(
            N.argmin([N.abs(float(node) - float(cp)) for node in nodes]))
        node_to_cp[str(closest_nodes[-1])] = cp


    out = []

    for pair in itertools.permutations(closest_nodes, r=2):
        # print "Finding path for pair", pair, "of length", node_count
        
        avoid_nodes = [cn for cn in closest_nodes if cn != pair[1]]
        # avoid_nodes = closest_nodes
        
        if graph is not None:
            try:
                shortest_path = nx.astar_path_length(graph,
                    nodes[pair[0]], nodes[pair[1]])
                # print "# shortest path:", shortest_path
                if  shortest_path <= node_count:
        
                    pf = PathFinder(graph=graph, start=pair[0],
                                    end=pair[1], length=node_count)
                    res, cost = pf.find(avoid=avoid_nodes)
                    if res is not None:
                        out.append((res, cost))
                        break
            except:
                pass

        else:
            pf = PathFinder(start=pair[0],
                            sim_mat=sim_mat.copy(),
                            end=pair[1],
                            nodes=nodes,
                            length=node_count)
            res, cost = pf.find(avoid=avoid_nodes)
            if res is not None:
                out.append((res, cost, map(lambda x: node_to_cp[str(x)], pair)))

    return out, changepoints
예제 #3
0
def changepoint_path(wav_fn,
                     length,
                     graph=None,
                     markers=None,
                     sim_mat=None,
                     avg_duration=None,
                     APP_PATH=None,
                     nchangepoints=4,
                     min_start=None):
    """wave filename and graph from that wav, length in seconds"""
    # generate changepoints
    try:
        cpraw = subprocess.check_output([
            APP_PATH + 'music_changepoints/novelty', wav_fn, '64', 'rms',
            'euc',
            str(nchangepoints) * 3
        ])
        tmp_changepoints = [float(c) for c in cpraw.split('\n') if len(c) > 0]
        changepoints = []
        cp_idx = 0
        while len(changepoints) < nchangepoints:
            if min_start is None:
                changepoints.append(tmp_changepoints[cp_idx])
            elif tmp_changepoints[cp_idx] >= min_start:
                changepoints.append(tmp_changepoints[cp_idx])
            cp_idx += 1

    except:
        changepoints = novelty(wav_fn, k=64, nchangepoints=nchangepoints)

    print "Change points", changepoints

    if graph is not None:
        edge_lens = [graph[e[0]][e[1]]["duration"] for e in graph.edges_iter()]
        avg_duration = N.mean(edge_lens)
        nodes = sorted(graph.nodes(), key=float)
    else:
        nodes = map(str, markers)

    node_count = int(float(length) / avg_duration)

    closest_nodes = []
    node_to_cp = {}
    for cp in changepoints:
        closest_nodes.append(
            N.argmin([N.abs(float(node) - float(cp)) for node in nodes]))
        node_to_cp[str(closest_nodes[-1])] = cp

    out = []

    for pair in itertools.permutations(closest_nodes, r=2):
        # print "Finding path for pair", pair, "of length", node_count

        avoid_nodes = [cn for cn in closest_nodes if cn != pair[1]]
        # avoid_nodes = closest_nodes

        if graph is not None:
            try:
                shortest_path = nx.astar_path_length(graph, nodes[pair[0]],
                                                     nodes[pair[1]])
                # print "# shortest path:", shortest_path
                if shortest_path <= node_count:

                    pf = PathFinder(graph=graph,
                                    start=pair[0],
                                    end=pair[1],
                                    length=node_count)
                    res, cost = pf.find(avoid=avoid_nodes)
                    if res is not None:
                        out.append((res, cost))
                        break
            except:
                pass

        else:
            pf = PathFinder(start=pair[0],
                            sim_mat=sim_mat.copy(),
                            end=pair[1],
                            nodes=nodes,
                            length=node_count)
            res, cost = pf.find(avoid=avoid_nodes)
            if res is not None:
                out.append((res, cost, map(lambda x: node_to_cp[str(x)],
                                           pair)))

    return out, changepoints
예제 #4
0
class Game:  # Main class
    def __init__(self):  # Init

        # FPS clock
        self.screen = screen
        self.width = width
        self.height = height
        self._music = True
        self._sounds = True
        self.clock = pygame.time.Clock()
        self.death_sounds = [
            load_sound('death' + str(i + 1) + '.wav') for i in range(1)
        ]
        load_music('music.mp3')
        pygame.mixer.music.play(10**8)

        self.sprite_groups = None

        self.conditions = None

        self.keys_pressed = None

        self.terrain = None
        self.screen2 = None
        self.player = None
        self.camera = None
        self.menu = None
        self.paths = None
        self.pathfinder = None
        self.color_mask = None
        self.reset()
        self.start_screen()

    def handle_keys(self):
        if pygame.K_F3 in self.keys_pressed:
            self.conditions[DEBUGGING] = not self.conditions[DEBUGGING]
            self.keys_pressed.remove(pygame.K_F3)
        if pygame.K_PAUSE in self.keys_pressed:
            self.conditions[PAUSED] = not self.conditions[PAUSED]
            self.keys_pressed.remove(pygame.K_PAUSE)
        if pygame.K_ESCAPE in self.keys_pressed:
            self.keys_pressed.remove(pygame.K_ESCAPE)
            self.open_menu()
        if pygame.K_F11 in self.keys_pressed:
            self.fullscreen()
            self.keys_pressed.remove(pygame.K_F11)

        if not self.conditions[PAUSED]:
            # Move calculation
            move_d = [0, 0]
            if pygame.K_UP in self.keys_pressed or pygame.K_w in self.keys_pressed:
                move_d[1] = -1
            if pygame.K_DOWN in self.keys_pressed or pygame.K_s in self.keys_pressed:
                move_d[1] = 1
            if pygame.K_RIGHT in self.keys_pressed or pygame.K_d in self.keys_pressed:
                move_d[0] = 1
            if pygame.K_LEFT in self.keys_pressed or pygame.K_a in self.keys_pressed:
                move_d[0] = -1
            if move_d[0] > 0:
                self.player.look_angle = 0
            elif move_d[0] < 0:
                self.player.look_angle = 180
            if move_d == [0, 0]:
                self.player.i_moving = False
            else:
                self.player.i_moving = True
            self.move(self.player, *move_d)

    def switch_music(self):
        if self._music:
            pygame.mixer.music.stop()
        else:
            pygame.mixer.music.play(10**8)
        self._music = not self._music

    def switch_sounds(self):
        switch_sounds()

    def reset(self, level=1):
        pygame.mixer.music.stop()
        pygame.mixer.music.play(10**8)
        self.menu = Menu()
        self.menu.add_button('Continue', (self.width // 2 - 150, 200),
                             target=self.open_menu)
        self.menu.add_button('Music', target=self.switch_music, switch=True)
        self.menu.add_button('Sounds', target=self.switch_sounds, switch=True)
        self.menu.add_button('Quit game', target=self.terminate)

        self.sprite_groups = {k: pygame.sprite.Group() for k in range(20, 30)}

        self.conditions = {k: False for k in range(40, 50)}
        self.conditions[RUNNING] = True
        self.conditions[FULLSCREEN] = True

        self.keys_pressed = []

        self.terrain = Terrain(16 * 3 * 3, 16 * 3 * 3, level)
        self.sprite_groups[CHUNKS] = pygame.sprite.Group(self.terrain.chunks)
        for chunk in self.sprite_groups[CHUNKS]:
            self.sprite_groups[ALL].add(chunk)
        self.screen2 = pygame.Surface((self.width, self.height),
                                      pygame.HWSURFACE, 32)
        self.player = Player(
            (self.sprite_groups[ENTITIES], self.sprite_groups[ALL]),
            (500, 500))
        self.camera = Camera(self.terrain.get_width(),
                             self.terrain.get_height(), self.player,
                             self.width // 2, self.height // 2)

        self.pathfinder = PathFinder(self.terrain.obst_grid)
        self.paths = dict()
        self.sprite_groups[PLAYER].add(self.player)
        self.camera.update()

    def open_menu(self):
        self.conditions[INMENU] = not self.conditions[INMENU]
        self.conditions[PAUSED] = True if self.conditions[INMENU] else False
        if self.conditions[PAUSED]:
            pygame.mixer.pause()
            pygame.mixer.music.pause()
        else:
            pygame.mixer.unpause()
            pygame.mixer.music.unpause()

    def resize_window(self, w, h):
        self.width, self.height = w, h
        self.screen = pygame.display.set_mode(
            (w, h), pygame.HWSURFACE | pygame.RESIZABLE, 32)
        self.screen2 = pygame.Surface((self.width, self.height),
                                      pygame.HWSURFACE, 32)
        self.camera.centerx = self.width // 2
        self.camera.centery = self.height // 2

    def fullscreen(self):
        if self.conditions[FULLSCREEN]:
            self.resize_window(self.width, self.height)
        else:
            self.width, self.height = width, height
            self.screen = pygame.display.set_mode(
                (width, height),
                pygame.FULLSCREEN | pygame.HWSURFACE | pygame.RESIZABLE, 32)
            self.screen2 = pygame.Surface((width, height), pygame.HWSURFACE,
                                          32)
            self.camera.centerx = self.width // 2
            self.camera.centery = self.height // 2
        self.conditions[FULLSCREEN] = not self.conditions[FULLSCREEN]

    def terminate(self):
        self.conditions[RUNNING] = False

    def handle_signals(self):
        for entity in self.sprite_groups[ENTITIES]:
            if entity.signals[MOVE]:
                self.move(entity, *entity.signals[MOVE])
                entity.signals[MOVE] = None

            if entity.signals[MOVETO]:
                self.move_to(entity, entity.signals[MOVETO])
                entity.signals[MOVETO] = None

            if entity.signals[LAUNCH]:
                p = PROJECTILE_IDS[entity.signals[LAUNCH][0]](
                    (self.sprite_groups[PROJECTILES], self.sprite_groups[ALL]),
                    team=entity.team,
                    damage_amp=entity.bonus_spell_damage)

                p.launch(entity.get_pos(), entity.signals[LAUNCH][1])
                if isinstance(p, SightChecker):
                    p.parent = entity
                entity.signals[LAUNCH] = None

            if entity.signals[PUSH]:
                if entity.signals[PUSH][2] == 0:
                    entity.signals[PUSH] = None
                else:
                    self.move(entity, *entity.signals[PUSH])
                    entity.signals[PUSH] = *entity.signals[PUSH][:2], int(
                        entity.signals[PUSH][2] * 0.95)

            if entity.signals[PARTICLE]:
                for _ in range(entity.signals[PARTICLE][-1]):
                    Particle((self.sprite_groups[PARTICLES],
                              self.sprite_groups[ALL]),
                             *entity.signals[PARTICLE][:-1])
                entity.signals[PARTICLE] = None

            if entity.signals[DEAD]:
                self.kill(entity)

        for projectile in self.sprite_groups[PROJECTILES]:
            if projectile.signals[MOVE]:
                self.move(projectile, *projectile.signals[MOVE])
            if projectile.signals[MOVETO]:
                self.move_to(projectile, projectile.signals[MOVETO])
            if projectile.signals[PARTICLE]:
                for _ in range(projectile.signals[PARTICLE][-1]):
                    Particle((self.sprite_groups[PARTICLES],
                              self.sprite_groups[ALL]),
                             *projectile.signals[PARTICLE][:-1])
            if projectile.signals[DEAD]:
                projectile.die()
            projectile.reset_signals()

        if self.terrain.signals[MESSAGE]:
            msg = Message((self.sprite_groups[ALL], ), (0, 100),
                          *self.terrain.signals[MESSAGE])
            msg.rect.x = (self.width - msg.rect.x) // 2
            self.terrain.signals[MESSAGE] = None

        if self.terrain.signals[END]:
            self.next_level(self.terrain.signals[END] + 1)

        for particle in self.sprite_groups[PARTICLES]:
            if particle.signals[MOVE]:
                self.move(particle, *particle.signals[MOVE], True)
                particle.signals[MOVE] = None

    def main(self):  # Main
        while self.conditions[RUNNING]:  # Main loop
            if not self.player.alive():
                self.reset()
            self.process_events()  # Process events
            self.handle_keys()
            if not self.conditions[PAUSED]:

                self.camera.update()

                self.update_sprites()

                self.handle_signals()
                self.terrain.update(
                    [self.sprite_groups[ENTITIES], self.sprite_groups[ALL]],
                    self.player)
            self.render_sprites()
            self.handle_messages()
            pygame.draw.rect(self.screen2, (0, 0, 200), self.terrain.end_rect)
            # Screen update
            self.screen.blit(self.screen2, (0, 0))
            if self.conditions[DEBUGGING]:
                self.debug()
            pygame.display.flip()
            # Delay
            self.clock.tick(FPS)

        pygame.quit()

    def move(self, sprite, dx, dy, velocity=0, force_move=False):
        x1, y1 = sprite.get_pos()
        if velocity == 0:
            velocity = float(sprite.velocity)
            if sprite.signals[PUSH]:
                velocity /= 2
            if type(sprite) is Player and (dx * dy == 1 or dx * dy == -1):
                velocity /= sqrt(2)
        if not force_move:
            x2 = max(
                sprite.rect.w // 2,
                min(self.terrain.get_width() - sprite.rect.w // 2,
                    x1 + dx * velocity / FPS))
            y2 = max(
                sprite.rect.h // 2,
                min(self.terrain.get_height() - sprite.rect.h // 2,
                    y1 + dy * velocity / FPS))
            sprite.rect.centerx = round(x2)
            sprite.x = x2
            if self.terrain.collide(sprite):
                sprite.rect.centerx = round(x1)
                sprite.x = x1
                x2 = x1
                if isinstance(sprite, Projectile):
                    sprite.die()
            sprite.rect.centery = round(y2)
            sprite.y = y2
            if self.terrain.collide(sprite):
                sprite.rect.centery = round(y1)
                sprite.y = y1
                y2 = y1
                if isinstance(sprite, Projectile):
                    sprite.die()
            if isinstance(sprite, SightChecker)\
                    and pygame.sprite.spritecollide(sprite, self.sprite_groups[PLAYER], False):
                sprite.parent.change_condition(FIGHTING, True)
            if isinstance(sprite, Entity):
                collided = pygame.sprite.spritecollide(
                    sprite, self.sprite_groups[ENTITIES], False)
                if len(collided) > 1:
                    for spr in collided:
                        if spr != sprite:
                            angle = angle_between(sprite.get_pos(),
                                                  spr.get_pos())
                            dx = cos(angle)
                            dy = sin(angle)
                            if isinstance(sprite,
                                          Enemy) and sprite.target == spr:
                                spr.push(dx, dy, 500)
                                spr.hurt(sprite.damage, sprite.get_pos())
                                sprite.change_condition(FIGHTING, True)
                            else:
                                spr.signals[MOVE] = (dx, dy)
                sprite.rect.centerx = round(x1)
                sprite.x = x1
                sprite.rect.centery = round(y1)
                sprite.y = y1
        else:
            x2 = x1 + dx * velocity / max(self.clock.get_fps(), 5)
            y2 = y1 + dy * velocity / max(self.clock.get_fps(), 5)
        if isinstance(sprite, Projectile) and type(sprite) is not SightChecker:
            for col in pygame.sprite.spritecollide(
                    sprite, self.sprite_groups[PROJECTILES], False):
                if col != sprite and not isinstance(col, SightChecker):
                    col.die()
                    sprite.die()
            for spr in sprite.collision(self.sprite_groups[ENTITIES]):
                spr.hurt(sprite.damage, sprite.get_pos())
                angle = angle_between(sprite.get_pos(), spr.get_pos())
                spr.push(cos(angle), sin(angle), sprite.power)
        sprite.rect.centerx, sprite.rect.centery = round(x2), round(y2)
        sprite.x, sprite.y = x2, y2

    def move_to(self, sprite, pos, velocity=0, force_move=False):
        if velocity == 0:
            velocity = float(sprite.velocity)
        if isinstance(sprite, Entity) and not force_move:
            self.pathfinder.find(sprite, sprite.get_pos(), pos)
            new_pos = self.pathfinder.next(sprite)
            if self.paths.get(sprite, None) is None:
                self.paths[sprite] = [[],
                                      (randint(0, 255), randint(0, 255),
                                       randint(0, 255))]
            self.paths[sprite][0] = [sprite.get_pos()
                                     ] + self.pathfinder.get_path(sprite)
        else:
            new_pos = pos
        angle = atan2(new_pos[1] - sprite.y, new_pos[0] - sprite.x)
        if hasattr(sprite, 'look_angle'):
            sprite.look_angle = degrees(angle)
        if abs(sprite.x - new_pos[0]) <= 0.01:
            sprite.x = new_pos[0]
            dx = 0
        else:
            dx = cos(angle)
        if abs(sprite.y - new_pos[1]) <= 0.01:
            sprite.y = new_pos[1]
            dy = 0
        else:
            dy = sin(angle)
        if isinstance(sprite, Projectile) and TRANSPARENT in sprite.mods:
            force_move = True
        self.move(sprite, dx, dy, velocity, force_move)

    def create_enemy(self, pos,
                     **kwargs):  # Creates enemy at pos with given kwargs
        enemy_type = choice(ENEMY_IDS)
        enemy_type((self.sprite_groups[ENTITIES], self.sprite_groups[ALL]),
                   pos, **kwargs)

    def kill(self, sprite):
        for _ in range(10):
            Particle((self.sprite_groups[PARTICLES], self.sprite_groups[ALL]),
                     sprite.get_pos(), sprite.particle_color, 10, 10, 10, 10)
        sprite.kill()
        if is_sounds():
            choice(self.death_sounds).play()

    def update_sprites(self):
        for sprite in self.sprite_groups[ALL]:
            self.camera.apply_sprite(sprite)
        self.sprite_groups[ALL].update()
        for sprite in self.sprite_groups[ALL]:
            self.camera.apply_sprite(sprite, True)

    def next_level(self, level):
        screen = pygame.Surface((self.width, self.height))
        screen.fill((0, 0, 0))
        screen.set_colorkey((255, 255, 255))
        r = 1000
        pos = tuple(
            map(round, self.camera.apply_pos(self.player.get_pos(), True)))
        while r > 0:
            pygame.draw.circle(screen, (255, 255, 255), pos, r)
            self.render_sprites()
            self.screen.blit(self.screen2, (0, 0))
            self.screen.blit(screen, (0, 0))
            pygame.display.flip()
            pygame.draw.circle(screen, (0, 0, 0), pos, r)
            r -= 10
            self.clock.tick(FPS)
        self.reset(level)
        screen.fill((0, 0, 0))
        screen.set_colorkey((255, 255, 255))
        r = 0
        pos = tuple(
            map(round, self.camera.apply_pos(self.player.get_pos(), True)))
        while r < max(self.width, self.height):
            pygame.draw.circle(screen, (255, 255, 255), pos, r)
            self.render_sprites()
            self.screen.blit(self.screen2, (0, 0))
            self.screen.blit(screen, (0, 0))
            pygame.display.flip()
            pygame.draw.circle(screen, (0, 0, 0), pos, r)
            r += 20
            self.clock.tick(FPS)

    def start_screen(self):
        running = True
        font = pygame.font.Font(None, 50)
        line = font.render('Press any key to start...', True, (255, 255, 255))
        counter = 0
        x = 35
        while running:
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    running = False
            counter += 1
            self.screen.fill((0, 0, 0))
            if counter < x:
                self.screen.blit(line, (self.width // 3, self.height // 3 * 2))
            elif counter > 2 * x:
                counter = 0
            pygame.display.flip()
            self.clock.tick(30)
        self.main()

    def render_sprites(self):
        for sprite in self.sprite_groups[ALL]:
            self.camera.apply_sprite(sprite)
        visible_area = pygame.sprite.Sprite()
        visible_area.rect = pygame.rect.Rect([0, 0, self.width, self.height])
        visible_sprites = pygame.sprite.Group(
            pygame.sprite.spritecollide(visible_area, self.sprite_groups[ALL],
                                        False))
        visible_sprites.draw(self.screen2)
        for sprite in visible_sprites:
            visible_sprites.remove(sprite)

        if self.conditions[INMENU]:
            self.menu.render(self.screen2)
        for sprite in self.sprite_groups[ALL]:
            self.camera.apply_sprite(sprite, True)

    def delete_enemy(self, pos):  # Deletes enemy at pos
        x, y = pos
        for entity in self.sprite_groups[ENTITIES]:
            if entity.collision((x, y)):
                entity.kill()
                return

    def handle_messages(self):
        self.sprite_groups[MESSAGES].draw(self.screen2)
        self.sprite_groups[MESSAGES].update()

    def change_camera_target(self, pos):
        for sprite in set(self.sprite_groups[ENTITIES]) | set(
                self.sprite_groups[PROJECTILES]):
            if sprite.rect.collidepoint(pos):
                self.camera.target = sprite
                return

    def debug(self):  # Shows debug info
        font = pygame.font.Font(None, 30)
        lines = list()
        lines.append(
            font.render('FPS: ' + str(int(self.clock.get_fps())), True,
                        pygame.Color('red')))
        for num, line in enumerate(lines):
            self.screen.blit(line, (10, num * 30 + 10))

        for sprite in self.paths.keys():
            if not sprite.alive():
                del self.paths[sprite]
                break
            path, color = self.paths[sprite]
            coords = [
                self.camera.apply_pos((int(x[0]), int(x[1])), True)
                for x in path
            ]
            pygame.draw.lines(self.screen, color, False, coords, 3)

    def process_events(self):  # Process all events
        for event in pygame.event.get():
            # Check for quit
            if self.conditions[INMENU]:
                self.menu.click(pygame.mouse.get_pos())
            if event.type == pygame.QUIT:
                self.conditions[RUNNING] = False
                break

            # Check for key pressed
            if event.type == pygame.KEYDOWN:
                self.keys_pressed.append(event.key)

            # Check for key released
            if event.type == pygame.KEYUP:
                if event.key in self.keys_pressed:
                    del self.keys_pressed[self.keys_pressed.index(event.key)]

            # Check for mouse button pressed
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == pygame.BUTTON_LEFT:
                    if self.conditions[INMENU]:
                        self.menu.click(event.pos, event.type, event.button)
                if not self.conditions[PAUSED]:
                    if event.button == pygame.BUTTON_RIGHT:
                        self.player.try_range_attack(
                            self.camera.apply_pos(event.pos))
                    elif event.button == pygame.BUTTON_LEFT:
                        self.player.try_attack(self.camera.apply_pos(
                            event.pos))
                        rect = pygame.rect.Rect(0, 0, 70, 90)
                        rect.center = self.player.rect.center
                        if abs(self.player.look_angle) >= 90:
                            rect.x -= 40
                        else:
                            rect.x += 40
                        sprite = pygame.sprite.Sprite()
                        sprite.rect = rect
                        collided = pygame.sprite.spritecollide(
                            sprite, self.sprite_groups[ENTITIES], False)
                        for i in collided:
                            if i != self.player:
                                i.hurt(round(self.player.damage),
                                       self.player.get_pos())
                                i.push(i.x - self.player.x,
                                       i.y - self.player.y, 15)
                        collided = pygame.sprite.spritecollide(
                            sprite, self.sprite_groups[PROJECTILES], False)
                        for i in collided:
                            if i.team != self.player.team:
                                i.die()
                        self.terrain.collide(sprite)

            if event.type == pygame.MOUSEBUTTONUP:
                if event.button == pygame.BUTTON_LEFT:
                    if self.conditions[INMENU]:
                        self.menu.click(event.pos, event.type, event.button)
            if event.type == pygame.VIDEORESIZE:
                if not self.conditions[FULLSCREEN]:
                    self.resize_window(event.w, event.h)