How Can I Make My Players Rect Collide On The Sides And Bottom Of My Enemys Rect? Pygame

Viewed 161

I am trying to make my players rect collide with my enemys rect on the sides and bottom so the player rect doesnt go throw the enemys rect but I am not sure why it keeps teleporting me up its not working at all VIDEo << as you can see in the video any help is appreciated I just need my rect to not go throw or go up when I collid on the sides

my collision part


    playerman.isJump = False
    collide = False
    for platform in platforms:
        if playerman.rect.colliderect(platform.rect):
            collide = True
            playerman.isJump = False
            playerman.y = platform.rect.top - playerman.height + 1
            if playerman.rect.right > platform.rect.left and playerman.rect.left < platform.rect.left - playerman.width:
                playerman.x = platform.rect.left - playerman.width
            if playerman.rect.left < platform.rect.right and playerman.rect.right > platform.rect.right + playerman.width:
                playerman.x = platform.rect.right



there is no images only squares you could test the code

import pygame,random

window = pygame.display.set_mode((800,800), pygame.NOFRAME)

# player factory
class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.speed = 4
        self.fall = 0
        self.isJump = False
        self.jumpCount = 10
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

# player factory
class platform:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)


white = (255,255,255)
platform1 = platform(590,590,60,60,white)

platforms = [platform1]

# make the player
pink = (205,105,205)
playerman = player(300,300,60,60,pink)



# the game fps
clock = pygame.time.Clock()
FPS = 30

def keyevents():
    if keys[pygame.K_w]:
        playerman.y -= playerman.speed

    if keys[pygame.K_s]:
        playerman.y += playerman.speed

    if keys[pygame.K_d]:
        playerman.x += playerman.speed

    if keys[pygame.K_a]:
        playerman.x -= playerman.speed

    if keys[pygame.K_SPACE]:
        playerman.isJump = True



                
def jump():
    if playerman.isJump:
        if playerman.jumpCount >= -10:
            neg = 1
            if playerman.jumpCount < 0:
                neg = -1
            playerman.y -= playerman.jumpCount**2 * 0.5 * neg
            playerman.jumpCount -= 1
        else:
            playerman.isJump = False
            playerman.jumpCount = 10

    collide = False        # this makes the player fall down up to 
         # move the player
    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        playerman.isJump = False
                    
        if playerman.rect.bottom >= 680:
            collide = True
            playerman.isJump = False
            playerman.JumpCount = 10
            playerman.y = 680 - playerman.height

        if collide:
            if keys[pygame.K_SPACE]:
                playerman.isJump = True
            playerman.fall = 0




# redraw the window
def redraw():
    playerman.draw()
    platform.draw()
# main loop
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runningggame = False

    # key event
    keys = pygame.key.get_pressed()

    # this is the key events
    keyevents()

    jump() # JUMP AND COLLISION on the grawn

    playerman.isJump = False
    collide = False
    for platform in platforms:
        if playerman.rect.colliderect(platform.rect):
            collide = True
            playerman.isJump = False
            playerman.y = platform.rect.top - playerman.height + 1
            if playerman.rect.right > platform.rect.left and playerman.rect.left < platform.rect.left - playerman.width:
                playerman.x = platform.rect.left - playerman.width
            if playerman.rect.left < platform.rect.right and playerman.rect.right > platform.rect.right + playerman.width:
                playerman.x = platform.rect.right





    window.fill((0,0,0))
    redraw()
    pygame.display.update()
pygame.quit()

I am just looking for a basic collision ones I touch my enemys rect left and right and bottom it wont go throw and if I collide on the top it lets my player stand on it

2 Answers

I have finally succeeded in making the solution! Here some code that allows everything to work correctly. If you like I can describe to you in a chat the changes I've made and what they do. Note that I programmed this in Python 3 so you may need to make some changes for it to work in Python 2.

import pygame,random

window = pygame.display.set_mode((800,800), pygame.NOFRAME)

# player factory
class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.moveleft = True
        self.moveright = True
        self.color = color
        self.speed = 4
        self.fall = 0
        self.isJump = False
        self.jumpCount = 10
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)

# player factory
class platform:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window,self.color,self.rect)


white = (255,255,255)
platform1 = platform(590,590,60,60,white)

platforms = [platform1]

# make the player
pink = (205,105,205)
playerman = player(300,300,60,60,pink)



# the game fps
clock = pygame.time.Clock()
FPS = 30

def keyevents():
    if keys[pygame.K_w]:
        playerman.y -= playerman.speed

    if keys[pygame.K_s]:
        playerman.y += playerman.speed

    if keys[pygame.K_d]:
        if playerman.moveright:
            playerman.x += playerman.speed    

    if keys[pygame.K_a]:
        if playerman.moveleft:
            playerman.x -= playerman.speed

    if keys[pygame.K_SPACE]:
        playerman.isJump = True



                
def jump():
    if playerman.isJump:
        if playerman.jumpCount >= -10:
            neg = 1
            if playerman.jumpCount < 0:
                neg = -1
            playerman.y -= playerman.jumpCount**2 * 0.5 * neg
            playerman.jumpCount -= 1
        else:
            playerman.isJump = False
            playerman.jumpCount = 10

    collide = False        # this makes the player fall down up to 
         # move the player
    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        playerman.isJump = False
                    
        if playerman.rect.bottom >= 680:
            collide = True
            playerman.isJump = False
            playerman.JumpCount = 10
            playerman.y = 680 - playerman.height

        if collide:
            if keys[pygame.K_SPACE]:
                playerman.isJump = True
            playerman.fall = 0




# redraw the window
def redraw():
    playerman.draw()
    platform.draw()
# main loop
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runningggame = False

    # key event
    keys = pygame.key.get_pressed()

    # this is the key events
    keyevents()

    jump() # JUMP AND COLLISION on the grawn

    playerman.isJump = False
    collide = False
    for platform in platforms:
        if playerman.rect.colliderect(platform.rect):
            collide = True
            playerman.isJump = False
            if (platform.rect.collidepoint(playerman.rect.right, playerman.rect.bottom) or
                platform.rect.collidepoint(playerman.rect.left, playerman.rect.bottom)):
                playerman.y = platform.rect.top - playerman.height + 1
                playerman.moveright = True
                playerman.moveleft = True
            
            if (platform.rect.collidepoint(playerman.rect.right, playerman.rect.top) or
                platform.rect.collidepoint(playerman.rect.right, playerman.rect.bottom - 10)):
                playerman.moveright = False
            elif (platform.rect.collidepoint(playerman.rect.left, playerman.rect.top) or
                  platform.rect.collidepoint(playerman.rect.left, playerman.rect.bottom - 10)):
                playerman.moveleft = False
        else:
            playerman.moveright = True
            playerman.moveleft = True
                
                

    window.fill((0,0,0))
    redraw()
    pygame.display.update()
pygame.quit()

To have the post-collision speed to be the same you should do self.speed = -self.speed but you could also add a custom amount to speed to speed even more and subtract even more to make a faster speed after a collision. (This adds even more speed customisation)

Related