miniworlds#
miniworlds is a game engine written in Python and Pygame, designed for students to create 2D mini-worlds and games.
Creating your first games with miniworlds is simple and fun.
Examples
Two actors controlled by keyboard
Two actors that are controlled using the keyboard.
from miniworlds import World, Actor
world = World()
world.add_background("images/grass.jpg")
player = Actor((90,90))
player.add_costume("images/player.png")
player.costume.orientation = -90
@player.register
def on_key_down_w(self):
player.y = player.y - 1
player2 = Actor((180,180))
player2.add_costume("images/player.png")
player2.costume.orientation = -90
@player2.register
def on_key_pressed_s(self):
player2.y = player2.y - 1
world.run()
Example: Two actors#
Skeetshooting
A randomly placed target can be “shot” with the mouse.
from miniworlds import World, Actor, Number
import random
world = World(400, 400)
world.add_background("images/skeetshooting.png")
target = Actor((100, 100))
target.add_costume("images/target-red.png")
target.orientation = -90
target.size = (80,80)
cooldown = 5
hits = Number((20,20), 0)
@target.register
def act(self):
global cooldown
if self.world.frame % 50 == 0:
target.position = (random.randint(0, 400), random.randint(0, 400))
cooldown -= 1
@target.register
def on_clicked_left(self, position):
global cooldown, hits
if cooldown < 0:
hits += 1
cooldown = 10
world.run()
Example: Skeetshooting#
Aircrafts
Classic game where you control an aircraft, avoid and shoot enemies.
from miniworlds import World, Actor, Circle, Text
import random
world = World(300, 600)
world.add_background("images/clouds.png")
world.background.is_scaled = False
aircraft = Actor((150, 500))
aircraft.add_costume("images/ship.png")
@aircraft.register
def on_setup(self):
"""The downtime specifies the number of frames until the next shot can be fired.
If downtime > 100 a shot can be fired (@see on_key down of aircraft)
"""
self.downtime = 0
@aircraft.register
def act(self):
"""Increment the downtime every frame per 1"""
self.downtime += 1
@aircraft.register
def on_key_pressed(self, keys):
"""Move aircraft left/right with a, d keys.
"""
if "a" in keys:
aircraft.x -= 1
elif "d" in keys:
aircraft.x += 1
@aircraft.register
def on_key_down(self, keys):
"""Shoot, if downtime > 100
"""
if " " in keys and self.downtime > 100:
position = aircraft.center
position = (aircraft.center[0], aircraft.center[1] - 20)
bullet = Circle(position)
self.downtime = 0
@bullet.register
def act(self):
self.y = self.y - 1
@bullet.register
def on_detecting_actor(self, other):
if other in self.world.enemies:
other.remove()
self.remove()
@world.register
def on_setup(self):
self.enemies = []
@world.register
def act(self):
if self.frame % 120 == 0:
enemy = Actor((random.randint(30, 270), 50))
enemy.add_costume("images/enemy.png")
enemy.orientation = 180
self.enemies.append(enemy)
@enemy.register
def act(self):
self.y = self.y + 1
@enemy.register
def on_detecting_actor(self, other):
""" If enemy detects the aircraft, the game ends.
"""
if other == aircraft:
self.world.stop()
aircraft.remove()
t = Text((150, 300), "GAME OVER")
t.color = (0, 0, 0)
for enemy in self.world.enemies:
enemy.remove()
self.remove()
world.run()
Example: Skeetshooting#
RPG Template with console and sidebar
from miniworlds import TiledWorld, Toolbar, Console, Actor, Button, Label, PagerHorizontal
world = TiledWorld()
world.columns = 8
world.rows = 8
world.tile_size = 24
world.camera.world_size_x = 16
world.camera.world_size_y = 16
world.add_background((255, 255, 255, 255))
toolbar = Toolbar()
@toolbar.register
def on_setup(self):
self.add_background("images/bg")
self.background.set_mode(mode="textured", texture_size=(200, 200))
world.toolbar = world.camera.add_right(toolbar, size=180)
console = Console()
world.console = world.camera.add_bottom(console, size=100)
world.console.newline("You enter a new world")
pager = PagerHorizontal(console)
world.camera.add_bottom(pager, size=60)
def create_grass(pos):
g = Actor(pos)
g.add_costume("images/grass2.png")
g.static = True
g.layer = 0
def create_wall(pos, walls):
w = Actor(pos)
w.add_costume("images/wall.png")
w.static = True
w.is_blocking = True
walls.append(w)
@world.register
def on_setup(self):
for i in range(world.rows):
for j in range(world.columns):
create_grass((j, i))
self.walls = []
create_wall((0, 4), self.walls)
create_wall((1, 4), self.walls)
create_wall((2, 4), self.walls)
create_wall((3, 4), self.walls)
create_wall((4, 4), self.walls)
create_wall((5, 4), self.walls)
create_wall((6, 4), self.walls)
create_wall((6, 0), self.walls)
create_wall((6, 1), self.walls)
create_wall((6, 3), self.walls)
torch = Actor((10, 4))
@torch.register
def on_setup(self):
torch.layer = 2
torch.add_costume("images/torch.png")
fireplace = Actor((10, 12))
fireplace.layer = 2
@fireplace.register
def on_setup(self):
self.costume_not_burned = fireplace.add_costume("images/fireplace_0.png")
self.burning = False
self.costume_burned = fireplace.add_costume(
["images/fireplace_1.png", "images/fireplace_2.png"]
)
fireplace.switch_costume(self.costume_not_burned)
door = Actor((6, 2))
@door.register
def on_setup(self):
self.add_costume("images/door_closed.png")
self.closed = True
self.door_open_costume = door.add_costume("images/door_open.png")
self.switch_costume(0)
door.layer = 2
player = Actor((8, 2))
@player.register
def on_setup(self):
self.add_costume("images/knight")
self.costume.is_rotatable = False
self.layer = 3
self.is_blockable = True
@player.register
def act(self):
self.world.camera.from_actor(self)
@player.register_message("burn")
def burn_torch(self, sender):
print("BURN?")
if not fireplace.burning:
fireplace.world.play_sound("sounds/fireplace.wav")
fireplace.switch_costume(fireplace.costume_burned)
fireplace.costume.is_animated = True
@player.register_message("open_door")
def open(self, sender):
if door.closed:
door.switch_costume(door.door_open_costume)
door.world.play_sound("sounds/olddoor.wav")
door.closed = False
inventory = []
@player.register
def on_key_down_w(self):
player.move_up()
@player.register
def on_key_down_s(self):
player.move_down()
@player.register
def on_key_down_a(self):
player.move_left()
@player.register
def on_key_down_d(self):
player.move_right()
@player.register_message("Torch")
def light_fireplace(self, data):
print("light")
found_actors = player.detect_all()
if fireplace in found_actors:
self.world.console.newline("You light the fireplace.")
self.send_message("burn")
self.world.toolbar.remove("Torch")
else:
self.world.console.newline("...nothing happens")
@player.register_sensor(door)
def ask_open_door(self, door):
if door.closed:
self.undo_move()
message = "The door is closed - Do you want to open it?"
reply = self.ask.choices(message, ["Yes", "No"])
if reply == "Yes":
self.send_message("open_door")
@player.register_sensor(torch)
def pick_up_torch(self, torch):
reply = self.ask.choices(
"You find a torch - Do you want to pick it up?", ["Yes", "No"]
)
if reply == "Yes":
inventory.append("Torch")
torch.remove()
l = Label("You pick up the torch")
line = world.console.add(l)
b = Button("Torch", "images/torch.png")
world.toolbar.add(b)
world.run()
Example: RPG#
Credits
Greenfoot <https://www.greenfoot.org/>_ Miniworlds is strongly inspired by Greenfoot.Kenney Assets <https://www.kenney.nl/assets>_ Most images in the examples are based on Kenney Assets
Links