移动显示表面上的 Pygame 旋转精灵枢轴

时间:2021-07-30 23:20:46

标签: python pygame rotation pygame-surface

所以我尝试将武器添加到我的游戏中并在指向鼠标的枢轴点上旋转它,我做到了,但我遇到了一个无法解决的问题,当我和我的玩家一起走路时,在我之后沿着地图中间走下去,旋转角度看起来不对。

我给您链接了一个 gif 以便更好地理解。

这是工作轮换代码的一部分:

import pygame, os, math
from weapon_constants import *
from level_constants import *
from pygame.math import Vector2

class Weapon(pygame.sprite.Sprite):
    def __init__(self, game, name, label, x, y):
        self._layer = WEAPON_LAYER
        self.groups = game.all_sprites, game.weapons
        
        pygame.sprite.Sprite.__init__(self, self.groups)
        self.options = WEAPONS[name]
        self.label = label
        self.game = game
        
        self.file = os.path.join(os.getcwd(), DEFAULT_WEAPON_IMAGE_PATH, self.get_option('image'))
        self.image = pygame.transform.scale(pygame.image.load(self.file).convert_alpha(), DEFAULT_WEAPON_SIZE)
        self.original_image = self.image
        self.rect = self.image.get_rect(center=(x, y))

        self.offset = Vector2(25, 0)
        self.pos = Vector2(self.rect.x, self.rect.y)
        self.angle = 0
        
    def get_option(self, option):
        if option in self.options:
            return self.options[option]
        
        return False

    def update(self):
        self.pos = Vector2(self.game.player.rect.center)
        rel_x, rel_y = pygame.mouse.get_pos() - self.pos
        self.angle = (180 / math.pi) * math.atan2(rel_y, rel_x)
        if self.pos.y > pygame.display.get_surface().get_width() // 2:
            print('bad rotation happen \n pos_y : {}, \n angle : {}, \n mouse_pos : {}'.format(self.pos.y, self.angle, pygame.mouse.get_pos()))
            pass
        self.rotate()
        
    
    def rotate(self):
        self.image = pygame.transform.rotozoom(self.original_image, -self.angle, 1)
        rotated_offset = self.offset.rotate(self.angle)
        self.rect = self.image.get_rect(center= self.pos + rotated_offset)
  

这是第一个输出(我看到它大约是地图的一半宽度):

bad rotation happen 
 pos_y : 452.0, 
 angle : 23.962488974578186, 
 mouse_pos : (450, 468)

0 个答案:

没有答案