[英]How do I make smooth movement + rotation in pygame?
我正在尝试使宇宙飞船向鼠标指针移动,如果它四处移动,则旋转以跟随指针。 目前,旋转工作正常,线性运动工作正常,但由于某种原因,如果船同时旋转和移动,它会在旋转时在原地晃动,不再向前移动。 这是我的问题的 gif以供澄清。 下面我有相关的代码。
编辑:我刚刚发布了整个 class 以希望让事情变得不那么混乱。
class player():
def __init__(self, x_position, y_position, length, height):
self.x = x_position
self.y = y_position
self.l = length
self.h = height
self.player_ship = pygame.transform.scale(ships[0], (128, 128))
self.angle = 0
def draw(self, win):
cx, cy = pygame.mouse.get_pos()
img_copy = pygame.transform.rotate(self.player_ship, math.atan2(self.x - cx, self.y - cy)*57.2957795)
win.blit(img_copy, (self.x - int(img_copy.get_width() / 2), self.y - int(img_copy.get_height() / 2)))
def move(self, speed):
cx, cy = pygame.mouse.get_pos()
self.angle = math.atan2(cx - self.x, cy - self.y)*57.2957795
movement_x = math.cos(self.angle) * speed
movement_y = math.sin(self.angle) * speed
self.x -= movement_x
self.y += movement_y
我在某处读到我不应该将我的位置存储为整数,但我不完全确定如何跟踪位置。 我非常感谢任何人提供的任何提示或指示。
该问题是由旋转精灵的代码引起的。
旋转图像,得到涂层图像的pygame.Rect
。 通过 object 的 position 设置矩形的中心。 使用矩形来blit图像。
请参阅如何使用 Pygame 围绕其中心旋转图像? .
img_copy = pygame.transform.rotate(self.player_ship, self.angle)
rotated_rect = img_copy.get_rect(center = (round(self.x), round(self.y)))
要旋转图像,只需计算从当前 position 到鼠标 position 的单位方向矢量 [参见单位矢量。)]。 按速度缩放矢量并将其添加到 position:
cx, cy = pygame.mouse.get_pos()
dx, dy = cx - self.x, cy - self.y
if abs(dx) > 0 or abs(dy) > 0:
dist = math.hypot(dx, dy)
self.x += min(dist, speed) * dx/dist
self.y += min(dist, speed) * dy/dist
看例子
class player():
def __init__(self, x_position, y_position, length, height):
self.x = x_position
self.y = y_position
self.l = length
self.h = height
self.player_ship = pygame.transform.scale(ships[0], (128, 128))
self.angle = 0
def draw(self, win):
cx, cy = pygame.mouse.get_pos()
dx, dy = cx - self.x, cy - self.y
if abs(dx) > 0 or abs(dy) > 0:
self.angle = math.atan2(-dx, -dy)*57.2957795
img_copy = pygame.transform.rotate(self.player_ship, self.angle)
rotated_rect = img_copy.get_rect(center = (round(self.x), round(self.y)))
win.blit(img_copy, rotated_rect)
def move(self, speed):
cx, cy = pygame.mouse.get_pos()
dx, dy = cx - self.x, cy - self.y
if abs(dx) > 0 or abs(dy) > 0:
dist = math.hypot(dx, dy)
self.x += min(dist, speed) * dx/dist
self.y += min(dist, speed) * dy/dist
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.