【问题标题】:How to make gravity function in pygame?如何在pygame中制作重力功能?
【发布时间】:2020-07-03 18:20:55
【问题描述】:

无法在 pygame 中移动玩家

所以,我试图在 pygame 中创建一个简单的物理系统。我的主要目标是添加一个 Y 重力功能,它会在激活时移动玩家。我已经尝试过几次让它工作,但我想我错过了一些东西。

代码如下:

class Physic:
    def __init__(self, color, master, type, sizeX, sizeY, pos=[0,0]):
        self.master = master
        self.color = color
        self.type = type
        self.sizeX = sizeX
        self.sizeY = sizeY
        self.x = pos[0]
        self.y = pos[1]

        self.moveX = 0
        self.moveY = 0

        self.create_Object()


    def create_Object(self):
        if self.type == 'rect':
            self.rect()

    def rect(self):
        return pygame.draw.rect(self.master, self.color, (self.x, self.y, self.sizeX, self.sizeY))

    def drag(self):
        for event in pygame.event.get():
            if event.type == pygame.mouse.get_pressed()[0]:
                self.x = pygame.mouse.get_pos()

    def add_gravity(self):
        self.moveY += 3.2
        self.update_pos()

    def update_pos(self):
        self.y += self.moveY
        self.x += self.moveX

在主脚本中我写了这个:

def game():
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()


        screen.fill(WHITE)

        player = object.Physic(BLUE, screen, 'rect', 50, 50, [POS[0], POS[1]])
        player.add_gravity()

        # platform = object.rect(screen, RED, [30, 30], 100, 30)


        # physics.add_collider(player, platform, POS[0])

        pygame.display.update()


game()

你知道我错过了什么吗?

【问题讨论】:

  • 我相信你只是在更新 self.y 而不是 pos 本身,尝试打印 pos 值看看它是否正在更新。

标签: python function oop pygame gravity


【解决方案1】:

你的大问题是你在主循环内的每一次通过都在重新创建玩家,所以它看起来就像被冻结在原地一样。

您还需要对帧速率进行限制,以便您控制游戏的速度,从而可以正确设置每帧的加速度。

还有一些其他小问题需要修复才能运行。我试图更改运行它的最低限度,因为重点是修复错误而不是重写它。显然我必须在它周围添加一些包装代码

试试这个稍微调整过的版本:

#!/usr/bin/env python

import traceback
import pygame
import sys

FRAME_RATE = 60
GRAVITY = 32

SCREEN_SIZE = (600, 800)

WHITE = pygame.Color("white")
BLUE = pygame.Color("blue")

POS = (100, 600)

class Physic:
    def __init__(self, color, master, type, sizeX, sizeY, pos=(0,0)):
        self.master = master
        self.color = color
        self.type = type
        self.sizeX = sizeX
        self.sizeY = sizeY
        self.x = pos[0]
        self.y = pos[1]

        self.moveX = 0
        self.moveY = 0

        self.create_Object()


    def create_Object(self):
        if self.type == 'rect':
            self.draw()

    def draw(self):
        return pygame.draw.rect(self.master, self.color, (self.x, self.y, self.sizeX, self.sizeY))

    def drag(self):
        for event in pygame.event.get():
            #if event.type == pygame.mouse.get_pressed()[0]:    <--- remove this
            if event.type == pygame.MOUSEBUTTONDOWN:
                self.x = pygame.mouse.get_pos()

    def add_gravity(self):
        self.moveY += GRAVITY / FRAME_RATE
        self.update_pos()

    def update_pos(self):
        self.y += self.moveY
        self.x += self.moveX

def game():
    
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE)

    clock = pygame.time.Clock()
    
    player = Physic(BLUE, screen, 'rect', 50, 50, POS)
    # I added this to illustrate the gravity better ... going up and down
    player.moveY = -25
    player.moveX = 2

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                return


        screen.fill(WHITE)

        player.add_gravity()

        player.draw()

        # platform = object.rect(screen, RED, [30, 30], 100, 30)


        # physics.add_collider(player, platform, POS[0])

        pygame.display.update()

        clock.tick(FRAME_RATE)



def main():
    
    try:
        game()

    except Exception as ex:
        print(traceback.format_exc())
        raise

    finally:
        # game exit cleanup stuff
        pygame.quit()


if __name__ == '__main__':
    main()

我想指出的一个问题,虽然它不影响这里的代码。在方法中定义可选/命名参数时,不应使用不可变对象(如列表)作为默认值。 IE。在Physic__init__() 中,我将pos=[0,0] 更改为pos=(0,0)。这里没什么大不了的,但是如果您将它分配给一个 var,然后尝试更改它,可能会导致非常奇怪的错误。它会对对象的其他实例产生影响,因为它们实际上共享默认初始化对象,并且如果它被其中一个修改,它会发生在所有实例中!

【讨论】:

  • 谢谢,我去试试。我刚开始编程,还有很多东西要学。
  • 我现在测试了它。它按照我的意愿完美运行,我可以很容易地理解这个问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
相关资源
最近更新 更多