2012-05-18 34 views
0
def rotate(self): 
    #Save the original rect center 
    self.saved_center=self.rect.center 

    #Rotates a saved image every time to maintain quality 
    self.image=pygame.transform.rotate(self.saved_image, self.angle) 

    #Make new rect center the old one 
    self.rect.center=self.saved_center 

    self.angle+=10 

當我旋轉圖像,有它儘管我保存舊RECT中心,使旋轉矩形中心老的事實一個奇怪的換擋當一。我希望它在廣場的中心旋轉。奇怪的轉移使用pygame.transform.rotate()

這裏是什麼樣子: http://i.imgur.com/g6Os9.gif

+0

你能發表一個有效的例子嗎? – jdi

+0

此外,我還回答了一個類似的pygame問題,之前也解決了做旋轉,同時保持中心。也許你可以[查看這個問題](http://stackoverflow.com/a/9848408/496445)看看它是否有幫助? – jdi

+0

main:http://dl.dropbox.com/u/11788669/main.py和模塊:http://dl.dropbox.com/u/11788669/sprite_module.py。我會看看你發佈的鏈接,希望它有幫助:) – PhoneMicrowave

回答

2

你只是計算新的矩形錯。試試這個:

def rotate(self): 
    self.image=pygame.transform.rotate(self.saved_image, self.angle) 
    self.rect = self.image.get_rect(center=self.rect.center) 
    self.angle+=10 

它告訴新的矩形以原始中心爲中心(中心在這裏不會改變,只是不斷變化)。

問題是self.rect從未正確更新。你只是在改變中心價值。整個矩形隨着圖像的旋轉而變化,因爲它的大小會增大和縮小。所以你需要做的是每次完全設置新矩形。

self.image.get_rect(center=self.rect.center) 

這計算了一個全新的矩形,而基於給定的中心。中心在計算位置之前設置在矩形上。因此,你得到了一個正確的以你的觀點爲中心的矩陣。

+0

它是如此的美麗:o!非常感謝。你能解釋一下self.image.get_rect(center = self.rect.center)是什麼,它和self.rect.center有什麼不同。我做了一個測試運行並打印了變量。註冊中心:(325,225)中心地址: PhoneMicrowave

+0

@ user1150096:沒有問題!告訴我這個更新是否有意義。 – jdi

+0

我不得不說這是我一段時間以來看到的最好的單線解決方案。這次真是萬分感謝! – invert

0

我有這個問題。我的方法有一個不同的目的,但我很好地解決了它。

import pygame, math 

def draw_sprite(self, sprite, x, y, rot): 
    #'sprite' is the loaded image file. 
    #'x' and 'y' are coordinates. 
    #'rot' is rotation in radians. 

    #Creates a new 'rotated_sprite' that is a rotated variant of 'sprite' 
    #Also performs a radian-to-degrees conversion on 'rot'. 
    rotated_sprite = pygame.transform.rotate(sprite, math.degrees(rot)) 

    #Creates a new 'rect' based on 'rotated_sprite' 
    rect = rotated_sprite.get_rect() 

    #Blits the rotated_sprite onto the screen with an offset from 'rect' 
    self.screen.blit(rotated_sprite, (x-(rect.width/2), y-(rect.height/2)))