将基础物理实现为简单的 2d pygame(仅限惯性和重力)

Implementing basic physics into a simple 2d pygame (inertia and gravity only)

我不熟悉 pygame 和整个游戏设计。我正在制作一个球跟随光标的游戏。我希望球具有一些物理特性,例如惯性和重力,这样当我将球抛来抛去时,它不仅会与光标成一条直线并停下来。我该怎么做呢 ? (如何添加惯性和重力) 我的精灵:

    class Ball(pg.sprite.Sprite):

    def __init__(self, radius=30):
        super(Ball, self).__init__()
        self.height, self.width = 60, 60
        self.surf = pg.Surface((self.width, self.height))
        self.surf.fill(black)
        self.surf.set_colorkey(black)

        self.rect = self.surf.get_rect()
        self.center = (self.width//2, self.height//2)

        pg.draw.circle(self.surf, white, self.center, radius)

        # Special varis :

        self.velocity = 0

    def update(self, mousepos):
        if mousepos[0] > self.rect.x:
            self.velocity += 1
        if mousepos[0] < self.rect.x:
            self.velocity -= 1

        self.move(self.velocity)

    def move(self, v):
        self.rect.move_ip(v, 0)

        if self.velocity > 0:
            self.velocity -= 0.1
        else:
            self.velocity += 0.1

        # collision detection for edge of screen

        if self.rect.x + self.width > width:
            self.rect.x = width - self.width
            self.velocity = 0

        elif self.rect.x < 0:
            self.rect.x = 0
            self.velocity = 0

        if self.rect.y > height:
            self.rect.y = height

        elif self.rect.y - self.height < 0:
            self.rect.y = self.height

首先,在执行任何形式的 physics 时,请使用向量,而不是标量变量。 这是因为 forces 和引力一样由两个分量构成,FxFyx 分量和 y 分量)。这也适用于 motion 描述符,例如 velocityacceleration.

根据您的代码,您的 velocity 仅存储为 1 变量,这意味着它是一个标量,并且同样影响 xy 组件。这不是真的……你在现实生活中看不到重力影响物体的 x 方向,是吗? (即水平运动),

而只是 y 方向; (即垂直运动)。

将速度存储在两个变量中,velocityXvelocityY。这将使您更好地控制对象移动的方向以及某些力影响对象的方向(例如重力仅影响 y 组件。),从而提高效率和准确性。

当某物相对于其分量位置、方向和大小(大小)进行描述时,这实际上就是向量的含义。

如果你想了解更多,我相信我已经回答了这个here

至于你的问题:把球扔到它周围不只是与光标成一条直线然后停止:

看@p.phidot上面的评论