Beispiel #1
0
class Gui(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        self.animator = Animator()

    def run(self):
        self.animator.logoAnimation()
        self.animator.welcome_frame()
        wifi = Wireless('wlan0')
        while wifi.getEssid() == "":
            waiting_frame()

        self.animator.screenUpdateMode(1)
        while True:
            self.animator.testing()
            time.sleep(5)
Beispiel #2
0
 def __init__(self):
     threading.Thread.__init__(self)
     self.animator = Animator()
Beispiel #3
0
    def load_animations(self):
        logger.info("Loading animations...")
        self.animator = Animator(self)
        logger.info(
            "Finished loading {} animations.".format(
                len(self.animator.animations)
            )
        )
        # for key, value in self.animator.animations.items():
        #     print(key)

        logger.info("Loading player animations...")
        img = self.load_single_texture("player_sheet")
        player_anim_grid = pyglet.image.ImageGrid(img, 8, 6)

        for seq in player_anim_grid:
            seq = center_image(seq)

        down_anim_seq = reversed(player_anim_grid[42:48])
        down_static = player_anim_grid[(7, 4)]
        left_anim_seq = reversed(player_anim_grid[36:42])
        left_static = player_anim_grid[(6, 4)]
        right_anim_seq = reversed(player_anim_grid[30:36])
        right_static = player_anim_grid[(5, 4)]
        up_anim_seq = reversed(player_anim_grid[24:30])
        up_static = player_anim_grid[(4, 4)]
        ld_anim_seq = reversed(player_anim_grid[18:24])
        ld_static = player_anim_grid[(3, 4)]
        rd_anim_seq = reversed(player_anim_grid[12:18])
        rd_static = player_anim_grid[(2, 4)]
        lu_anim_seq = reversed(player_anim_grid[6:12])
        lu_static = player_anim_grid[(1, 4)]
        ru_anim_seq = reversed(player_anim_grid[0:6])
        ru_static = player_anim_grid[(0, 4)]
        down_anim = pyglet.image.Animation.from_image_sequence(
            down_anim_seq, 0.2, True
        )
        left_anim = pyglet.image.Animation.from_image_sequence(
            left_anim_seq, 0.2, True
        )
        right_anim = pyglet.image.Animation.from_image_sequence(
            right_anim_seq, 0.2, True
        )
        up_anim = pyglet.image.Animation.from_image_sequence(
            up_anim_seq, 0.2, True
        )
        ld_anim = pyglet.image.Animation.from_image_sequence(
            ld_anim_seq, 0.2, True
        )
        rd_anim = pyglet.image.Animation.from_image_sequence(
            rd_anim_seq, 0.2, True
        )
        lu_anim = pyglet.image.Animation.from_image_sequence(
            lu_anim_seq, 0.2, True
        )
        ru_anim = pyglet.image.Animation.from_image_sequence(
            ru_anim_seq, 0.2, True
        )
        self.player_anim_grid = dict(
            down=down_anim,
            left=left_anim,
            right=right_anim,
            up=up_anim,
            leftdown=ld_anim,
            rightdown=rd_anim,
            leftup=lu_anim,
            rightup=ru_anim
        )
        self.player_static_img = dict(
            down=down_static,
            left=left_static,
            right=right_static,
            up=up_static,
            leftdown=ld_static,
            rightdown=rd_static,
            leftup=lu_static,
            rightup=ru_static
        )
        logger.info("Finished loading player animations.")
Beispiel #4
0
class GameWindow(pyglet.window.Window):  # Main game window

    def __init__(self):
        # Load config from file
        self.cfg = load_cfg("Screen")
        # Template for multisampling
        gl_template = pyglet.gl.Config(
            sample_buffers=1,
            samples=2,
            alpha_size=8
            )
        try:  # to enable multisampling
            gl_config = screen.get_best_config(gl_template)
        except pyglet.window.NoSuchConfigException:
            gl_template = pyglet.gl.Config(alpha_size=8)
            gl_config = screen.get_best_config(gl_template)
        logger.debug("Creating OpenGL context")
        gl_context = gl_config.create_context(None)
        logger.debug("Subclassing pyglet window, setting parameters.")
        super(GameWindow, self).__init__(
            context=gl_context,
            config=gl_config,
            resizable=False,
            vsync=self.cfg["vsync"],
            fullscreen=self.cfg["fullscreen"]
            )
        if not self.fullscreen:
            logger.debug(
                "Not fullscreen, setting screen resolution to {0}x{1}.".format(
                    self.cfg["width"], self.cfg["height"]
                )
            )
            logger.debug("Centering window on screen.")
            self.set_location(
                (screen.width - self.cfg["width"]) // 2,
                (screen.height - self.cfg["height"]) // 2
            )
            self.width, self.height = self.cfg["width"], self.cfg["height"]

        # pyglet.gl.glClearDepth(1.0)
        # pyglet.gl.glViewport(0, 0, self.width, self.height)
        # pyglet.gl.glMatrixMode(pyglet.gl.GL_PROJECTION)
        # pyglet.gl.glLoadIdentity()
        # pyglet.gl.glOrtho(0, self.width, 0, self.height, 0.0, 1000)
        # pyglet.gl.glMatrixMode(pyglet.gl.GL_MODELVIEW)

        self.debug = False
        self.logger = logger
        self.fps_display = pyglet.clock.ClockDisplay()

        self.mouse_pos = (0, 0)
        self.selected_object = None

        logger.debug("Loading textures from folder \"{0}\".".format(RES_PATH))
        self.load_textures()
        self.load_animations()
        self.fg_group = pyglet.graphics.OrderedGroup(2)
        self.mid_group = pyglet.graphics.OrderedGroup(1)
        self.bg_group = pyglet.graphics.OrderedGroup(0)
        self.batches = OrderedDict()
        self.batches["gui0"] = pyglet.graphics.Batch()
        self.batches["gui1"] = pyglet.graphics.Batch()
        self.batches["gui2"] = pyglet.graphics.Batch()
        self.batches["gui3"] = pyglet.graphics.Batch()
        self.flush()

        self.offset_x, self.offset_y = 0, 0

        # GUI
        self.build_ui()

        self.load_map_files()

        self.game = Game(self)
        self.game.newgame(self.selected_mapfile)

        self.update_offset()

    def flush(self):
        self.batches["dungeon"] = pyglet.graphics.Batch()
        self.batches["dungeon_overlay"] = pyglet.graphics.Batch()
        self.batches["creatures"] = pyglet.graphics.Batch()
        self.batches["player"] = pyglet.graphics.Batch()
        self.batches["projectiles"] = pyglet.graphics.Batch()

    def load_textures(self):
        logger.info("Loading textures...")
        goblin_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'crappy_goblin.png'))
        )
        player_body_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'player_body.png'))
        )
        player_body_glow_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'player_body_glow.png'))
        )
        player_hand_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'player_hands.png'))
        )
        player_hand_glow_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'player_hands_glow.png'))
        )
        button_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'button.png'))
        )
        button_down_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'button_down.png'))
        )
        fireball_s_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'fireball_s.png'))
        )
        fireball_l_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'fireball_l.png'))
        )
        bolt_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'white_bolt.png'))
        )
        rc_img = center_image(
            pyglet.image.load(os.path.join(RES_PATH, 'red_circle.png'))
        )
        cursor_default_img = pyglet.image.load(
            os.path.join(RES_PATH, "cursors", "default.png")
        )
        cursor_projectile_img = pyglet.image.load(
            os.path.join(RES_PATH, "cursors", "projectile.png")
        )

        self.textures = dict(
            goblin=goblin_img,
            player_body=player_body_img,
            player_body_glow=player_body_glow_img,
            player_hand=player_hand_img,
            player_hand_glow=player_hand_glow_img,
            button=button_img,
            button_down=button_down_img,
            fireball1=fireball_s_img,
            fireball2=fireball_l_img,
            bolt=bolt_img,
            redcircle=rc_img,
        )

        self.reticules = dict(
            default=pyglet.window.ImageMouseCursor(cursor_default_img, 2, 32),
            projectile=pyglet.window.ImageMouseCursor(
                cursor_projectile_img, 20, 20
            ),
        )

        logger.info(
            "Done, {} textures loaded.".format(len(self.textures))
        )

    def load_single_texture(self, name, center=False):
        if center:
            return center_image(
                pyglet.image.load(os.path.join(RES_PATH, name + '.png'))
            )
        else:
            return pyglet.image.load(os.path.join(RES_PATH, name + '.png'))

    def get_texture(self, name):
        try:
            return self.textures[name]
        except KeyError:
            logger.debug("Texture \"{0}\" not found".format(name))
            return None

    # def on_resize(self, width, height):
    #     # Based on the default with more useful clipping planes
    #     pyglet.gl.glViewport(0, 0, width, height)
    #     pyglet.gl.glMatrixMode(pyglet.gl.GL_PROJECTION)
    #     pyglet.gl.glLoadIdentity()
    #     pyglet.gl.glOrtho(0, width, 0, height, 0.0, 1000)
    #     pyglet.gl.glMatrixMode(pyglet.gl.GL_MODELVIEW)

    def load_animations(self):
        logger.info("Loading animations...")
        self.animator = Animator(self)
        logger.info(
            "Finished loading {} animations.".format(
                len(self.animator.animations)
            )
        )
        # for key, value in self.animator.animations.items():
        #     print(key)

        logger.info("Loading player animations...")
        img = self.load_single_texture("player_sheet")
        player_anim_grid = pyglet.image.ImageGrid(img, 8, 6)

        for seq in player_anim_grid:
            seq = center_image(seq)

        down_anim_seq = reversed(player_anim_grid[42:48])
        down_static = player_anim_grid[(7, 4)]
        left_anim_seq = reversed(player_anim_grid[36:42])
        left_static = player_anim_grid[(6, 4)]
        right_anim_seq = reversed(player_anim_grid[30:36])
        right_static = player_anim_grid[(5, 4)]
        up_anim_seq = reversed(player_anim_grid[24:30])
        up_static = player_anim_grid[(4, 4)]
        ld_anim_seq = reversed(player_anim_grid[18:24])
        ld_static = player_anim_grid[(3, 4)]
        rd_anim_seq = reversed(player_anim_grid[12:18])
        rd_static = player_anim_grid[(2, 4)]
        lu_anim_seq = reversed(player_anim_grid[6:12])
        lu_static = player_anim_grid[(1, 4)]
        ru_anim_seq = reversed(player_anim_grid[0:6])
        ru_static = player_anim_grid[(0, 4)]
        down_anim = pyglet.image.Animation.from_image_sequence(
            down_anim_seq, 0.2, True
        )
        left_anim = pyglet.image.Animation.from_image_sequence(
            left_anim_seq, 0.2, True
        )
        right_anim = pyglet.image.Animation.from_image_sequence(
            right_anim_seq, 0.2, True
        )
        up_anim = pyglet.image.Animation.from_image_sequence(
            up_anim_seq, 0.2, True
        )
        ld_anim = pyglet.image.Animation.from_image_sequence(
            ld_anim_seq, 0.2, True
        )
        rd_anim = pyglet.image.Animation.from_image_sequence(
            rd_anim_seq, 0.2, True
        )
        lu_anim = pyglet.image.Animation.from_image_sequence(
            lu_anim_seq, 0.2, True
        )
        ru_anim = pyglet.image.Animation.from_image_sequence(
            ru_anim_seq, 0.2, True
        )
        self.player_anim_grid = dict(
            down=down_anim,
            left=left_anim,
            right=right_anim,
            up=up_anim,
            leftdown=ld_anim,
            rightdown=rd_anim,
            leftup=lu_anim,
            rightup=ru_anim
        )
        self.player_static_img = dict(
            down=down_static,
            left=left_static,
            right=right_static,
            up=up_static,
            leftdown=ld_static,
            rightdown=rd_static,
            leftup=lu_static,
            rightup=ru_static
        )
        logger.info("Finished loading player animations.")

    def get_anim(self, name):
        try:
            return self.animator.get_anim(name)
        except KeyError:
            logger.error("No animation by name {} found".format(name))

    def load_map_files(self):
        self.maplist = sorted(glob.glob(os.path.join(RES_PATH, '*.tmx')))
        try:
            self.selected_mapfile = self.maplist[0]
        except IndexError:
            logger.error("No map files found!")
            self.selected_mapfile = None

    def set_reticule(self, reticule):
        if reticule == "projectile":
            self.set_mouse_cursor(self.reticules["projectile"])
        else:
            self.set_mouse_cursor(self.reticules["default"])

    def build_ui(self):
        self.ui = UI(self)
        self.ui.add_button(
            self.width - 32, self.height - 16, text="Exit",
            cb=pyglet.app.exit
        )
        self.ui.add_bar(
            self.width - 100, 50,
            text="Health", width=200, height=20,
            color="red", shows="hp"
        )
        self.ui.add_bar(
            self.width - 100, 30,
            text="Stamina", width=200, height=20,
            color="green", shows="sta"
        )
        self.ui.add_bar(
            self.width - 100, 10,
            text="Mana", width=200, height=20,
            color="blue", shows="mp"
        )
        pyglet.clock.schedule_interval(self.ui.update, 1.0 / FPS)

    def update_offset(self, dx=False, dy=False):
        self.offset_x += dx
        self.offset_y += dy
        self.update_display_dungeon()

    def set_offset(self, x, y):
        self.offset_x, self.offset_y = x, y
        self.update_display_dungeon()

    def get_windowpos(self, x, y, check=False, tol=0, precise=False):
        if check:
            if (
                (x + self.offset_x > self.width + tol) or
                (x + self.offset_x < 0 - tol)
            ):
                return False
            if (
                (y + self.offset_y > self.height + tol) or
                (y + self.offset_y < 0 - tol)
            ):
                return False

        if precise:
            return x + self.offset_x, y + self.offset_y
        else:
            return int(x + self.offset_x), int(y + self.offset_y)

    def grid_to_window(self, x, y):
        return x * 32, y * 32

    def get_gamepos(self, x, y, check=False, tol=0):
        if check:
            if (
                (x - self.offset_x > self.width + tol) or
                (x - self.offset_x < 0 - tol)
            ):
                return False
            if (
                (y - self.offset_y > self.height + tol) or
                (y - self.offset_y < 0 - tol)
            ):
                return False

        return int(x - self.offset_x), int(y - self.offset_y)

    def on_mouse_press(self, x, y, button, modifiers):
        p = self.game.player
        gamepos = self.get_gamepos(x, y)
        if button == 1:
            if self.ui.check(x, y):  # Checks if mouse press is on ui elements
                logger.debug("Button hit, not registering presses on grid.")
            elif p:   # if its not, handle presses as usual
                if p.actions["targeting"]:
                    if (
                        p.actions["targeting"].use(
                            target=self.get_gamepos(x, y)
                        )
                    ):
                        p.clear_ability_target()
                elif len(self.game.enemies) > 0:
                    for e in self.game.spatial_hash.get_objects_from_point(
                        gamepos, radius=32, type=Enemy
                    ):
                        if get_dist(e.x, e.y, *gamepos) <= 24:
                            p.set_target(e)
                            break
                    else:
                        p.clear_target()

        if button == 4:
            if self.ui.check(x, y, dry=True):
                pass
            elif p:
                p.clear_ability_target()
                if len(self.game.enemies) > 0:
                    for e in self.game.spatial_hash.get_objects_from_point(
                        gamepos, radius=32, type=Enemy
                    ):
                        if get_dist(e.x, e.y, *gamepos) <= 24:
                            p.auto_attack_target = e
                            p.set_target(e)
                            break
                    else:
                        p.clear_target()

    def on_mouse_drag(self, x, y, dx, dy, button, modifiers):
        pass

    def on_mouse_release(self, x, y, button, modifiers):
        if button == 1:
            if self.ui.check(x, y, press=False):
                pass

    def on_mouse_motion(self, x, y, dx, dy):
        self.mouse_pos = (x, y)

    def on_key_press(self, symbol, modifiers):
        k = pyglet.window.key
        if symbol == k.ESCAPE:
            logger.info("Exiting...")
            pyglet.app.exit()
        elif symbol == k.F12:
            self.debug = not self.debug
        elif symbol == k.F5:
            self.game.newgame(self.selected_mapfile)
        elif symbol == k.F2:
            self.game.add_enemy(*self.get_gamepos(*self.mouse_pos))
        if self.game.player:
            if symbol == k.W:
                self.game.player.move_dir["up"] = True
            elif symbol == k.A:
                self.game.player.move_dir["left"] = True
            elif symbol == k.S:
                self.game.player.move_dir["down"] = True
            elif symbol == k.D:
                self.game.player.move_dir["right"] = True

            if symbol == k.F1:
                for i in range(50):
                    self.game.player.levelup(attribute="str")
                    self.game.player.levelup(attribute="agi")
                    self.game.player.levelup(attribute="int")
            if symbol == k.F3:
                self.game.player.die()

            if symbol == k.LSHIFT:
                self.game.player.actions["sprint"] = True

            # Cast abilitites
            target = self.get_gamepos(*self.mouse_pos)
            if symbol == k._1:
                self.game.player.use_ability(1, target=target)
            if symbol == k._2:
                self.game.player.use_ability(2, target=target)
            if symbol == k._3:
                self.game.player.use_ability(3, target=target)
            if symbol == k._4:
                self.game.player.use_ability(4, target=target)

            # Level up attributes
            if symbol == k.EXCLAMATION:
                self.game.player.levelup(attribute="str")
            if symbol == k.DOUBLEQUOTE:
                self.game.player.levelup(attribute="agi")
            if symbol == k.HASH:
                self.game.player.levelup(attribute="int")
        else:
            if symbol == k.F3:
                self.game.spawn_player(
                    self.grid_to_window(*self.game.dungeon.startroom.center)
                )

    def on_key_release(self, symbol, modifiers):
        k = pyglet.window.key
        if self.game.player:
            if symbol == k.W:
                self.game.player.move_dir["up"] = False
            elif symbol == k.A:
                self.game.player.move_dir["left"] = False
            elif symbol == k.S:
                self.game.player.move_dir["down"] = False
            elif symbol == k.D:
                self.game.player.move_dir["right"] = False
            if symbol == k.LSHIFT:
                self.game.player.actions["sprint"] = False

    def update_display_dungeon(self):
        x, y = int(self.offset_x), int(self.offset_y)
        self.game.dungeon_sprite.x = x
        self.game.dungeon_sprite.y = y
        self.game.dungeon_overlay_sprite.x = x
        self.game.dungeon_overlay_sprite.y = y

    def update(self, dt):
        if self.game:
            self.game.update(dt)

    def render(self, dt):
        pyglet.gl.glClearColor(*lookup_color("dgrey", gl=True))
        self.clear()
        pyglet.gl.glEnable(pyglet.gl.GL_DEPTH_TEST)
        self.batches["dungeon"].draw()
        self.batches["gui0"].draw()
        self.batches["creatures"].draw()

        self.batches["player"].draw()
        self.batches["projectiles"].draw()
        if hasattr(self, "animator"):
            self.animator.render()
        self.batches["dungeon_overlay"].draw()

        # enemy_count = pyglet.text.Label(
        #     text=str(len(self.game.enemies)), font_name=None, font_size=18,
        #     x=50, y=400, anchor_x="left", anchor_y="top",
        #     color=lookup_color("black")
        # )
        # enemy_count.draw()
        self.ui.draw()