Can someone quickly PND up my PYGame


richiz

Member
Joined
Jan 4, 2011
Messages
338
I'm going to put this into the competition (not as a submission just as an extra game...it's too laggy, I'm yet to do the 4th and 5th level and the graphics are shite.


But still....Educational purposes. If someone could document the process for me as they do it'd be useful but not necessary at this point. I do mean to go back and read Tempels notes on how he did it with Bubbman but got a lot on my plate at the mo, ce la vie.


Lots of kisses to whoever does this :X



Code:
# shit pygame by RichiZ

#Open Pandora Competition 2011


import pygame, sys, os

from pygame.locals import *


import binascii

from cStringIO import StringIO


level1 = """

++++++++++++++++++++++++++++++++++++++++

+++++++---------------------------------

+++++-----------------------------------

--------------------------------------++

-----00---------G-----------------++++++

P----00-----------------------+-----++++

---------------G----------------------++

++---SS-------------------G-------+----+

+++--SS--------------------------oo----+

+++++SS--------------------------oo--+++

++++++++--------------------------+--+-+

++++++++-------G---------G---+--------++

+++++++++---+---------+------+-------+++

++++++++++------------+--oo--++++----+++

+++++++++++++++++++----------++++SSSS+++

"""


level2 = """

++++++++++++++++++++++++++++++++++++++++++++++++

--------------------------++++++++++++++++++++++

-------oo------------------+++++++++--+++++--+++

-------ooo------------------+++++-+++++++++++-++

----ooooooo-G------------------+++-----------+++

P------ooo-----------oo----------+++++++++++++++

+++----oo---------------------------------------

-------------------------+++--------------------

-----------------++-----------------------------

-----------------++--------------G---------+++++

------------++----------------------------------

--------++++++------------------------++++------

--------++++-----------------------++++++-------

------------------------------------------------

SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS

"""


level3 = """

++++++++++++++++++++++++++++++++++++++++++++++++

+++-++++++++++++++++++++++++++++++++++++++++++++

++---++++++++++++++++++++++++++++++----+++++++++

+--------++------+++++++++++++++----------++++++

--oooooo------+++++++++++++++------------------+

--++++++------++++++++-------------------------+

-------++--oooo-+++++---------------G----------+

+---G--+++--oo----------------G----------------+

---------+-----------+-------------------------+

++--------+------------G---------+++++++++----++

--------++-------ooo+-----------+-------------++

G-+-----+--------ooo--------+-------------G---++

G-+++----+---G---+++SSSSSoooSSSooo-----------++

--++++---o+++++++++++++++++++++--------++++++--

--G------+------------------------------+++---++

------o++oo----------+++-----------+++++-------+

+o---G--+oo--++++SSSSSSSSS+++++++++--------G----

+o--o+++-oo---oo-+++++++++----------------------

+o------------ooG--oooo---------G---------oooo

+o-++-SSSSSS+-----------G------------G----++----

+P---SSSSSSS+---------------------------+---++-

++--SSSSSSSS+----+---+-----------+---+--------+-

+++SSSSSSSSS++-------------G-------------------+

+++++++++++++++SSSSSSSSSS++++++SSSSSSSSSSSSSSSS+

++++++++++++++++++++++++++++++++++++++++++++++++

"""


level4 = """


"""


level5 = """


"""

player_anim0 = """

----------------

--------+++++---

------++++++++--

-----++++++-++--

------++++++++--

------+++++-----

----++++++++----

---++++++++-+---

--+--++++++-----

++--++++--+++---

-+--++++--++++--

----++++--++++--

----++++--++++--

---++++---+++---

---++-----++----

--+++++--+++++--

"""

player_anim1 = """

----------------

---------+++++--

--------+++++++-

-------+++++-++-

-------++++++++-

--------+++++---

-----+++++++----

--+++++++++-+---

+++--+++++++----

-----++++-++----

-----++++++++---

------+++-+++---

-----+++-++++---

-----++++-------

----+++---------

--++------------

"""

player_anim2 = """

----------------

---------++++++-

--------++++++++

-------++++++-++

-------+++++++++

--------++++++--

-----+++++++----

--+++++++++-+---

+++--+++++++----

-----++++-++----

-----++++++++---

------+++-+++---

----+++++++++---

---+++++++------

+++++-----------

----------------

"""

spikes_img = """

+-------+------+

-+------+-----+-

--+-----+----+--

---++--+++--++--

-----+++++++----

-----++++++-----

------+++++-----

------++++------

------++++------

------++++------

------++++------

----+++++++-----

---+++++++++----

-++++++++++++---

-++++++++++++++-

++++++++++++++++

"""


robo_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("#7F79D5", pixelstring=player_anim0, shape=None), pos)

        self.images = [image("#7F79D5", pixelstring=player_anim2, shape=None),

                       image("#7F79D5", pixelstring=player_anim1, shape=None),

                       image("#7F79D5", 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_PAGEDOWN]

        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 robo(Sprite):


    def __init__(self, pos):


        Sprite.__init__(self, image("#690498", shape=None, pixelstring=robo_img), pos)


        self.leftimg = pygame.transform.flip(image("#690498", shape=None, pixelstring=robo_img), 1, 0)

        self.rightimg = image("#690498", shape=None, pixelstring=robo_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("#11B019"), pos)


class Spikes(Sprite):


    def __init__(self, pos):

        Sprite.__init__(self, image("#545B55", 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":

                    robo((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("#00574E"), (55, 25, 210, 45), 5)

        pygame.draw.rect(screen, Color("#00574E"), (0, 227, 320, 32))

        ren = font.render("Robo Hell", 1, Color("#7E31A2"))

        screen.blit(ren, (161-ren.get_width()/2, 31))

        ren = font.render("Robo Hell", 1, Color("#ffffff"))

        screen.blit(ren, (160-ren.get_width()/2, 30))


        ren = font3.render("RichiZ", 1, Color("#000000"))

        screen.blit(ren, (160-ren.get_width()/2, 85))

        ren = font3.render("Open Pandora Competition", 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("Times New Roman", 32, bold=True)

    font2 = pygame.font.SysFont("Times New Roman", 16, bold=True)

    font3 = pygame.font.SysFont("Times New Roman", 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 = ["Get To The Chopper"]


    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 = ["You destroyed Robo Land!"

            "",

            "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.robos = 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

        robo.containers = self.all, self.robos


        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("Ouch!", 1, Color("#000000"))

        ren2 = self.font2.render("Ouch!", 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, robo):

                            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():


    pygame.init()

    pygame.display.set_caption("Robo Hell - RichiZ")

    pygame.mouse.set_visible(0)

    screen = pygame.display.set_mode((320, 240))

    Menu(screen)


if __name__ == "__main__":

    main()
 
Here you go.


The process went like this:

  1. Install distPND.
  2. Add "#!/usr/bin/python" to the start of your program and save it as "game.py".
  3. Make these files:
    setup.py

    Code:
    #!/usr/bin/python
    
    from distutils.core import setup
    
    setup(
    
        name = 'Robo Hell',
    
        version = '0.1',
    
        description = 'shit pygame by RichiZ; OpenPandora competition 2011',
    
        author = 'RichiZ',
    
        scripts = ['game.py'],
    
    )

    setup.cfg

    Code:
    [global]
    
    command-packages=distpnd
    
    
    [gen_pxml]
    
    categories=Game:ActionGame
  4. python setup.py bdist_pnd



And then you have a PND.
 
Last edited by a moderator:
Thanks Tempel, I've got this bookmarked for when I get Robo hell to an acceptable speed and finish the last two levels!


lol, Im' predictable if nothing else.
 
lol, Im' predictable if nothing else.
Funny, I was just thinking the same about myself :D


It's a fun game, but bloody tough! It plays at pretty good rates on my Touch Book (with an OMAP3 chip similar to Pandora's). First two levels hover around 30 FPS - very playable - but the third drops to 15 or so. So there's hope for it on Pandora.
 
Pnd still isn't working with the icon? Any chance you could take a look?
 
Back
Top