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.
Viewing post in Ask a Professional Game Dev
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