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()