1

When I run the following code the player movement works as expected until you run into the wall and teleport on top of it. I'm really scratching my head on how to fix this. I followed this video https://www.youtube.com/watch?v=a_YTklVVNoQ and tried to implement it into my code but it isn't working as expected. How do I fix this?

import pygame, sys, math
from pygame.math import Vector2

pygame.init()
WIDTH, HEIGHT = 1000, 850
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

gameObjects = []

class GameObject:
    def __init__(self,pos,color,size,velo=Vector2(0,0)):
        self.pos = pos
        self.velo = velo
        self.color = color
        self.size = size
        self.rect = pygame.Rect(self.pos.x,self.pos.y,self.size[0],self.size[1])
        gameObjects.append(self)
    def DrawObject(self):
        self.rect = pygame.Rect(self.pos.x,self.pos.y,self.size[0],self.size[1])
        pygame.draw.rect(screen, self.color, self.rect)
    def Move(self, x, y):
        self.pos.x += x
        self.pos.y -= y
    def Center(self):
        self.pos.x = (WIDTH/2)-(self.size[0]/2)
        self.pos.y = (HEIGHT/2)-(self.size[1]/2)
    def Physics(self, gravity, friction):
        
        self.pos.y -= self.velo.y
        for gameObject in gameObjects:
            if gameObject != self:
                if self.rect.colliderect(gameObject.rect):
                    print("Collision")
                    if self.velo.y < 0:
                        self.pos.y = gameObject.pos.y+gameObject.size[1]+2
                        self.velo.y = 0
                    if self.velo.y > 0:
                        self.pos.y = gameObject.pos.y-self.size[1]-2
                        self.velo.y = 0
        self.velo.y+=gravity

        self.pos.x += self.velo.x
        for gameObject in gameObjects:
            if gameObject != self:
                if self.rect.colliderect(gameObject.rect):
                    if self.velo.x > 0:
                        self.rect.right = gameObject.rect.left
                    if self.velo.x < 0:
                        self.rect.left = gameObject.rect.right
        self.velo.x*=friction


    def GetDistance(self, gameObject):
        a = self.pos.x - gameObject.pos.x
        b = self.pos.y - gameObject.pos.y
        c = math.abs(math.sqrt((a*a)+(b*b)))

def DrawObjects(gameObjects):
    screen.fill((50,140,219))
    for gameObject in gameObjects:
        gameObject.DrawObject()

def DrawText(size,text,color,x,y):
    font = pygame.font.SysFont(None, size)
    img = font.render(text, True, color)
    screen.blit(img, (x,y))

player = GameObject(Vector2(0,0),(255, 170, 0),(30,30))
floor = GameObject(Vector2(0,810),(65,153,6),(1000,100))
wall = GameObject(Vector2(800,500),(65,153,6),(80,500))

def Play():
    player.Center()

    while True:
        for  event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.K_ESCAPE:
                MainMenu()
            if event.type == pygame.KEYDOWN:
                pass
            keys = pygame.key.get_pressed()
            if keys[pygame.K_UP]:
                player.pos.y += 10
                if player.rect.colliderect(floor.rect):
                    player.velo.y = 20
                player.pos.y -= 10
            if keys[pygame.K_LEFT]:
                player.velo.x = -10
            if keys[pygame.K_RIGHT]:
                player.velo.x = 10

        DrawObjects(gameObjects)
        player.Physics(1,0.8)
            
        pygame.display.update()
        clock.tick(60)

def MainMenu():


    playButton = pygame.Rect(450, 410, 100, 30)

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if event.button == 1:
                    if playButton.collidepoint(pygame.mouse.get_pos()):
                        Play()
        
        pygame.draw.rect(screen, (230,0,0), playButton)
        DrawText(50,"Play!",(255,255,255),458,410)

        pygame.display.update()
        clock.tick(60)

Play()

0 Answers0