Luis Dias
Luis Dias

Reputation: 275

Pygame Rectangle and Mouse pos Collidepoint not working

I'm making a basic game where I have a surface and everytime I click on the surface it moves 5 pixels to the right. The program is working just fine without the checkCollide(event) function, but when I put the that condition it doesn't move. What is wrong?

My code until now is this

import pygame, sys
from pygame.locals import *

pygame.init()

DISPLAYSURF = pygame.display.set_mode((300,300))

def checkCollide(event):
    k = 0
    a,b = event.pos
    x = P1[0].get_rect()
    if x.collidepoint(a,b):
        return True
    return False

CP1 = [(150, 150)
      ,(155, 150)
      ,(160, 150)
      ,(165, 150)
      ,(170, 150)
      ,(175, 150)
      ,(180, 150)
      ,(185, 150)
      ,(190, 150)]

statp1_1 = 0

WHITE = (255,255,255)
DISPLAYSURF.fill(WHITE)

while True: # the main game loop
    P1 = [pygame.image.load('PAzul.png'),CP1[statp1_1],statp1_1]
    DISPLAYSURF.blit(P1[0], P1[1])
    e = pygame.event.get()
    for event in e:
        if event.type == MOUSEBUTTONUP:
            a = checkCollide(event)
            if a:
                DISPLAYSURF.fill(WHITE)
                statp1_1 +=1

        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

Thank you

Upvotes: 1

Views: 2834

Answers (3)

skrx
skrx

Reputation: 20438

I've got some tips for you. First store the rect in the P1 list (it contains only the image and the rect in the following example, but maybe you could also add the statp1_1 index to it). Now we can just move this rect, if the user clicks on it (in the example I set the topleft attribute to the next point). Read the comments for some more tips. One thing you need to fix is to prevent the game from crashing when the statp1_1 index gets too big.

import sys
import pygame


pygame.init()

DISPLAYSURF = pygame.display.set_mode((300, 300))

WHITE = (255, 255, 255)
# Don't load images in your while loop, otherwise they have to
# be loaded again and again from your hard drive.
# Also, convert loaded images to improve the performance.
P1_IMAGE = pygame.image.load('PAzul.png').convert()  # or .convert_alpha()

# Look up `list comprehension` if you don't know what this is.
CP1 = [(150+x, 150) for x in range(0, 41, 5)]

statp1_1 = 0
# Now P1 just contains the image and the rect which stores the position.
P1 = [P1_IMAGE, P1_IMAGE.get_rect(topleft=CP1[statp1_1])]

clock = pygame.time.Clock()  # Use this clock to limit the frame rate.

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONUP:
            if P1[1].collidepoint(event.pos):
                print('clicked')
                statp1_1 += 1
                # Set the rect.topleft attribute to CP1[statp1_1].
                P1[1].topleft = CP1[statp1_1]

    DISPLAYSURF.fill(WHITE)
    DISPLAYSURF.blit(P1[0], P1[1])  # Blit image at rect.topleft.

    pygame.display.update()
    clock.tick(30)  # Limit frame rate to 30 fps.

Upvotes: 1

Luis Dias
Luis Dias

Reputation: 275

I just realized what was wrong. When I do x = P1[0].get_rect() it creates a surface with topleft at (0,0). What I needed to do was change the position of the rectangle using x.topleft = P1[1]

Upvotes: 1

William
William

Reputation: 154

Check your logic in these lines of your function:

x = P1[0][0].get_rect()
if x.collidepoint(a,b):
    return True
return False

Your code hinges on this bit:

a = checkCollide(event)
if a:
    DISPLAYSURF.fill(WHITE)

So you're never evaluating this piece to be true.

Upvotes: 2

Related Questions