I am trying to use binascii to convert this:
town1 = """
++++++++++++++++++++++++++++++++++++
+-------------------------------------------------------------+
+----------H-----------H----------H---------H--------------+
+----------&---------------&---------------------------------+
+------------------------------------------------------------>+
+----------------@-------------------------------------------+
++++++++++++++++++++++++++++++++++++
"""
into the type of graphics used in PyMike's PixelMan 3, found at pygame.org. I looked at the document on python.org telling about binascii and a little bit about how to use it, but since it wasn't presented in a matter that was directed towards gaming, I found it hard to understand. If anyone could, give me a break down of how I would convert town1 as well as the text-mode representations of H (for a house), @ for the player, and & for an NPC into pixel based graphics using binascii. I have the source code for PixelMan 3, and am working with that, but do not understand much of PyMike's code, and it is not very documented (no comments.) here is the PixelMan 3 code, if somebody could insert comments telling me what each section does I would greatly appreciate it.
#! /usr/bin/env python
# Pixelman 3 - PyMike's Entry for Ludum Dare 11
# Copyright (C) 2007 PyMike
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# -------------------------------------
# Controls:
# -------------------------------------
# Move - Arrow Keys
# Jump - Space, Up, Z
# Back out - Escape
# Choose option - Enter/Return
# Scroll options - Up and Down Arrows
# Warp to level - 1-5
# -------------------------------------
import pygame, sys, os
from pygame.locals import *
import binascii
from cStringIO import StringIO
level1 = """
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++
+---++++++----+++++++-----++++++++++++++
------------------------------++++++++++
----------------------------------------
----------------------------------------
------oo--------------------------------
------oo-------------------------oo-----
-------------oooo----------------oo-----
------++-----oooo-----------------------
P---++++-------G-----------------++----+
++++++++--++++++++++--+------+--++++-+++
++++++++--++++++++++--+--oo--+++++++-+++
++++++++SS++++++++++SS+SS++SS+++++++S+++
"""
level2 = """
++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++---+++++++++++++++----++++
+++++++++++++++----------+++++++++++-----------+
-----++++---------------------+++++-------------
--------------------------------++--------------
------------------------------------------------
------------------------------------------------
------------------------------------------------
P-----------------------------------------------
+-------oo------------o-----G-----o--oo---------
+-------oo---------+--+-----------+--oo---------
++++--------++---+++--+o--------oo+--------++---
++++++SS++--++-+++++--++oooo--+++++--++++++++---
++++++++++SS++S+++++SS++++++SS+++++SS+++++++++++
"""
level3 = """
++++++++++++++++++++++++++++++++++++++++++++++++
+++-++++++++++++++++++++++++++++++++++++++++++++
++---++++++++++++++++++++++++++++++----+++++++++
+------++++------+++++++++++++++----------++++++
+-------------------+++++++++------------------+
+-----------------------------------G----------+
+----------------oooo--------------------------+
++P---oooo-------++++-------+++----------------+
++++++++++SSS++++++++++SSS++++++++ooo+SS++-----+
++++++++++++++++++++++++++++++++++++++++++----++
-----------------ooo--------------------------++
-----------------ooo--------------------------++
-----------------+++-----ooo---ooo------------++
-------------++++++++++SS+++SS++++--------ooo+++
-------++++SS++++++++++++++++++++++++SSS++++++++
---+++++++++++++++++++++++++++++++++++++++++++++
+o-++++++---------------------------------------
+o-++++-----------o-----------------------------
+o----------------+o--------G------------------o
+o----------------++o---------------++--------o+
+o-----ooo--oooo+++++o-----o---o----+++oooo--o++
++-----+++SS++++++++++++SSS+SSS+SSS++++++++SS+++
+++SS+++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++
"""
level4 = """
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
-P--------------------------------------------------------------------------------------------------
-+--------------------------------------------------------------------------------------------------
-+++----+o--------------------------------------------------oo--------------------------------------
---+++--+o--------------------------------------------------oo--------------------------------------
--------+ooo-----------o+-------------------------ooo-----------------------------------------------
--------++++--+--+--+--o+-------------G-----------ooo-------++-----------------------G--------------
----------------------oo+------------------+--------------+-----------------------------------------
----------------------+++--+------+---------------+++-----+---------------+--ooo--------------------
---------------------------++++---------+----+ooo------++++---------------+--+++--+--+--+--+oooooooo
------------------------------+------+-------++++----------------ooo---++++----------------+++++++++
-----------------------------------------------------------------+++--------------------------------
"""
level5 = """
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------
--------------------------------------------------oooo++---------------------------------------
-----------------------------------------o--------oooo++---------------------------------------
-----------------------------------------o--------oooo++---------------------------------------
---------G----oo-----------------------o-o-o------ooo+++---------------------------------------
P-------------oo---oo-------------------ooo-------oo++++---------------------------------------
++-----------------oo--------------------o-------++++++----------------------------------------
++oooo--------++------------------------------++++++++-----------------------------------------
++++++--+--+--+++--++-------G------ooo++---+++++++++-------------------------------------------
--++++--------++++++++-----------oo++++--------------------------------------------------------
--------------------++-----------o++++---------------------------------------------------------
---------------------++----------++------------------------------------------------------------
----------------------+++--+--+--+--------------------------------------o---------------G------
-----------------------------------------------------------------------o+----------------------
-----------------------------------------------------------o---------oo++--------oo------oooooo
-----------------------------------------o-----o-----o--o--+--o-----o++++SS++----oo--++--++++++
-----------------------------------------+--o--+--o--+--+-----+-----+++++++++++-----+++SS++++++
--------------------------------------------+-----+--------------o--------+++++++SS++++++++++++
-----------------------------------------------------------------+-------------++++++--++++----
"""
player_anim0 = """
------+++++-----
----+++++++++---
---+++++++++++--
--+++++++++++++-
--++++--+++--++-
-+++++--+++--++-
+++++++++++++++-
++++++++++++++++
++++++++++++++++
++++++-+++++-+++
+++++++-----++++
+-++++++++++++++
--++++++++++++-+
---++++++++++---
---++-----++----
--+++++--+++++--
"""
player_anim1 = """
------+++++-----
----+++++++++---
---+++++++++++--
--+++++++++++++-
--++++--+++--++-
-+++++--+++--++-
+++++++++++++++-
++++++++++++++++
++++++++++++++++
++++++-+++++-+++
+++++++-----++++
+-++++++++++++++
--++++++++++++-+
---++++++++++---
--+++++---++----
---------+++++--
"""
player_anim2 = """
------+++++-----
----+++++++++---
---+++++++++++--
--+++++++++++++-
--++++--+++--++-
-+++++--+++--++-
+++++++++++++++-
++++++++++++++++
++++++++++++++++
++++++-+++++-+++
+++++++-----++++
+-++++++++++++++
--++++++++++++-+
---++++++++++---
---++----+++++--
--+++++---------
"""
spikes_img = """
--+---+---+---+-
--+---+---+---+-
--+---+---+---+-
--+---+---+---+-
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
-+++-+++-+++-+++
++++++++++++++++
++++++++++++++++
++++++++++++++++
++++++++++++++++
"""
ghostie_img = """
------+++++-----
----+++++++++---
---+++++++++++--
--+++++++++++++-
-+++++--+++--++-
+++++++--+--++++
++++++++-+-+++++
++++++++++++++++
-++++-+++++++-++
--++++--+++--++-
---+++++---++++-
----++++++++++--
-----++++++++---
-------++++-----
"""
jump_sound = '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\n'
coin_sound = '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\n'
blip_sound = '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\n'
def load_sound(string):
sound_string = binascii.a2b_base64(string)
f = StringIO(sound_string)
sound = pygame.mixer.Sound(f)
sound.set_volume(0.5)
return sound
LEVELS = [level1, level2, level3, level4, level5]
ONFULLSCREEN = 0
def imagetostring(filename):
img = pygame.image.load(filename)
new = ""
for y in range(img.get_height()):
for x in range(img.get_width()):
pixel = img.get_at((x, y))
if pixel == (0, 0, 0, 255):
new += "+"
elif pixel == (255, 255, 0, 255):
new += "o"
elif pixel == (255, 0, 0, 255):
new += "P"
elif pixel == (0, 0, 255, 255):
new += "S"
elif pixel == (0, 255, 0, 255):
new += "G"
else:
new += "-"
new += "\n"
return new
def image(color, shape="block", pixelstring=None):
img = pygame.Surface((16, 16))
if shape == "block":
img.fill(Color(color))
if shape == "circle":
pygame.draw.ellipse(img, Color(color), (1, 1, 14, 14))
img.set_colorkey((0, 0, 0), RLEACCEL)
if pixelstring:
img.set_colorkey((0, 0, 0), RLEACCEL)
x=0
y=-1
for line in pixelstring.split("\n"):
for char in line:
if char == "+":
img.fill(Color(color), (x, y, 1, 1))
x += 1
y += 1
x = 0
return img
def speed_to_side(dx,dy):
if abs(dx) > abs(dy): dy = 0
else: dx = 0
if dy < 0: return 0
elif dx > 0: return 1
elif dy > 0: return 2
elif dx < 0: return 3
else: return 0, 0
class Sprite(pygame.sprite.Sprite):
def __init__(self, img, pos):
pygame.sprite.Sprite.__init__(self, self.containers)
self.image = img
self.rect = self.image.get_rect(topleft = pos)
self.r = Rect(self.rect[0]*100, self.rect[1]*100, self.rect[2]*100, self.rect[3]*100)
self.collision_groups = []
def set_pos(self, x, y):
self.r.left = x*100
self.r.top = y*100
def update_rect(self):
self.rect.top = self.r.top/100
self.rect.left = self.r.left/100
def add_collision_group(self, group):
self.collision_groups.append(group)
def move(self, dx, dy, collide=True):
if collide:
if dx!=0:
dx, dummy = self.__move(dx*100, 0)
if dy!=0:
dummy, dy = self.__move(0, dy*100)
else:
self.r.move_ip(dx*100, dy*100)
return dx, dy
def __move(self, dx, dy):
oldr = self.r
self.r.move_ip(dx, dy)
side = speed_to_side(dx, dy)
for group in self.collision_groups:
for spr in group:
if spr.r.colliderect(self.r):
if side == 0:
self.r.top = spr.r.bottom
if side == 1:
self.r.right = spr.r.left
if side == 2:
self.jumping = False
self.jump_speed = 0
self.r.bottom = spr.r.top
if side == 3:
self.r.left = spr.r.right
return self.r.left-oldr.left,self.r.top-oldr.top
class Player(Sprite):
def __init__(self, pos):
Sprite.__init__(self, image("#010101", pixelstring=player_anim0, shape=None), pos)
self.images = [image("#010101", pixelstring=player_anim2, shape=None),
image("#010101", pixelstring=player_anim1, shape=None),
image("#010101", pixelstring=player_anim0, shape=None)]
self.rightimgs = self.images
self.leftimgs = []
for i in self.images:
self.leftimgs.append(pygame.transform.flip(i, 1, 0))
self.jump_speed = 0
self.fall_speed = 0.4
self.jumping = False
self.speed = 0
self.accel_speed = 0.25
self.max_speed = 3.5
self.facing = 1
self.frame = 0
self.keys = [K_SPACE, K_UP, K_z]
self.jump_sound = load_sound(jump_sound)
def jump(self):
if not self.jumping:
self.jump_sound.play()
self.jumping = True
self.jump_speed = -6
def update(self):
if self.jump_speed > 1:
self.jumping = True
moving = 0
key = pygame.key.get_pressed()
if self.rect.left < 0:
self.set_pos(0, self.rect.top)
if key[K_LEFT]:
self.facing = -1
moving = -1
if self.speed > -self.max_speed:
self.speed -= self.accel_speed
elif key[K_RIGHT]:
self.facing = 1
moving = 1
if self.speed < self.max_speed:
self.speed += self.accel_speed
else:
if self.speed > 0:
self.speed -= self.accel_speed
if self.speed < 0:
self.speed += self.accel_speed
if self.jump_speed < 5:
if key[self.keys[0]] or key[self.keys[1]] or key[self.keys[2]]:
self.jump_speed += self.fall_speed
else:
self.jump_speed += self.fall_speed+0.3
self.move(self.speed, self.jump_speed)
self.frame += 1
if self.facing > 0:
self.image = self.rightimgs[2]
if self.facing < 0:
self.image = self.leftimgs[2]
if moving > 0:
self.image = self.rightimgs[self.frame/4%2]
if moving < 0:
self.image = self.leftimgs[self.frame/4%2]
class Ghostie(Sprite):
def __init__(self, pos):
Sprite.__init__(self, image("#010101", shape=None, pixelstring=ghostie_img), pos)
self.leftimg = pygame.transform.flip(image("#010101", shape=None, pixelstring=ghostie_img), 1, 0)
self.rightimg = image("#010101", shape=None, pixelstring=ghostie_img)
self.frame = 0
self.speed = 1
self.orgcenter = self.rect.centerx
self.y = self.rect.centery
def update(self):
if self.speed > 0:
self.image = self.rightimg
if self.speed < 0:
self.image = self.leftimg
self.move(self.speed, 0)
self.frame += 1
if self.frame <= 12:
self.move(0, 0.25)
else:
self.move(0, -0.25)
self.rect.centery = self.y
if self.frame >= 24:
self.frame = 0
if self.rect.right >= self.orgcenter + 50:
self.speed = -1
if self.rect.left <= self.orgcenter - 50:
self.speed = 1
class Block(Sprite):
def __init__(self, pos):
Sprite.__init__(self, image("#890000"), pos)
class Spikes(Sprite):
def __init__(self, pos):
Sprite.__init__(self, image("#010101", shape=None, pixelstring=spikes_img), pos)
class Coin(Sprite):
def __init__(self, pos):
Sprite.__init__(self, image("#ffff00", "circle"), pos)
self.images = [image("#ffff00", "circle"),
image("#f4f400", "circle"),
image("#e9e900", "circle"),
image("#f4f400", "circle")]
self.frame = 0
self.alpha = 255
self.dead = False
self.coin_sound = load_sound(coin_sound)
def kill(self):
self.dead = True
def update(self):
self.frame += 1
self.image = self.images[self.frame/4%4]
if self.dead:
self.alpha -= 75
if self.alpha <= 0:
self.coin_sound.play()
pygame.sprite.Sprite.kill(self)
self.image.set_alpha(self.alpha)
class Camera(object):
def __init__(self, screen, sprite_to_center_on, world_size):
self.sprite = sprite_to_center_on
self.rect = screen.get_rect()
self.world_rect = Rect(0, 0, world_size[0], world_size[1])
def update(self):
if self.sprite.rect.centerx > self.rect.centerx + 25:
self.rect.centerx = self.sprite.rect.centerx - 25
if self.sprite.rect.centerx < self.rect.centerx - 25:
self.rect.centerx = self.sprite.rect.centerx + 25
if self.sprite.rect.centery > self.rect.centery + 25:
self.rect.centery = self.sprite.rect.centery - 25
if self.sprite.rect.centery < self.rect.centery - 25:
self.rect.centery = self.sprite.rect.centery + 25
self.rect.clamp_ip(self.world_rect)
def draw_group(self, surface, group):
for sprite in group.sprites():
if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:
if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:
surface.blit(sprite.image, self.sprite_rect(sprite))
def update_group(self, group):
for sprite in group.sprites():
if sprite.rect.left <= self.rect.right and sprite.rect.right >= self.rect.left:
if sprite.rect.top <= self.rect.bottom and sprite.rect.bottom >= self.rect.top:
sprite.update()
sprite.update_rect()
def sprite_rect(self, actor):
return pygame.Rect(actor.rect.x - self.rect.x, actor.rect.y - self.rect.y, actor.rect.w, actor.rect.h)
class Level:
def __init__(self, level=level1):
self.level = level
self.x = 0
self.y = -16
for line in self.level.split("\n"):
for char in line:
if char == "+":
Block((self.x, self.y))
if char == "P":
self.player = Player((self.x, self.y))
if char == "o":
Coin((self.x, self.y))
if char == "S":
Spikes((self.x, self.y))
if char == "G":
Ghostie((self.x, self.y))
self.x += 16
self.y += 16
self.x = 0
def get_size(self):
lines = self.level.split("\n")
line = lines[1]
width = (len(line))*16
height = (len(lines)-2)*16
return [width, height]
def next_level(levelnum):
try:
levelnum += 1
lvl = LEVELS[levelnum-1]
except:
return None
level = Level(lvl)
return level, levelnum
def Menu(screen):
screen = screen
font = pygame.font.SysFont("courier", 32, bold=True)
font2 = pygame.font.SysFont("courier", 20, bold=True)
font3 = pygame.font.SysFont("courier", 12, bold=True)
player = image("#010101", shape=None, pixelstring=player_anim0)
player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
cursor = image("#010101", shape="circle")
cursorpos = 150
option = 1
sound = load_sound(blip_sound)
clock = pygame.time.Clock()
global ONFULLSCREEN
while 1:
clock.tick(30)
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
sys.exit()
if e.type == KEYDOWN:
if e.key == K_ESCAPE:
pygame.quit()
sys.exit()
if e.key == K_DOWN:
sound.play()
option = 2
if e.key == K_UP:
sound.play()
option = 1
if e.key == K_RETURN:
sound.play()
if option == 1:
Intro(screen)
game = Game(screen)
game.main_loop()
if option == 2:
pygame.quit()
return
if e.key == K_f:
ONFULLSCREEN ^= 1
if ONFULLSCREEN:
pygame.display.set_mode((320, 240), FULLSCREEN)
else:
pygame.display.set_mode((320, 240))
if option == 1:
cursorpos = 150
else:
cursorpos = 170
screen.fill(Color("#c1c1c1"))
pygame.draw.rect(screen, Color("#890000"), (55, 25, 210, 45), 5)
pygame.draw.rect(screen, Color("#890000"), (0, 227, 320, 32))
ren = font.render("Pixelman 3", 1, Color("#000000"))
screen.blit(ren, (161-ren.get_width()/2, 31))
ren = font.render("Pixelman 3", 1, Color("#ffffff"))
screen.blit(ren, (160-ren.get_width()/2, 30))
ren = font3.render("Copyright (C) 2008", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 85))
ren = font3.render("Created by PyMike for LD XI", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 100))
ren = font2.render("New Game", 1, Color("#000000"))
screen.blit(ren, (140, 145))
ren = font2.render("Quit Game", 1, Color("#000000"))
screen.blit(ren, (140, 165))
screen.blit(player, (10, 132))
screen.blit(cursor, (120, cursorpos))
pygame.display.flip()
def Intro(screen):
screen = screen
font = pygame.font.SysFont("courier", 32, bold=True)
font2 = pygame.font.SysFont("courier", 16, bold=True)
font3 = pygame.font.SysFont("courier", 12, bold=True)
player = image("#010101", shape=None, pixelstring=player_anim0)
player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
cursor = image("#010101", shape="circle")
option = 1
sound = load_sound(blip_sound)
clock = pygame.time.Clock()
ypos = 240
global ONFULLSCREEN
text = ["Oh noes! Pixelman is not",
"drawing pixels fast enough!",
"Help Pixelman speed through",
"the levels before his owner",
"discards the computer monitor",
"for being a minimalist!"]
while 1:
clock.tick(60)
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
sys.exit()
if e.type == KEYDOWN:
if e.key == K_ESCAPE:
return
if e.key == K_RETURN:
sound.play()
return
if e.key == K_f:
ONFULLSCREEN ^= 1
if ONFULLSCREEN:
pygame.display.set_mode((320, 240), FULLSCREEN)
else:
pygame.display.set_mode((320, 240))
screen.fill(Color("#c1c1c1"))
ren = font.render("Prologue", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 20))
ypos = 75
for line in text:
ren = font2.render(line, 1, (0, 0, 0))
screen.blit(ren, (160-ren.get_width()/2, ypos))
ypos += font2.get_height()
ren = font3.render("Press Enter To Start", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 210))
pygame.display.flip()
def Outro(screen, final_score=0):
screen = screen
font = pygame.font.SysFont("courier", 32, bold=True)
font2 = pygame.font.SysFont("courier", 16, bold=True)
font3 = pygame.font.SysFont("courier", 12, bold=True)
player = image("#010101", shape=None, pixelstring=player_anim0)
player = pygame.transform.scale(player, [player.get_width()*6, player.get_height()*6])
cursor = image("#010101", shape="circle")
option = 1
sound = load_sound(blip_sound)
clock = pygame.time.Clock()
ypos = 240
global ONFULLSCREEN
text = ["Hurray! You saved Pixelman",
"from being scrapped!",
"Nice work!",
"",
"Final Score:",
"%09d" % final_score]
while 1:
clock.tick(60)
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
sys.exit()
if e.type == KEYDOWN:
if e.key == K_ESCAPE:
return
if e.key == K_RETURN:
sound.play()
return
if e.key == K_f:
ONFULLSCREEN ^= 1
if ONFULLSCREEN:
pygame.display.set_mode((320, 240), FULLSCREEN)
else:
pygame.display.set_mode((320, 240))
screen.fill(Color("#c1c1c1"))
ren = font.render("You won!", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 20))
ypos = 75
for line in text:
ren = font2.render(line, 1, (0, 0, 0))
screen.blit(ren, (160-ren.get_width()/2, ypos))
ypos += font2.get_height()
ren = font3.render("Press Enter to Exit to Title Screen", 1, Color("#000000"))
screen.blit(ren, (160-ren.get_width()/2, 210))
pygame.display.flip()
class Game:
def __init__(self, screen):
self.screen = screen
self.all = pygame.sprite.RenderUpdates()
self.blocks = pygame.sprite.Group()
self.coins = pygame.sprite.Group()
self.spikes = pygame.sprite.Group()
self.ghosties = pygame.sprite.Group()
Player.containers = self.all
Block.containers = self.all, self.blocks
Coin.containers = self.all, self.coins
Spikes.containers = self.all, self.spikes
Ghostie.containers = self.all, self.ghosties
self.clock = pygame.time.Clock()
self.level = Level()
self.player = self.level.player
self.player.add_collision_group(self.blocks)
self.camera = Camera(self.screen, self.player, self.level.get_size())
self.lvl = 1
self.font = pygame.font.SysFont("courier", 12, bold=True)
self.font2 = pygame.font.SysFont("courier", 32, bold=True)
self.score = 0
self.lives = 5
self.done = False
self.coin_sound = load_sound(coin_sound)
self.highscore = 0
self.paused = False
self.time = 0
self.final_score = 0
def draw(self):
self.screen.fill(Color("#c1c1c1"))
self.camera.draw_group(self.screen, self.all)
ren1 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#000000"))
ren2 = self.font.render("FPS: %d/60" % self.clock.get_fps(), 1, Color("#ffffff"))
self.screen.blit(ren1, (6, 221))
self.screen.blit(ren2, (5, 220))
ren1 = self.font.render("Score: %d" % self.score, 1, Color("#000000"))
ren2 = self.font.render("Score: %d" % self.score, 1, Color("#ffffff"))
self.screen.blit(ren1, (11, 6))
self.screen.blit(ren2, (10, 5))
ren1 = self.font.render("Level: %d" % self.lvl, 1, Color("#000000"))
ren2 = self.font.render("Level: %d" % self.lvl, 1, Color("#ffffff"))
self.screen.blit(ren1, (246, 6))
self.screen.blit(ren2, (245, 5))
ren1 = self.font.render("Lives x%d" % self.lives, 1, Color("#000000"))
ren2 = self.font.render("Lives x%d" % self.lives, 1, Color("#ffffff"))
self.screen.blit(ren1, (131, 6))
self.screen.blit(ren2, (130, 5))
ren1 = self.font.render("Time: %d" % self.time, 1, Color("#000000"))
ren2 = self.font.render("Time: %d" % self.time, 1, Color("#ffffff"))
self.screen.blit(ren1, (11, 21))
self.screen.blit(ren2, (10, 20))
self.final_score = (self.score - int(self.time))*self.lives
if self.lives <= 0 and not self.player.alive() and not self.done:
ren1 = self.font2.render("Game Over!", 1, Color("#000000"))
ren2 = self.font2.render("Game Over!", 1, Color("#ffffff"))
self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))
self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))
def hit_screen(self):
self.draw()
ren1 = self.font2.render("You Crashed!", 1, Color("#000000"))
ren2 = self.font2.render("You Crashed!", 1, Color("#ffffff"))
self.screen.blit(ren1, (160-ren1.get_width()/2 + 2, 120-ren1.get_height()/2 + 2))
self.screen.blit(ren2, (160-ren2.get_width()/2, 120-ren2.get_height()/2))
pygame.display.flip()
pygame.time.wait(1000)
def main_loop(self):
global ONFULLSCREEN
while 1:
self.clock.tick(60)
if self.player.alive():
self.time += 0.015
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
sys.exit()
if e.type == KEYDOWN:
if e.key == K_ESCAPE:
return
if e.key in self.player.keys:
self.player.jump()
if e.key == K_1:
self.lvl = 0
self.next_level()
if e.key == K_2:
self.lvl = 1
self.next_level()
if e.key == K_3:
self.lvl = 2
self.next_level()
if e.key == K_4:
self.lvl = 3
self.next_level()
if e.key == K_5:
self.lvl = 4
self.next_level()
if e.key == K_p:
self.paused ^= 1
if e.key == K_f:
ONFULLSCREEN ^= 1
if ONFULLSCREEN:
pygame.display.set_mode((320, 240), FULLSCREEN)
else:
pygame.display.set_mode((320, 240))
pygame.time.wait(1500)
while self.paused:
self.clock.tick(20)
for e in pygame.event.get():
if e.type == QUIT:
pygame.quit()
return
if e.type == KEYDOWN:
if e.key == K_ESCAPE:
return
if e.key == K_p:
self.paused ^= 1
for sprite in self.all.sprites():
if isinstance(sprite, Coin):
sprite.update()
if sprite.rect.left <= self.camera.rect.right and sprite.rect.right >= self.camera.rect.left:
if sprite.rect.top <= self.camera.rect.bottom and sprite.rect.bottom >= self.camera.rect.top:
if not isinstance(sprite, Coin):
sprite.update()
sprite.update_rect()
if isinstance(sprite, Coin):
if self.player.rect.colliderect(sprite.rect) and not sprite.dead:
sprite.kill()
self.score += 25
if isinstance(sprite, Spikes):
if self.player.rect.colliderect(sprite.rect):
self.player.kill()
if isinstance(sprite, Ghostie):
if self.player.rect.colliderect(sprite.rect):
self.player.kill()
if self.score > self.highscore:
self.highscore = self.score
if not self.player.alive() and self.lives > 0 and not self.done:
self.hit_screen()
self.score = 0
self.lvl -= 1
self.lives -= 1
self.next_level()
if self.player.rect.right >= self.level.get_size()[0] and not self.done:
self.player.kill()
self.next_level()
if self.player.rect.top >= self.level.get_size()[1]:
self.player.kill()
if self.done:
Outro(self.screen, self.final_score)
return
self.camera.update()
self.draw()
pygame.display.flip()
def next_level(self):
lvl = next_level(self.lvl)
if lvl == None:
self.done = True
else:
self.clear_sprites()
self.level, self.lvl = next_level(self.lvl)
self.player = self.level.player
self.player.add_collision_group(self.blocks)
self.camera = Camera(self.screen, self.player, self.level.get_size())
def clear_sprites(self):
for sprite in self.all.sprites():
pygame.sprite.Sprite.kill(sprite)
def main():
if sys.platform in ("win32", "win64"):
os.environ["SDL_VIDEO_CENTERED"] = "1"
pygame.init()
pygame.display.set_caption("Pixelman 3 - PyMike LD48")
pygame.mouse.set_visible(0)
screen = pygame.display.set_mode((320, 240))
Menu(screen)
if __name__ == "__main__":
main()
thanks ahead of time.