繁体   English   中英

如何在 pygame 中平滑移动 + 旋转?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM