1

Is there some reason why my pieces are detecting a collision in the play function?

When I print out the location of the pieces, they say that they are in the correct place, but the collision is not picking up on it for some reason.

import pygame
import os
import random

pygame.mixer.pre_init(44100, -16, 1, 512)
pygame.init()
pygame.display.init()

font = pygame.font.SysFont("times", 20)

black = (0,0,0)

class Wall(pygame.sprite.Sprite):
    def __init__(self, color, x, y, width, height):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((width, height))
        self.image.fill(pygame.color.Color(color))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

class Player(pygame.sprite.Sprite):
    def __init__(self, image):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.image.load("coin.jpg")
        self.image = pygame.transform.scale(self.image, (20,20))
        self.rect = self.image.get_rect()

###############################################################################
#intializeing class

class PygameGame(object):
    def init(self): 
        self.mode = 'home'
        self.prevMode = 'home'
        self.homeFunctions = {'keyPressed':self.homeKeyPressed,
                            'keyReleased':self.homeKeyReleased,
                            'mousePressed':self.homeMousePressed,
                            'mousePosition':self.homeMousePosition,
                            'redrawAll':self.homeRedrawAll,
                            'timerFired':self.homeTimerFired
                            }
        self.pausedFunctions = {'keyPressed':self.pausedKeyPressed,
                            'keyReleased':self.pausedKeyReleased,
                            'mousePressed':self.pausedMousePressed,
                            'mousePosition':self.pausedMousePosition,
                            'redrawAll':self.pausedRedrawAll,
                            'timerFired':self.pausedTimerFired
                            }
        self.playFunctions = {'keyPressed':self.playKeyPressed,
                            'keyReleased':self.playKeyReleased,
                            'mousePressed':self.playMousePressed,
                            'mousePosition':self.playMousePosition,
                            'mouseMotion': self.playMouseMotion,
                            'redrawAll':self.playRedrawAll,
                            'timerFired':self.playTimerFired
                            }
        self.instructionFunctions = {'keyPressed':self.instructKeyPressed,
                                    'keyReleased':self.instructKeyReleased,
                                    'mousePressed':self.instructMousePressed,
                                    'mousePosition':self.instructMousePosition,
                                    'redrawAll':self.instructRedrawAll,
                                    'timerFired':self.instructTimerFired
                                    }

        self.textSize = 20

        self.players = pygame.sprite.Group()
        self.walls = pygame.sprite.Group()
        self.allSprites = pygame.sprite.Group()

        self.player = Player("coin.jpg")
        self.wallOne = Wall('black', self.width//4, self.height//4, 10, 20)

        self.walls.add(self.wallOne)
        self.players.add(self.player)
        self.allSprites.add(self.wallOne, self.player)


        self.collide = pygame.sprite.collide_rect(self.wallOne, self.player)

##############################################################################
## home

    def homeMousePressed(self, x, y):
        self.mode = 'play'

    def homeMousePosition(self, x, y):
        pass

    def homeKeyPressed(self, keyCode):
        pass

    def homeKeyReleased(self, keyCode):
        pass

    def homeTimerFired(self, dt):
        pass

    def homeRedrawAll(self, screen):
        #title
        text = "Omega"
        title = font.render(text, False, (0,0,0))
        centered = title.get_rect(center=(self.width//2, self.height//2)) 
        screen.blit(title, (centered))
        #how to play
        text = "click to play"
        title = font.render(text, False, (255,0,0))
        centered = title.get_rect(center=(self.width//2, self.height//2+2*self.textSize)) 
        screen.blit(title, (centered))


###############################################################################      
#play

    def playMousePressed(self, x, y):
        pass

    def playMouseMotion(self, x, y):
        pass

    def playMousePosition(self, x, y):
        pass

    def playKeyPressed(self, keyCode):
        print(self.collide)
        print("playerY= ", self.player.rect.y)
        print("playerX= ", self.player.rect.x)
        print("WallX,Y= ", self.width//4, self.height//4)
        print("********************************")
        if self.collide:
            print("made it")
        else:
            if keyCode == pygame.K_s:
                self.player.rect.y += 5
            if keyCode == pygame.K_w:
                self.player.rect.y -= 5
            if keyCode == pygame.K_a:
                self.player.rect.x -= 5
            if keyCode == pygame.K_d:
                self.player.rect.x += 5

    def playKeyReleased(self, keyCode):
        pass

    def playTimerFired(self, dt):
        pass

    def playRedrawAll(self, screen):
        self.allSprites.draw(screen)
        self.allSprites.update() 

##############################################################################
#paused 

    def pausedMousePressed(self, x, y):
        pass

    def pausedMousePosition(self, x, y):
        pass

    def pausedKeyPressed(self, keyCode):
        pass

    def pausedKeyReleased(self, keyCode):
        pass

    def pausedTimerFired(self, dt):
        pass

    def pausedRedrawAll(self, screen):
        pass


###############################################################################
#Instructions

    def instructMousePressed(self, x, y):
        pass

    def instructMousePosition(self, x, y):
        pass

    def instructKeyPressed(self, keyCode):
        pass

    def instructKeyReleased(self, keyCode):
        pass

    def instructTimerFired(self, dt):
        pass

    def instructRedrawAll(self, screen):
        pass        


################################################################################
#big stuff below

    def isKeyPressed(self, key):
        ''' return whether a specific key is being held '''
        return self._keys.get(key, False)

    def __init__(self, width=900, height=500, fps=100, title="112 Pygame Game"):
        self.width = 400
        self.height = 400
        self.fps = fps
        self.title = title
        self.bgColor = (255, 255, 255)
        pygame.init()

    def doLoop(self,func,time,screen):
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
                func['mousePressed'](*(event.pos))

            elif (event.type == pygame.MOUSEMOTION and
                    event.buttons == (0, 0, 0)):
                func['mousePosition'](*(event.pos))

            elif event.type == pygame.KEYDOWN:
                self._keys[event.key] = True
                func['keyPressed'](event.key)

            elif event.type == pygame.KEYUP:
                self._keys[event.key] = False
                func['keyReleased'](event.key)

            elif event.type == pygame.QUIT:
                self.playing = False
        func['timerFired'](time)
        func['redrawAll'](screen)

##################################################################
    def run(self):

        clock = pygame.time.Clock()
        screen = pygame.display.set_mode((self.width, self.height))
        # set the title of the window
        pygame.display.set_caption(self.title)

        # stores all the keys currently being held down
        self._keys = dict()

        # call game-specific initialization
        self.init()
        self.playing = True
        while self.playing:
            screen.fill(self.bgColor)
            time = clock.tick(self.fps)
            # the 'name' functions are dictionaries that hold the key, mouse and draw func for a mode
            if self.mode == 'home':
                self.doLoop(self.homeFunctions,time,screen)
            elif self.mode == 'paused':
                self.doLoop(self.pausedFunctions,time,screen)
            elif self.mode == 'play':
                self.doLoop(self.playFunctions,time,screen)
            elif self.mode == 'instructions':
                self.doLoop(self.instructionFunctions,time,screen)
            pygame.display.update()

        pygame.quit()

def main():
    game = PygameGame()
    game.run()

if __name__ == '__main__':
    main()
Pang
  • 9,564
  • 146
  • 81
  • 122

1 Answers1

0

You never update self.collide in your while loop, so the value is always the same as in your init method where you assign it the first time. Try to do this every frame: self.collide = pygame.sprite.collide_rect(self.wallOne, self.player).

skrx
  • 19,980
  • 5
  • 34
  • 48