如何在 pygame 中正确编写平台游戏物理代码?

问题描述 投票:0回答:0

当我运行以下代码时,玩家移动会按预期进行,直到你撞到墙上并传送到它上面。我真的很想知道如何解决这个问题。我关注了这个视频 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()
python pygame game-physics
© www.soinside.com 2019 - 2024. All rights reserved.