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))
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"]
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) )
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)
def render(self): self.app.screen.fill(pg_color(self.bg_color)) self.scene.render(self.camera)
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