pimoroni-pico/micropython/examples/tufty2040/awesome_game.py

198 lines
4.9 KiB
Python

import time
import random
from pimoroni import Button
from picographics import PicoGraphics, DISPLAY_TUFTY_2040
display = PicoGraphics(display=DISPLAY_TUFTY_2040)
WIDTH, HEIGHT = display.get_bounds()
# Load the spritsheets so we can flip between them
tilemap = bytearray(128 * 128)
open("s4m_ur4i-pirate-tilemap.rgb332", "rb").readinto(tilemap)
character = bytearray(128 * 128)
open("s4m_ur4i-pirate-characters.rgb332", "rb").readinto(character)
display.set_spritesheet(character)
# Buttons
button_a = Button(7, invert=False)
button_b = Button(8, invert=False)
button_c = Button(9, invert=False)
button_up = Button(22, invert=False)
button_down = Button(6, invert=False)
display.set_backlight(1.0)
display.set_pen(255)
display.clear()
class Player():
def __init__(self):
self.reset()
def reset(self):
self.x = 150
self.y = 180
self.w = 15
self.h = 30
self.speed = 10
self.is_alive = True
self.lives = 3
self.score = 0
self.moving = 0
def move(self, x, y):
if self.x + x > 0 - self.w and self.x + x < WIDTH - self.w:
self.x += x
self.y += y
def sprite(self):
display.set_spritesheet(character)
display.sprite(1, 1 if self.moving else 0, self.x, self.y, 4, 0)
class Treasure():
def __init__(self):
self.w = 16
self.h = 16
self.randomize()
def sprite(self):
if not self.enabled:
return
display.set_spritesheet(tilemap)
display.sprite(4, 2, self.x, self.y, 3, 0)
def randomize(self):
self.enabled = True
self.x = random.randint(15, WIDTH - 60)
self.y = HEIGHT - 50
class Block():
def __init__(self):
self.w = 16
self.h = 16
self.is_alive = True
self.randomize()
def move(self):
self.y += self.speed
def sprite(self):
display.set_spritesheet(character)
display.sprite(10, 8, self.x, self.y, 4, 0)
def randomize(self):
self.last_update = time.time()
self.x = random.randint(10, WIDTH - self.w - 10)
self.y = -self.h
self.speed = random.randint(4, 12)
class Game():
def __init__(self):
self.player = Player()
self.block = []
self.last_new_block = 0
self.treasure = Treasure()
self.last_treasure = 0
self.SKY = display.create_pen(72, 180, 224)
for i in range(5):
self.block.append(Block())
def reset(self):
for block in self.block:
block.randomize()
self.treasure.randomize()
self.player.reset()
def get_input(self):
if button_c.read():
self.player.move(self.player.speed, 0)
self.player.moving = 0
if button_a.read():
self.player.move(-self.player.speed, 0)
self.player.moving = 1
def background(self):
display.set_spritesheet(tilemap)
display.set_pen(self.SKY)
display.clear()
for i in range(WIDTH / 32):
display.sprite(1, 2, i * 32, 210, 4, 0)
def draw(self):
self.background()
for block in self.block:
block.sprite()
display.set_pen(255)
display.text("Score: " + str(self.player.score), 10, 10, 320, 2)
self.treasure.sprite()
display.set_pen(0)
self.player.sprite()
display.update()
time.sleep(0.01)
def check_collision(self, a, b):
return a.x + a.w >= b.x and a.x <= b.x + b.w and a.y + a.h >= b.y and a.y <= b.y + b.h
def update(self):
for block in self.block:
block.move()
if block.y > HEIGHT:
block.randomize()
if block.y + block.h >= self.player.y and self.check_collision(self.player, block):
block.randomize()
self.player.is_alive = False
if self.treasure.enabled:
if self.check_collision(self.player, self.treasure):
self.player.score += 1
self.treasure.enabled = False
self.last_treasure = time.time()
if time.time() - self.last_treasure > 2:
if not self.treasure.enabled:
self.treasure.randomize()
if self.player.lives == 0:
self.player.is_alive = False
game = Game()
while True:
game.background()
display.set_pen(255)
display.text("ARGH!", 40, 35, 200, 10)
display.text("Press B to Start", 80, 150, 180, 2)
display.update()
while not button_b.read():
pass
while game.player.is_alive:
game.get_input()
game.update()
game.draw()
game.background()
display.set_pen(255)
display.text("OOPS!", 40, 35, 200, 10)
display.text("Your score: " + str(game.player.score), 50, 150, 180, 2)
display.update()
while not button_b.read():
pass
game.reset()