def render(self, timestamp, canvas): if not self.redraw: return False self.redraw = False clear(canvas, (128, 128, 128)) puttextblock(canvas, 0, 4, canvas.width, self.TITLE, font_color=(255, 0, 0), font=self.font, shadow_color=(0, 0, 0), align='center') for i, value in enumerate(self.OPTIONS): puttextblock(canvas, 0, int((1.5 + i) * (self.font.line_height + 1)) + 4, canvas.width, value, font_color=(255, 255, 0) if i == self.index else (255, 0, 0), font=self.font, shadow_color=(70, 0, 0), align='center') return True
def render(self, timestamp, canvas): clear(canvas, 0x4e4a4e) for item in self.items: item.render(timestamp, canvas) puttextblock(canvas, 0, 1, canvas.width, '> HERO <', font_color=0xdeeed6, font=self.FONT, align='center') return True
def render(self, timestamp, canvas): self.offset -= 1 self.redraw = False clear(canvas, (100, 100, 100)) puttextblock(canvas, 0, self.offset, canvas.width, self.text, font_color=(255, 0, 0), font=self.font, shadow_color=(70, 0, 0), align='center') return True
import time from random import randint from engine.keyboard import Keyboard, Keys from engine.screen import SubPixelScreen from engine.drawing import draw with SubPixelScreen(width=63, height=63) as screen, Keyboard() as keyboard: t0 = time.time() count = 0 draw.clear(screen.canvas, 0xff0000) draw.line(screen.canvas, 0, 0, screen.width - 1, screen.height - 1, 0x00ff00) screen.sync() keyboard.getch() while True: if keyboard.getch(False) == Keys.ESC: break x0 = randint(0, screen.width - 1) x1 = randint(0, screen.width - 1) y0 = randint(0, screen.height - 1) y1 = randint(0, screen.height - 1) color = randint(0, 0xffffff) draw.line(screen.canvas, x0, y0, x1, y1, color) screen.sync() count += 1 t1 = time.time()
def interact(self, event) -> bool: if self.states: return False key = event.key pos_x, pos_y, pos_z, ang, item_pos = self.prev_state show_item = item_pos > 0 if key in (Keys.UP, Keys.DOWN, 'x'): if key == 'x' and not (round(2 * pos_x) == 1 and round( 2 * pos_z) == 5 and self.inventory.current == 'sword' and self.env.dragon_hp is not None): return True mult = -1 if key == Keys.DOWN else 1 new_pos_x = round(2 * pos_x + mult * math.sin(ang) * self.STEP_LENGTH) new_pos_z = round(2 * pos_z + mult * math.cos(ang) * self.STEP_LENGTH) cell = LEVEL[new_pos_z][new_pos_x] if key == 'x': if self.inventory.current == 'sword': f = [0.1, 0.2, 0.25, 0.2, 0.1, 0.0] self.env.dragon_hp -= 1 self.sound_effects.play('media/sound/sword-unsheathe.ogg') else: return True elif (cell in (' ', 'd') or (cell == 'X' and not show_item) or (cell == 'D' and self.env.door_open)) and ( self.env.dragon_hp is None or new_pos_x != 1 or new_pos_z != 6): f = [(i + 1) / self.FPT for i in range(self.FPT)] self.sound_effects.play('media/sound/interface2.ogg') else: f = [0.1, 0.25, 0.35, 0.20, 0.1, 0.0] if mult == -1: f = [0.5 * i for i in f] self.sound_effects.play('media/sound/interface1.ogg') for m in f: self.states.append( (pos_x + mult * math.sin(ang) * self.STEP_LENGTH * m, pos_y, pos_z + mult * math.cos(ang) * self.STEP_LENGTH * m, ang, item_pos)) if self.env.dragon_hp is not None and self.env.dragon_hp <= 0: self.scene._objects.remove(DRAGON) self.env.dragon_hp = None self.sound_effects.play('media/sound/random1.ogg') if key in (Keys.LEFT, Keys.RIGHT): # Turn left / right mult = 1 if key == Keys.LEFT else -1 for i in range(self.FPT): self.states.append( (pos_x, pos_y, pos_z, (ang + mult * math.pi / 2 * (i + 1) / self.FPT) % (2 * math.pi), item_pos)) if key == Keys.SPACE: # Jumping for j in [-0.2, -0.3, -0.35, -0.3, -0.2, 0.0]: self.states.append((pos_x, pos_y + j, pos_z, ang, item_pos)) if key in ('n', 'm'): # Ascend / Descend mult = 1 if key == 'n' else -1 for i in range(self.FPT): self.states.append( (pos_x, pos_y + 0.45 * mult * (i + 1) / self.FPT, pos_z, ang, item_pos)) if key in '<>' and item_pos > 0: # Switch active inventory item self.inventory.prev() if key == '<' else self.inventory.next() self.states.append((pos_x, pos_y, pos_z, ang, item_pos)) if key == '?': if show_item: for i in range(self.FPT): self.states.append( (pos_x, pos_y, pos_z, ang, 1 - (i + 1) / self.FPT)) else: for i in range(self.FPT): self.states.append( (pos_x, pos_y, pos_z, ang, (i + 1) / self.FPT)) if key == 'e': new_pos_x = round(2 * pos_x + math.sin(ang) * self.STEP_LENGTH) new_pos_z = round(2 * pos_z + math.cos(ang) * self.STEP_LENGTH) if not show_item: if LEVEL[new_pos_z][ new_pos_x] == 'D' and not self.env.door_open: clear(self.overlay, Color4f(0, 0, 0, 0)) puttextblock(self.overlay, 6, 10, 63, "Locked!!!", font_color=(255, 255, 255), font=FONT, shadow_color=(0, 0, 0)) self.overlay_count = 50 if round(2 * pos_x) == 3 and round( 2 * pos_z) == 9 and not self.env.has_key: TEXTURES['c'].texture = ImageTexture(self.tileset[45 * 64 + 45]) self.env.has_key = True clear(self.overlay, Color4f(0, 0, 0, 0)) puttextblock(self.overlay, 6, 10, 63, "You found", font_color=(255, 255, 255), font=FONT, shadow_color=(0, 0, 0)) puttextblock(self.overlay, 6, 22, 63, " Gold Key", font_color=(255, 255, 0), font=FONT, shadow_color=(0, 0, 0)) self.overlay_count = 50 self.inventory.items.append('gold_key') elif show_item and self.inventory.current == 'gold_key': if LEVEL[new_pos_z][new_pos_x] == 'D': if self.env.door_open: TEXTURES['D'].texture = ImageTexture( self.tileset[11 * 64 + 32 - 5 - 4]) else: TEXTURES['D'].texture = ImageTexture( self.tileset[11 * 64 + 32 - 5]) self.env.door_open = not self.env.door_open self.sound_effects.play('media/sound/door.ogg') elif show_item and self.inventory.current == 'shovel': if self.env.tresure_pos and abs( self.env.tresure_pos[0] - pos_x) < 0.01 and abs( self.env.tresure_pos[1] - pos_z) < 0.01: clear(self.overlay, Color4f(0, 0, 0, 0)) puttextblock(self.overlay, 6, 10, 63, "You found", font_color=(255, 255, 255), font=FONT, shadow_color=(0, 0, 0)) puttextblock(self.overlay, 6, 22, 63, "Long Sword", font_color=(255, 255, 0), font=FONT, shadow_color=(0, 0, 0)) self.overlay_count = 50 self.inventory.items.append('sword') self.env.tresure_pos = None else: clear(self.overlay, Color4f(0, 0, 0, 0)) puttextblock(self.overlay, 6, 10, 63, "You dig!!!", font_color=(255, 255, 255), font=FONT, shadow_color=(0, 0, 0)) self.overlay_count = 50 self.states.append(self.prev_state) if key == Keys.ESC: self.loop.exit() return True