Я думаю, что вы делаете какую-то ошибку при прохождении позиции x и y объекта после вращения.Я никогда не использовал карту тайлов, поэтому не знаю специфики, но в pygame, когда вы передаете позицию в blit
, вы должны передать координаты верхнего левого угла.Верхний левый угол Surface
будет в этих координатах.
rdc.blit(assets_surface_rotate, (object.x, object.y))
Здесь я не знаю, какие именно координаты object.x
и object.y
, но держу пари, что они неверхний левый угол, или ваш код должен работать.
В общем, для выполнения таких работ вы можете использовать Sprite класс или подкласс, который может очень помочь.
class TMSprite(pygame.sprite.Sprite):
# Constructor. Create a Surface from a TileMap and set its position
def __init__(self, tmo, x, y, width, height):
# Call the parent class (Sprite) constructor
super(TMSprite, self).__init__()
# Create the image of the block
self.image = pygame.Surface((width, height), pygame.SRCALPHA)
self.image.blit(tmo.image, (0, 0))
# Fetch the rectangle object that has the dimensions of the image
# Set its position with the move method
self.rect = self.image.get_rect().move(x, y)
def rotate(self, angle):
# TMSprite rotation on its center of a given angle
rot_center = self.rect.center
self.image = pygame.transform.rotate(self.image, angle)
self.rect = self.image.get_rect()
self.rect.center = rot_center
И вот как вы можете переписать свой фрагмент, используя класс TMSprite
.
if isinstance(layer, pytmx.TiledObjectGroup):
for tmob in layer:
if (tmob.image):
x = tmob.x #x should be that of the top-left corner. Adjust the formula if tmob.x is not the top-left
y = tmob.y #y should be that of the top-left corner. Adjust the formula if tmob.y is not the top-left
assets_sprite = TMSprite(tmob, x, y, tmob.width, tmob.height)
assets_sprite.rotate(-object.rotation)
rdc.blit(assets_sprite.image, assets_sprite.rect)
Здесь, вместо прохождения координат в верхнем левом углу, я передаю Rect
спрайтадо blit
.Метод blit
извлечет координаты из прямоугольника.
Обратите внимание, что вращение выполняется в центре поверхности.После поворота, если угол не кратен 90 °, Поверхность увеличивается, так как квадрат Поверхности должен быть выровнен по экрану.Если есть альфа-канал, это не проблема, лишние пиксели прозрачны, но верхний левый угол изменится.