Как да анимирате мащаба и да завъртите в pygame с помощта на rotozoom

Добре, така че просто се опитвам да го накарам да работи с ротации, първо преди мащабиране, а след това, след като разбера, че 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)


Ето как го направих, за да можете да въртите вашия puff клас:

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 сега, когато работи с мащабиране и завъртане, но получавам черен квадрат, докато изображението се върти. Причината, поради която искам да използвам rotozoom, е, че е филтриран, не е важен, но е желан. - person Aikman007; 28.05.2013
comment
Re: pygame.transform.scale Забелязах, че мащабирането произхожда от ъгъла, може ли да се коригира така, че да се случва само от центъра на изображението? - person Aikman007; 28.05.2013
comment
Ейкман: ​​За да запазите същия център, вижте връзката по-горе: pygame.org/wiki/RotateCenter? parent=Готварска книга - person ninMonkey; 28.05.2013