如何在 Pygame 中将对象移向鼠标而不让鼠标位置影响速度?
How do I move an object towards the mouse without having the mouse position affect speed in Pygame?
所以我正在尝试在 Pygame 中测试一个简单的战斗系统,玩家基本上可以根据鼠标位置向某个区域发射弹丸。因此,例如,当他点击屏幕左上角时,弹丸会以稳定的速度朝那里移动。我创建了一个函数来移动列表中的每个项目符号,这是函数。
def move_bullet(bullet_pos, direction):
# TODO Make the speed of the bullet the same no matter which direction it's being fired at
bullet_pos[0] += direction[0]/50
bullet_pos[1] += direction[1]/50
bullet_rect = pygame.Rect((bullet_pos[0], bullet_pos[1]), BULLET_SIZE)
return bullet_rect
方向是mousebuttondown事件触发时鼠标的向量位置减去玩家的向量位置得到的。
但是,我注意到我越靠近子弹的player/origin,子弹的速度就越慢,因为方向矢量越小,所以速度会因鼠标的位置而异。我听说过 Vector normalization,但我不知道如何实现它,因为在做了一些研究之后,显然你通过获取它的大小并将 X 和 Y 值除以大小来对 Vectors 进行归一化?我从可汗学院得到它,但它实际上不起作用。我对此很紧张,所以我别无选择,只能在这里问这个问题。
TL; DR
如何在 Pygame 中规范化向量?
如果一定要点
x1 = 10
y1 = 10
x2 = 100
y2 = 500
然后你可以计算距离并使用pygame.math.Vector2
import pygame
dx = x2-x1
dy = y2-y1
distance = pygame.math.Vector2(dx, dy)
或
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
distance = v2 - v1
然后你可以正常化它
direction = distance.normalize()
它应该总是给出距离 1
print('distance:', direction[0]**2 + direction[1]**2) # 0.999999999999
# or
print('distance:', direction.length() )
然后使用 speed
移动对象
pos[0] += direction[0] * speed
pos[1] += direction[1] * speed
编辑:
如果你会用Rect
SIZE = (10, 10)
bullet_rect = pygame.Rect((0, 0), SIZE)
bullet_rect.center = (x1, y1)
那你也可以计算
distance = v2 - bullet_rect.center
direction = distance.normalize()
一行移动
bullet_rect.center += direction * speed
Rect
有很多有用的功能。但是有一个减号 - 它保持位置为 integers
所以它四舍五入浮点值,有时它会给出奇怪的移动或每隔几步就丢失一个像素。
文档:PyGame.math
所以我正在尝试在 Pygame 中测试一个简单的战斗系统,玩家基本上可以根据鼠标位置向某个区域发射弹丸。因此,例如,当他点击屏幕左上角时,弹丸会以稳定的速度朝那里移动。我创建了一个函数来移动列表中的每个项目符号,这是函数。
def move_bullet(bullet_pos, direction):
# TODO Make the speed of the bullet the same no matter which direction it's being fired at
bullet_pos[0] += direction[0]/50
bullet_pos[1] += direction[1]/50
bullet_rect = pygame.Rect((bullet_pos[0], bullet_pos[1]), BULLET_SIZE)
return bullet_rect
方向是mousebuttondown事件触发时鼠标的向量位置减去玩家的向量位置得到的。
但是,我注意到我越靠近子弹的player/origin,子弹的速度就越慢,因为方向矢量越小,所以速度会因鼠标的位置而异。我听说过 Vector normalization,但我不知道如何实现它,因为在做了一些研究之后,显然你通过获取它的大小并将 X 和 Y 值除以大小来对 Vectors 进行归一化?我从可汗学院得到它,但它实际上不起作用。我对此很紧张,所以我别无选择,只能在这里问这个问题。
TL; DR
如何在 Pygame 中规范化向量?
如果一定要点
x1 = 10
y1 = 10
x2 = 100
y2 = 500
然后你可以计算距离并使用pygame.math.Vector2
import pygame
dx = x2-x1
dy = y2-y1
distance = pygame.math.Vector2(dx, dy)
或
v1 = pygame.math.Vector2(x1, y1)
v2 = pygame.math.Vector2(x2, y2)
distance = v2 - v1
然后你可以正常化它
direction = distance.normalize()
它应该总是给出距离 1
print('distance:', direction[0]**2 + direction[1]**2) # 0.999999999999
# or
print('distance:', direction.length() )
然后使用 speed
pos[0] += direction[0] * speed
pos[1] += direction[1] * speed
编辑:
如果你会用Rect
SIZE = (10, 10)
bullet_rect = pygame.Rect((0, 0), SIZE)
bullet_rect.center = (x1, y1)
那你也可以计算
distance = v2 - bullet_rect.center
direction = distance.normalize()
一行移动
bullet_rect.center += direction * speed
Rect
有很多有用的功能。但是有一个减号 - 它保持位置为 integers
所以它四舍五入浮点值,有时它会给出奇怪的移动或每隔几步就丢失一个像素。
文档:PyGame.math