How to make collisions with rects in pygame

14 views Asked by At

I'm making my first game in pygame for a school project, and I need to make the players stand in platforms. I'm trying to make collisions using rects, but it isn't working. I've seen a lot of tutorials, but I don't understand what is wrong with my code.

I tried to make a rect in both the players and in the platform, but the collision doesn't work. (I put "print" inside the collision block just to check if it was working).

import pygame as pg

pg.init()

playerwaterimg = pg.image.load("waterboy.png")
playerfireimg = pg.image.load("firegirl.png")
paredeimg = pg.image.load("pedra.jpg")


playerwater = pg.transform.scale(playerwaterimg, (60, 85))
playerfire = pg.transform.scale(playerfireimg, (75, 80))
parede1 = pg.transform.scale(paredeimg, (1366, 30))
parede2 = pg.transform.scale(paredeimg, (30, 768))
parede3 = pg.transform.scale(paredeimg, (30, 768))
parede4 = pg.transform.scale(paredeimg, (1366, 30))
parede5 = pg.transform.scale(paredeimg, (1000, 30))

playerwaterloc = [50, 738 - 60]
playerfireloc = [100, 738 - 75]


rectwater = playerwater.get_rect()
rectfire = playerfire.get_rect()
rectparede5 = parede5.get_rect(topleft = (0, 540))
rectwater.topleft = (playerwaterloc[0], playerwaterloc[1])
rectfire.topleft = (playerfireloc[0], playerfireloc[1])
rectparede5.topleft = (0, 540)


ecratam = (1366, 768)
fundoimagem = pg.image.load("background.jpg")
fundo = pg.transform.scale(fundoimagem, (ecratam[0], ecratam[1]))
ecra = pg.display.set_mode((ecratam[0], ecratam[1]), pg.FULLSCREEN)
clock = pg.time.Clock()

saltarfire = False
saltarwater = False
saltonumfire = 10
saltonumwater = 10


while True:
    clock.tick(60)
    for evento in pg.event.get():
        if evento.type == pg.QUIT:
            pg.quit()
            exit()

    ecra.blit(fundo, (0, 0))

    ecra.blit(playerwater, (playerwaterloc[0], playerwaterloc[1]))
    ecra.blit(playerfire, (playerfireloc[0], playerfireloc[1]))


    ecra.blit(parede1, (0, 738))
    ecra.blit(parede2, (0, 0))
    ecra.blit(parede3, (1336, 0))
    ecra.blit(parede4, (0, 0))
    ecra.blit(parede5, (0, 540))
    
    
    teclas = pg.key.get_pressed()
    
    if teclas[pg.K_LEFT]:
        playerfireloc[0] -= 3

    if teclas[pg.K_RIGHT]:
        playerfireloc[0] += 3

    if not(saltarfire):
        
        if teclas[pg.K_UP]:
            saltarfire = True

        if teclas[pg.K_DOWN]:
            playerfireloc[1] += 3
    
    else:

        if saltonumfire >= -10:
            playerfireloc[1] -= (saltonumfire * abs(saltonumfire)) * 0.3
            saltonumfire -= 0.5
        else:
            saltonumfire = 10
            saltarfire = False



    if teclas[pg.K_a]:
        playerwaterloc[0] -= 3

    if teclas[pg.K_d]:
        playerwaterloc[0] += 3

    if not(saltarwater):
        
        if teclas[pg.K_w]:
            saltarwater = True

        if teclas[pg.K_s]:
            playerwaterloc[1] += 3
    
    else:

        if saltonumwater >= -10:
            playerwaterloc[1] -= (saltonumwater * abs(saltonumwater)) * 0.3
            saltonumwater -= 0.5
        else:
            saltonumwater = 10
            saltarwater = False



    if playerfireloc[1] > ecratam[1] - playerfire.get_height() - parede1.get_height():
        playerfireloc[1] = ecratam[1] - playerfire.get_height() - parede1.get_height()

    if playerwaterloc[1] > ecratam[1] - playerwater.get_height() - parede1.get_height():
        playerwaterloc[1] = ecratam[1] - playerwater.get_height() - parede1.get_height()

    if playerfireloc[1] < parede4.get_height():
        playerfireloc[1] = parede4.get_height()

    if playerwaterloc[1] < parede4.get_height():
        playerwaterloc[1] = parede4.get_height()

    if playerfireloc[0] < parede2.get_width():
        playerfireloc[0] = parede2.get_width()

    if playerwaterloc[0] < parede2.get_width():
        playerwaterloc[0] = parede2.get_width()

    if playerfireloc[0] > ecratam[0] - playerfire.get_width() - parede3.get_width():
        playerfireloc[0] = ecratam[0] - playerfire.get_width() - parede3.get_width()

    if playerwaterloc[0] > ecratam[0] - playerwater.get_width() - parede3.get_width():
        playerwaterloc[0] = ecratam[0] - playerwater.get_width() - parede3.get_width()

    

    if rectwater.colliderect(rectparede5):
        print("Collision")



    pg.display.update()
    
0

There are 0 answers