当我运行以下代码时,玩家移动会按预期进行,直到你撞到墙上并传送到它上面。我真的很想知道如何解决这个问题。我关注了这个视频 https://www.youtube.com/watch?v=a_YTklVVNoQ 并尝试将其实现到我的代码中,但它没有按预期工作。我该如何解决这个问题?
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()