Hey everyone! I've recently been doing a number of small projects in Pygame and Python, the recent of which is a small platformer game. I've only been coding in Python for about a few months now and Pygame for even less, so as you could guess I'm very good yet. well back to the point, I've been coding this platformer game and I cant seem to get the terrain to show and the player to move(not even including gravity). Can someone please tell me what I'm doing wrong here(I've been working on this glitch for like 3 hours now and still cant figure it out). Here's the code so you can help.

game.py

Code:

 import sys,pygame
from pygame import *

pygame.init()

display = pygame.display.set_mode((640,480))

class player():
    def __init__(self):
        self.x = 100
        self.y = 100
        self.movex = 0
        self.movey = 0
        self.image = pygame.image.load("player.png").convert_alpha()
        self.box = pygame.Rect(self.x,self.y,self.image.get_width(),self.image.get_height())
    def move(self):
        self.x += self.movex
        self.y += self.movey
        self.box = pygame.Rect(self.x,self.y,self.image.get_width(),self.image.get_height())
        cRects = self.box.collidelistall(level().boxes)
        if cRects != []:
            for rect in cRects:
                if movex > 0:
                    self.box.right = rect.left
                elif movex < 0:
                    self.box.left = rect.right
                if movey > 0:
                    self.box.bottom = rect.top
                elif movey <0:
                    self.box.top = rect.bottom
            self.x = self.box.x
            self.y = self.box.y
    def render(self):
        display.blit(self.image,(self.x,self.y))
       
class level():
    def __init__(self):
        self.levelData = []
        self.blockTypes = []
        self.level = []
        self.boxes = []
    def addBlockType(self,image):
        self.blockTypes.append(image)
        return len(self.blockTypes)
    def loadLevel(self,data):
        self.levelData = data
    def renderLevel(self,xos,yos):
        self.boxes = []
        for i in self.levelData:
            print i
            image = self.blockTypes[i[0]]
            display.blit(image,(i[1]+xos,i[2]+yos))
            self.boxes.append(pygame.Rect(i[1]+xos,i[2]+yos,image.get_width(),image.get_height()))
level()
bgim = pygame.image.load("bg.jpg").convert()
execfile("level.py")
level().loadLevel(level1)
while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            key = event.key
            if key == K_LEFT:
                player().movex = -2
            if key == K_RIGHT:
                player().movex = 2
           
    display.blit(bgim,(0,0))
    level().renderLevel(0,0)
    player().move()
    player().render()

    pygame.display.update()



level.py

Code:

level1 = []
brick = pygame.image.load('brick.png').convert()
dirt = pygame.image.load('dirt.png').convert()
grass = pygame.image.load('grass.png').convert()
stone = pygame.image.load('stone.png').convert()
brick = level().addBlockType(brick)
dirt = level().addBlockType(dirt)
grass = level().addBlockType(grass)
stone = level().addBlockType(stone)

level1.append([grass,0,320])
level1.append([grass,64,320])
level1.append([grass,128,320])
level1.append([grass,192,320])
level1.append([grass,192,320])
level1.append([grass,256,384])
level1.append([grass,320,384])
level1.append([grass,320,384])
level1.append([grass,384,384])
level1.append([grass,448,384])
level1.append([grass,512,384])
level1.append([grass,576,320])
level1.append([grass,640,320])
level1.append([grass,704,320])
level1.append([grass,768,256])
level1.append([grass,832,256])
level1.append([grass,832,256])
level1.append([grass,896,256])
level1.append([grass,960,320])
level1.append([dirt,960,384])
level1.append([dirt,896,384])
level1.append([dirt,896,320])
level1.append([dirt,832,384])
level1.append([dirt,832,320])
level1.append([dirt,768,384])
level1.append([dirt,768,320])
level1.append([dirt,704,384])
level1.append([dirt,640,384])
level1.append([dirt,576,384])
level1.append([dirt,192,384])
level1.append([dirt,128,384])
level1.append([dirt,64,384])
level1.append([dirt,0,384])
level1.append([dirt,0,384])
level1.append([dirt,0,448])
level1.append([dirt,64,448])
level1.append([dirt,128,448])
level1.append([dirt,192,448])
level1.append([dirt,256,448])
level1.append([dirt,320,448])
level1.append([dirt,384,448])
level1.append([dirt,448,448])
level1.append([dirt,512,448])
level1.append([dirt,576,448])
level1.append([dirt,640,448])
level1.append([dirt,640,448])
level1.append([dirt,704,448])
level1.append([dirt,768,448])
level1.append([dirt,832,448])
level1.append([dirt,832,448])
level1.append([dirt,896,448])
level1.append([dirt,960,448])
level1.append([stone,960,512])
level1.append([stone,896,512])
level1.append([stone,832,512])
level1.append([stone,768,512])
level1.append([stone,704,512])
level1.append([stone,640,512])
level1.append([stone,576,512])
level1.append([stone,512,512])
level1.append([stone,448,512])
level1.append([stone,384,512])
level1.append([stone,320,512])
level1.append([stone,256,512])
level1.append([stone,192,512])
level1.append([stone,128,512])
level1.append([stone,64,512])
level1.append([stone,0,512])
level1.append([brick,0,256])
level1.append([brick,0,192])
level1.append([brick,0,128])
level1.append([brick,64,128])
level1.append([brick,128,128])
level1.append([brick,192,128])
level1.append([brick,192,192])
level1.append([brick,192,256])
level1.append([brick,64,256])
level1.append([brick,64,64])
I am not sure if this will fix your problems, but I notice a couple of errors in your code. You are defining your classes, but then you never actually create an instance of that class. For example in your code:

Code:

level().loadLevel(level1)
while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            key = event.key
            if key == K_LEFT:
                player().movex = -2
            if key == K_RIGHT:
                player().movex = 2
           
    display.blit(bgim,(0,0))
    level().renderLevel(0,0)
    player().move()
    player().render()

    pygame.display.update()


should be changed to something like this:

Code:

player_1 = player()
level_one = level()
level_one.loadLevel(level1)
while 1:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        if event.type == KEYDOWN:
            key = event.key
            if key == K_LEFT:
                player_1.movex = -2
            if key == K_RIGHT:
                player_1.movex = 2
           
    display.blit(bgim,(0,0))
    level_one.renderLevel(0,0)
    player_1.move()
    player_1.render()

    pygame.display.update()


That being said I have not yet checked your code for logic errors, but fixing what I showed above would be a good place for you to start. I would also recommend that you read this tutorial http://net.tutsplus.com/tutorials/python-tutorials/python-from-scratch-object-oriented-programming/
Thanks that fixed most of the problems but I still have one problem, which is that I cant get the player to move. I haven't changed the players code so I don't think I'll need to re-post it.
I believe I know where your problem is, but again I haven't run any of your code. In your player class comment out these lines:

Code:

    cRects = self.box.collidelistall(level().boxes)
        if cRects != []:
            for rect in cRects:
                if movex > 0:
                    self.box.right = rect.left
                elif movex < 0:
                    self.box.left = rect.right
                if movey > 0:
                    self.box.bottom = rect.top
                elif movey <0:
                    self.box.top = rect.bottom
            self.x = self.box.x
            self.y = self.box.y


Once you have done that, let me know what happens when you try and run it.
  
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
Page 1 of 1
» All times are UTC - 5 Hours
 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

 

Advertisement