将基础物理实现为简单的 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
和引力一样由两个分量构成,Fx
和 Fy
(x
分量和 y
分量)。这也适用于 motion
描述符,例如 velocity
和 acceleration
.
根据您的代码,您的 velocity
仅存储为 1
变量,这意味着它是一个标量,并且同样影响 x
和 y
组件。这不是真的……你在现实生活中看不到重力影响物体的 x
方向,是吗? (即水平运动),
而只是 y
方向; (即垂直运动)。
将速度存储在两个变量中,velocityX
和 velocityY
。这将使您更好地控制对象移动的方向以及某些力影响对象的方向(例如重力仅影响 y
组件。),从而提高效率和准确性。
当某物相对于其分量位置、方向和大小(大小)进行描述时,这实际上就是向量的含义。
如果你想了解更多,我相信我已经回答了这个here。
至于你的问题:把球扔到它周围不只是与光标成一条直线然后停止:
看@p.phidot上面的评论
我不熟悉 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
和引力一样由两个分量构成,Fx
和 Fy
(x
分量和 y
分量)。这也适用于 motion
描述符,例如 velocity
和 acceleration
.
根据您的代码,您的 velocity
仅存储为 1
变量,这意味着它是一个标量,并且同样影响 x
和 y
组件。这不是真的……你在现实生活中看不到重力影响物体的 x
方向,是吗? (即水平运动),
而只是 y
方向; (即垂直运动)。
将速度存储在两个变量中,velocityX
和 velocityY
。这将使您更好地控制对象移动的方向以及某些力影响对象的方向(例如重力仅影响 y
组件。),从而提高效率和准确性。
当某物相对于其分量位置、方向和大小(大小)进行描述时,这实际上就是向量的含义。
如果你想了解更多,我相信我已经回答了这个here。
至于你的问题:把球扔到它周围不只是与光标成一条直线然后停止:
看@p.phidot上面的评论