Как анимировать масштаб и вращение в pygame с помощью rotozoom

Итак, я просто пытаюсь заставить его работать с вращением, прежде чем масштабировать, а затем, как только я поймаю, что ротозум должен быть легким. На всю жизнь я не могу заставить его работать. Вот простой класс, в котором я хочу, чтобы объект вращался с течением времени, а также преобразовывался в направлении x. Преобразование работает нормально, но я просто не могу заставить его вращаться.

class Puff(pygame.sprite.Sprite):

    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen
        try:
            self.imagePuff = pygame.image.load(os.path.join("Images","puff.tga")).convert()
        except:
            raise UserWarning, "Unable to find Puff image"    
        self.imagePuff.set_colorkey((0,0,255))           

        self.image = self.imagePuff
        self.rect = self.image.get_rect()
        self.x = self.screen.get_width()/3
        self.y = self.screen.get_height()/3+10
        self.rect.center = (self.x, self.y)

        self.lifespan = 60
        self.speed = 1
        self.count = 0
        self.angle = 0

    def update(self):
        self.calcPos()
        self.rect.center = self.x, self.y
        self.transform()
        if self.count > self.lifespan:
            self.kill()

    def calcPos(self):
        self.x -= 5
        self.y = self.y

    def transform(self):
        self.count += 1.1
        self.angle += self.count*25
        self.newTrans = pygame.transform.scale(self.copyImage, (400,400))
        self.newRect = self.newTrans.get_rect()
        self.newRect.center = self.rect.center

person Aikman007    schedule 25.05.2013    source источник
comment
рецепт решения: pygame.org/wiki/RotateCenter?parent=CookBook   -  person ninMonkey    schedule 26.05.2013


Ответы (1)


Вот как я сделал это, чтобы вы могли вращать свой класс слоеного:

import pygame

class Puff(pygame.sprite.Sprite):

    def __init__(self, screen):
        pygame.sprite.Sprite.__init__(self)
        self.screen = screen

        try:
            self.imagePuff = pygame.image.load("puff.jpg").convert()
        except:
            raise UserWarning, "Unable to find Puff image"    
        self.image = self.imagePuff
        self.imagePuff.set_colorkey((0,0,255))           
        self.rect = self.image.get_rect()
        self.x = self.screen.get_width()/3
        self.y = self.screen.get_height()/3+10
        self.rect.center = (self.x, self.y)

        self.lifespan = 60
        self.speed = 1
        self.count = 0
        self.angle = 0


    def update(self):

        oldCenter = self.rect.center
        self.image = pygame.transform.rotate(self.imagePuff, self.angle)
        self.rect = self.image.get_rect()
        self.rect.center = oldCenter


    def calcPos(self):
        self.x -= 5
        self.y = self.y

    def turnLeft(self):
        self.angle = (self.angle + 45) % 360

    def turnRight(self):
        self.angle = (self.angle - 45) % 360



if __name__  == "__main__":
    pygame.init()
    screen = pygame.display.set_mode((400,300))
    clock = pygame.time.Clock()
    background = pygame.Surface(screen.get_size())
    background.fill((0, 0, 0))
    pygame.display.set_caption("Spinning sprite!!!")
    ball = Puff(screen)
    sprites = pygame.sprite.Group()
    sprites.add(ball)
    keepGoing = True
    while keepGoing:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                keepGoing = False
        ball.turnRight()
        sprites.clear(screen, background)
        sprites.update()
        sprites.draw(screen)
        pygame.display.flip()   
        clock.tick(30)

Собственно ключевые моменты таковы:

self.image = pygame.transform.rotate(self.imagePuff, self.angle)

В способе обновления и двух способах изменения угла:

    def turnLeft(self):
        self.angle = (self.angle + 45) % 360

    def turnRight(self):
        self.angle = (self.angle - 45) % 360

В приведенном выше коде с каждым тактом спрайт поворачивается вправо:

ball.turnRight()

Поскольку вы пропустили свой метод преобразования, мне пришлось отредактировать код, чтобы показать, как выполнять только повороты.

Надеюсь, это поможет, и если вам нужна дополнительная помощь, пожалуйста, оставьте комментарий.

Редактировать:

если вы хотите повернуть и переместиться влево, вам действительно нужно добавить это:

def update(self):
    self.calcPos()  # This moves the position - 5 in the x direction
    self.rect.center = self.x, self.y
    self.rotate()  # This calls the bit to change the angle
    if self.count > self.lifespan:
        self.kill()
    oldCenter = self.rect.center
    self.image = pygame.transform.rotate(self.imagePuff, self.angle) # This rotates
    self.rect = self.image.get_rect()
    self.rect.center = oldCenter


def calcPos(self):
    self.x -= 5

def rotate(self):
    self.angle = (self.angle + 45) % 360

Вы должны проверить:

http://www.gamedev.net/topic/444490-pygame-easy-as-py/

Если вы ищете «rotate.py», вы увидите раздел кода, посвященный вращению спрайтов.

РЕДАКТИРОВАТЬ:

Попробуйте изменить метод преобразования на:

def transform(self):
    self.count += 1.1
    self.angle += (self.count*25) % 360
    self.copyImage = pygame.transform.rotate(self.imagePuff, self.angle)
    self.newTrans = pygame.transform.scale(self.copyImage, (400,400))
    self.image =  self.newTrans
person Noelkd    schedule 26.05.2013
comment
да, очень жаль, что я упустил ту часть, которая была самой важной, я добавил ее в свой первоначальный пост. Не могли бы вы ответить на него еще раз? Я очень ценю вашу помощь, еще раз спасибо. Я также проверю ссылку, которую вы предоставили. - person Aikman007; 27.05.2013
comment
взгляните сейчас, вы хотите, чтобы я поместил вращение в метод преобразования? - person Noelkd; 27.05.2013
comment
Молодец, работает! Итак, все, что мне нужно было сделать, это скопировать изображение в исходное, а не прямое? Чувак, я был сбит с толку, лол. - person Aikman007; 27.05.2013
comment
Я попытался перевести это с помощью rotozoom, теперь, когда он работает с масштабированием и вращением, но я получаю черный квадрат при вращении изображения. Причина, по которой я хочу использовать ротозум, заключается в том, что он отфильтрован, не важен, но желателен. - person Aikman007; 28.05.2013
comment
Re: pygame.transform.scale Я заметил, что масштабирование происходит из угла, можно ли его настроить так, чтобы оно происходило только из центра изображения? - person Aikman007; 28.05.2013
comment
Айкман: ​​Чтобы сохранить тот же центр, перейдите по ссылке выше: pygame.org/wiki/RotateCenter? родитель=поваренная книга - person ninMonkey; 28.05.2013