pygame - Multiple wall collisions in python -
i creating piece of code involves maze , doors open when button hit. problem when put in doors player collision detects doors no longer detects maze. have put code down on here in hopes if people can see other problems can :)
import pygame, sys, random, time #setting colours black = (0,0,0) white = (255,255,255) blue = (0,0,255) green = (0,255,0) red = (255,0,0) orange = (248,100,1) slateg = (112,128,144) pink = (255,20,147) dturq = (0,206,209) honeyd = (240,255,240) maroon = (128,0,0) goldenrod = (218,165,32) sgreen = (0,255,127) fus = (255,0,255) class player(pygame.sprite.sprite): change_x=0 change_y=0 #initialise class def __init__(self,x,y): pygame.sprite.sprite.__init__(self) #the player 13x13 self.image = pygame.surface([13,13]) self.image.fill(maroon) self.rect = self.image.get_rect() self.rect.top = y self.rect.left = x def changespeed(self,x,y): #this function changes speed of player self.change_x+=x self.change_y+=y def updatewall(self,walls): #this collision detection function old_x=self.rect.left new_x = old_x+self.change_x self.rect.left = new_x collide = pygame.sprite.spritecollide(self,walls,false) if collide: self.rect.left = old_x old_y = self.rect.top new_y = old_y+self.change_y self.rect.top = new_y collide = pygame.sprite.spritecollide(self,walls,false) if collide: self.rect.top = old_y def updatebarrier1(self,barriers): gx=self.rect.left nx = gx+self.change_x self.rect.left = nx collide = pygame.sprite.spritecollide(self,barriers,false) if collide: self.rect.left = gx gy = self.rect.top ny = gy+self.change_y self.rect.top = ny collide = pygame.sprite.spritecollide(self,barriers,false) if collide: self.rect.top = gy class wall(pygame.sprite.sprite): def __init__(self,x,y,width,height,color): #this sets x/y coordinates, width , height , colour of wall pygame.sprite.sprite.__init__(self) #how big wall self.image = pygame.surface([width,height]) #what colour wall self.image.fill(color) #initialising x/y coordinates self.rect = self.image.get_rect() self.rect.top = y self.rect.left = x class bar(pygame.sprite.sprite): def __init__(self,x,y,width,height,color): pygame.sprite.sprite.__init__(self) self.image = pygame.surface([width,height]) self.image.fill(color) self.rect = self.image.get_rect() self.rect.top = y self.rect.left = x class button(pygame.sprite.sprite): def __init__(self,x,y,width,height,color): pygame.sprite.sprite.__init__(self) self.image = pygame.surface([width,height]) #the buttons dimensions self.image.fill(color) #colour of button #x/y coordinates self.rect = self.image.get_rect() self.rect.top=y self.rect.left=x #setting walls maze def maze1(): wall_list = pygame.sprite.renderplain() #walls of maze walls = [[0,0,20,390,goldenrod],[0,410,20,390,goldenrod],[0,0,1000,20,goldenrod], [980,0,20,800,goldenrod],[0,780,980,20,goldenrod],[20,40,940,10,dturq], [950,40,10,350,dturq],[950,410,10,350,dturq],[40,750,370,10,dturq], [430,570,10,210,dturq],[430,570,240,10,dturq],[660,570,10,210,dturq], [690,550,10,210,dturq],[690,750,260,10,dturq],[400,550,10,210,dturq], [40,410,10,350,dturq],[20,100,30,10,dturq], [40,100,10,290,dturq], [50,410,460,10,green],[50,380,350,10,green],[430,380,100,10,green], [530,380,10,100,green],[500,410,10,100,green],[500,510,60,10,green], [550,510,10,30,green],[580,510,10,30,green],[400,540,160,10,dturq], [580,540,120,10,dturq],[530,480,150,10,green],[680,430,10,60,green], [580,510,130,10,green],[710,460,10,60,green],[680,430,250,10,green], [710,460,190,10,green],[920,430,10,300,green],[890,460,10,230,green], [820,720,100,10,green],[820,690,80,10,green],[810,690,10,40,green], [550,410,400,10,sgreen],[550,210,10,200,sgreen],[250,210,300,10,sgreen], [250,210,10,120,sgreen],[250,330,180,10,sgreen],[430,330,10,50,sgreen], [580,380,370,10,sgreen],[580,180,10,200,sgreen],[220,180,360,10,sgreen], [220,180,10,180,sgreen],[220,360,180,10,sgreen],[390,360,10,20,sgreen]] item in walls: wall = wall(item[0],item[1],item[2],item[3],item[4]) wall_list.add(wall) return wall_list def barrierwhite(): barriers = pygame.sprite.renderplain() barrier = [[500,540,10,40,white],[400,180,10,40,white]] item in barrier: barrie = bar(item[0],item[1],item[2],item[3],item[4]) barriers.add(barrie) return barriers def barrierpink(): wall_list = pygame.sprite.renderplain() walls = [[550,520,40,10,pink],[20,600,30,10,pink],[300,380,10,40,pink]] item in walls: wall = wall(item[0],item[1],item[2],item[3],item[4]) wall_list.add(wall) return wall_list def buttons(): #creating buttons buttons = pygame.sprite.renderplain() button1 = [[965,765,10,10,white]] item in button1: button = button(item[0],item[1],item[2],item[3],item[4]) buttons.add(button) return buttons def pinkbutton(): pinkb = pygame.sprite.renderplain() b = [[835,705,10,10,pink]] item in b: button = button(item[0],item[1],item[2],item[3],item[4]) pinkb.add(button) return pinkb #main line pygame.init() window = pygame.display.set_mode([1000,800]) background = pygame.surface(window.get_size()) background = background.convert() background.fill(black) player = player(25,25) movingsprt = pygame.sprite.renderplain() movingsprt.add(player) clock = pygame.time.clock() wall_list = maze1() barriers = barrierwhite() buttons = buttons() b1 = pinkbutton() done = false while done == false: event in pygame.event.get(): if event.type == pygame.quit: done = true #this makes player move if event.type == pygame.keydown: if event.key == pygame.k_left: player.changespeed(-6,0) if event.key == pygame.k_right: player.changespeed(6,0) if event.key == pygame.k_up: player.changespeed(0,-6) if event.key == pygame.k_down: player.changespeed(0,6) #this stops player moving if event.type == pygame.keyup: if event.key == pygame.k_left: player.changespeed(6,0) if event.key == pygame.k_right: player.changespeed(-6,0) if event.key == pygame.k_up: player.changespeed(0,6) if event.key == pygame.k_down: player.changespeed(0,-6) player.updatewall(wall_list) player.updatebarrier1(barriers) window.fill(black) movingsprt.draw(window) barriers.draw(window) wall_list.draw(window) buttons.draw(window) b1.draw(window) pygame.display.flip() clock.tick(40) pygame.quit() also if tell me how put countdown timer disable player , display game on sign awesome :d
adding doors (or barriers call them in code) makes wall collision ineffective because of design problem in game.
here's in main loop:
player.updatewall(wall_list) player.updatebarrier1(barriers) you first check collisions wall, check again collisions barriers. problem incorporated part makes character move in updatewall , updatebarrier1 methods.
so instance, if character collides wall, not door, character still move because updatebarrier1 method not detect collision barrier (door) , make him move.
instead, should methods called collides_wall , collides_barrier return true or false , replace 2 quoted lines by:
if not player.collides_wall(wall_list) , not player.collides_barriers(barriers): player.move() with move method move player in updatesomething methods.
note: pointed out in comments don't need 2 separate methods walls , barriers collision, because both sprites , same operations on both of them. add collides method.
Comments
Post a Comment