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

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

How to get multiresult with multicondition in Sql Server -