Skip to main content

On Sale: GamesAssetsToolsTabletopComics
Indie game storeFree gamesFun gamesHorror games
Game developmentAssetsComics
SalesBundles
Jobs
TagsGame Engines

I have a problem in Python/Pygame with collisions. Can you help me? I will show the code as a reply if you will or some other way. I would really appreciate the help as I've had this problem for so long and even asked it on StackOverflow but the answer didn't help me and I don't want to ask that question again.

I can take a stab at it. Feel free to post your code in reply or email it to me if you prefer.
I'm heading to bed, but I can look at it tomorrow.

main file (main.py):

import pygame
import normalroom
import im
pygame.init()
WindowWidth = 800
WindowHeight = 600
win = pygame.display.set_mode((WindowWidth, WindowHeight))
display = pygame.Surface((400, 300))
rx = 536.5
ry = 85
scroll = [0, 0]
class Player:    def __init__(self, x, y, width, height):        self.px = x        self.py = y        self.width = width        self.height = height        self.rect = pygame.Rect(x, y, width, height)        self.vel = 5        self.walkCount = 0        self.left = False        self.right = False        self.up = False        self.down = False
    def draw(self, display):        walkLeft = [im.RL1, im.RL2, im.RL3, im.RL4, im.RL5, im.RL6, im.RL7, im.RL8, im.RL9]        walkRight = [im.RR1, im.RR2, im.RR3, im.RR4, im.RR5, im.RR6, im.RR7, im.RR8, im.RR9]        walkUp = [im.RU1, im.RU2, im.RU3, im.RU4, im.RU5, im.RU6, im.RU7, im.RU8, im.RU9]        walkDown = [im.RD1, im.RD2, im.RD3, im.RD4, im.RD5, im.RD6, im.RD7, im.RD8, im.RD9]        char = [im.RS1, im.RS1, im.RS2, im.RS2, im.RS1, im.RS1, im.RS2, im.RS2, im.RS1]
        if self.walkCount + 1 >= 9:            self.walkCount = 0
        if self.left:            display.blit(walkLeft[self.walkCount], (self.px - scroll[0], self.py - scroll[1]))            self.walkCount += 1
        elif self.right:            display.blit(walkRight[self.walkCount], (self.px - scroll[0], self.py - scroll[1]))            self.walkCount += 1
        elif self.down:            display.blit(walkDown[self.walkCount], (self.px - scroll[0], self.py - scroll[1]))            self.walkCount += 1
        elif self.up:            display.blit(walkUp[self.walkCount], (self.px - scroll[0], self.py - scroll[1]))            self.walkCount += 1
        else:            display.blit(char[self.walkCount//3], (self.px - scroll[0], self.py - scroll[1]))            self.walkCount += 1
    def move(self):        keys = pygame.key.get_pressed()
        if keys[pygame.K_a]:            self.px -= self.vel            self.left = True        else:            self.left = False
        if keys[pygame.K_d]:            self.px += self.vel            self.right = True        else:            self.right = False
        if keys[pygame.K_w]:            self.py -= self.vel            self.up = True        else:            self.up = False
        if keys[pygame.K_s]:            self.py += self.vel            self.down = True        else:            self.down = False
        self.rect = pygame.Rect(self.px - scroll[0], self.py - scroll[1], self.width, self.height)        scroll[0] += (self.px - scroll[0] - 192)/10        scroll[1] += (self.py - scroll[1] - 142)/10
def redrawWindow(display, player):    display.fill((100, 100, 100))
    tile_rects = []    y = 0    for row in normalroom.room:        x = 0        for tile in row:            if tile == 0:                pass            elif tile == 1:                display.blit(im.Ground, (x * 64 - scroll[0], y * 64 - scroll[1]))            x += 1        y += 1
    player.draw(display)    pygame.display.update()
def main():    run = True    p = Player(rx, ry, 16, 16)    clock = pygame.time.Clock()
    while run:
        clock.tick(25)        for event in pygame.event.get():            if event.type == pygame.QUIT:                run = False                pygame.quit()
        p.move()        win.blit(pygame.transform.scale(display, (WindowWidth, WindowHeight)), (0, 0))        redrawWindow(display, p)
main()

image file (im.py):

import pygame
RS1 = pygame.image.load("RS1.png")
RS2 = pygame.image.load("RS2.png")
RR1 = pygame.image.load("RR1.png")
RR2 = pygame.image.load("RR2.png")
RR3 = pygame.image.load("RR3.png")
RR4 = pygame.image.load("RR4.png")
RR5 = pygame.image.load("RR5.png")
RR6 = pygame.image.load("RR6.png")
RR7 = pygame.image.load("RR7.png")
RR8 = pygame.image.load("RR8.png")
RR9 = pygame.image.load("RR9.png")
RL1 = pygame.transform.flip(RR1, True, False)
RL2 = pygame.transform.flip(RR2, True, False)
RL3 = pygame.transform.flip(RR3, True, False)
RL4 = pygame.transform.flip(RR4, True, False)
RL5 = pygame.transform.flip(RR5, True, False)
RL6 = pygame.transform.flip(RR6, True, False)
RL7 = pygame.transform.flip(RR7, True, False)
RL8 = pygame.transform.flip(RR8, True, False)
RL9 = pygame.transform.flip(RR9, True, False)
RD1 = pygame.image.load("RD1.png")
RD2 = pygame.image.load("RD2.png")
RD3 = pygame.image.load("RD3.png")
RD4 = pygame.image.load("RD4.png")
RD5 = pygame.image.load("RD5.png")
RD6 = pygame.image.load("RD6.png")
RD7 = pygame.image.load("RD7.png")
RD8 = pygame.image.load("RD8.png")
RD9 = pygame.image.load("RD9.png")
RU1 = pygame.image.load("RU1.png")
RU2 = pygame.image.load("RU2.png")
RU3 = pygame.image.load("RU3.png")
RU4 = pygame.image.load("RU4.png")
RU5 = pygame.image.load("RU5.png")
RU6 = pygame.image.load("RU6.png")
RU7 = pygame.image.load("RU7.png")
RU8 = pygame.image.load("RU8.png")
RU9 = pygame.image.load("RU9.png")
Ground = pygame.image.load("Ground.png")

and the tilemap (normalroom.py):

room = [[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],        [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0],        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0],        [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]]

Now I want the player (Robot) to be able to only walk when he is on the platform/ground and not if he is off of it as the rest is the planet and he only can stay in the base. So he can only walk when he is on the ground (1's in tilemap(64x64)). I hope you can help. I can give you more detail if you need

Hmm...given that Python has an indentation-based syntax, it's hard to tell with this formatting if some of your loops and conditionals are nested or not. There could also be an issue related to how the collision is interplaying with your images, which I can't tell without seeing them.

Can you email the whole project to me to look at? game.professor@yandex.com

Sorry but no. Oof, I didnt even have time for this game jam sadly. Well, I guess I will have to watch more tutorials and change my code-"style" the third time. :/ Thank you anyways