Esempio n. 1
0
    def __init__(self, app, state=None):

        super().__init__(app, state, self)

        self.scene = Scene(self.app, self)
        self.terminal = self.scene.add(Terminal(self.app, self.scene))
        self.bigterm = self.scene.add(Terminal(self.app, self.scene, 32))
        self.camera = self.scene.add(Camera(app, self.scene, self.app.size))
        self.scene.ground_color = "darkgreen"
        self.time = 0

        rows = 8
        backdrop_h = 150
        for i in range(rows):
            h = int(backdrop_h) // rows
            y = h * i
            backdrop = pygame.Surface((self.app.size.x, h))
            interp = i / rows
            interp_inv = 1 - i / rows
            backdrop.set_alpha(255 * interp_inv * 0.2)
            backdrop.fill(pg_color(ncolor("white") * interp_inv))
            self.scene.on_render += lambda _, y=y, backdrop=backdrop: self.app.screen.blit(
                backdrop, (0, y))

        rows = 8
        backdrop_h = 100
        for i in range(rows):
            h = int(backdrop_h) // rows
            y = h * i
            backdrop = pygame.Surface((self.app.size.x, h))
            interp = i / rows
            interp_inv = 1 - i / rows
            backdrop.set_alpha(255 * interp_inv * 0.1)
            backdrop.fill(pg_color(ncolor("white") * interp_inv))
            self.scene.on_render += lambda _, y=y, backdrop=backdrop: self.app.screen.blit(
                backdrop, (0, y))

        backdrop_h = int(24)
        rows = 4
        for i in range(rows, 0, -1):
            h = int(backdrop_h) // rows
            y = h * i
            backdrop = pygame.Surface((self.app.size.x, h))
            interp = i / rows
            interp_inv = 1 - i / rows
            backdrop.set_alpha(200 * interp_inv)
            backdrop.fill((0))
            # backdrop.fill(pg_color(ncolor('black')*interp_inv))
            self.scene.on_render += lambda _, y=y, backdrop=backdrop: self.app.screen.blit(
                backdrop, (0, self.app.size.y - y))
Esempio n. 2
0
    def __init__(self, app, scene, pos: vec3, z_vel: float, **kwargs):

        super().__init__(app,
                         scene,
                         None,
                         position=pos,
                         velocity=Z * 1000,
                         **kwargs)

        self._surface = None
        gcolor = self.scene.ground_color
        if gcolor:

            if "ROCK" not in self.app.cache:
                # self.color = ncolor("white")
                self._surface = pygame.Surface(ivec2(4))
                # self.color = ncolor("white")
                self._surface.fill(
                    pg_color(glm.mix(ncolor("black"), gcolor, 0.4)))
                # self._surface.fill((0,0,0))

                self.app.cache["ROCK"] = self._surface

                # self.velocity = Z * 10000 + z_vel
            else:
                self._surface = self.app.cache["ROCK"]
Esempio n. 3
0
    def __init__(self, app, state=None):

        super().__init__(app, state)

        self.scene = Scene(self.app, self)
        self.gui = Scene(self.app, self)
        self.slots = SlotList()
        self.paused = False

        # self.scene.add(ButtaBomber(app, self.scene, vec3(0, 0, -3000)))
        # self.scene.add(Powerup(app, self.scene, 'star', position=vec3(0, 0, -3000)))

        # create terminal first since player init() writes to it
        self.terminal = self.gui.add(Terminal(self.app, self.scene))

        self.app.inputs = self.build_inputs()
        self.camera = self.scene.add(Camera(app, self.scene, self.app.size))
        stats = self.stats = self.app.data["stats"] = self.app.data.get(
            "stats", Stats()
        )
        self.level = stats.level
        self.player = self.scene.add(Player(app, self.scene, level=self.level))

        # self.scripts += self.score_screen

        # self.camera.slots.append(
        #     self.player.on_move.connect(lambda: self.camera.update_pos(self.player))
        # )

        self.debug = False
        self.slots += [
            app.inputs["debug"].on_press(lambda _: self.debug_mode(True)),
            app.inputs["debug"].on_release(lambda _: self.debug_mode(False)),
        ]
        self.slots += [
            app.inputs["pause"].on_press(self.toggle_pause),
        ]

        self.time = 0

        # score backdrop
        backdrop_h = int(24 * 1.8)

        # draw a score backdrop
        rows = 8
        for i in range(rows):
            h = int(backdrop_h) // rows
            y = h * i
            backdrop = pygame.Surface((self.app.size.x, h))
            interp = i / rows
            interp_inv = 1 - i / rows
            backdrop.set_alpha(255 * interp * 0.4)
            # backdrop.fill((0))
            backdrop.fill(pg_color(ncolor("white") * interp_inv))
            self.scene.on_render += lambda _, y=y, backdrop=backdrop: self.app.screen.blit(
                backdrop, (0, y)
            )
Esempio n. 4
0
    def __init__(self, app, scene, pos: vec3, z_vel: float, **kwargs):

        super().__init__(app, scene, None, position=pos, **kwargs)

        filled = "RAIN" in self.app.cache

        self._surface = self.app.load(
            "RAIN", lambda: pygame.Surface(ivec2(2, 24)).convert())
        if not filled:
            self._surface.fill(pg_color("lightgray"))

        self.velocity = vec3(0, -1000, 1000 + z_vel)
Esempio n. 5
0
    def render(self):

        self.app.screen.fill(pg_color(self.bg_color))
        self.scene.render(self.camera)
Esempio n. 6
0
    def write(
            self,
            text,
            pos=(0, 0),
            color=vec4(1, 1, 1, 0),
            offset=(0, 0),
            align=-1,
            length=0,
    ):

        if isinstance(pos, (int, float)):
            pos = ivec2(0, pos)
        else:
            # if decimal number, proportional to terminal size
            # if isinstance(pos[0], float):
            #     if  0 < pos[0] < 1 or 0 < pos[0] < 1:
            #         pos = ivec2(pos[0] * self.size[0], pos[1] * self.size[1])
            #     else:
            #         pos = ivec2(pos[0], pos[1])
            # else:
            pos = ivec2(pos[0], pos[1])

        length = max(length, len(text))

        # Do alignment (-1, 0, 1)
        if align == 0:  # center
            return self.write(text, (pos[0] - length / 2, pos[1]), color,
                              offset, -1, length)
        elif align == 1:  # right
            return self.write(text, (pos[0] + length, pos[1]), color, offset,
                              -1, length)

        assert align == -1  # left

        if "\n" in text:
            lines = text.split("\n")
            for i, line in enumerate(lines):
                self.write(text, ivec2(pos[0], pos[1] + i), color, offset,
                           align, length)
            return

        if len(text) > 1:  # write more than 1 char? write chars 1 by 1
            for i in range(len(text)):
                self.write(text[i], (pos[0] + i, pos[1]), color, offset, -1,
                           length)
            return

        # color string name
        if color is not None:
            color = pg_color(color)

        # note that this allows negative positioning
        try:
            self.chars[pos[1]][pos[0]]
        except IndexError:
            # outside of screen
            # print(pos)
            return

        self.chars[pos[1]][pos[0]] = Char(
            text,
            [
                self.font.render(text, True, color),
                self.font.render(text, True, self.shadow_color),
                self.font.render(text, True, self.shadow2_color),
            ],
            ivec2(*pos),
            color,
            ivec2(*offset),
        )
        self.dirty_line[pos[1]] = True
        self.dirty = True