Pygame - Image rotieren

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
quant42
User
Beiträge: 4
Registriert: Mittwoch 14. Juli 2010, 02:55

Moin.

Momentan bastele ich an einem 2D-Spiel realisiert mit Pygame, in welchem man vor allem ein kleines Raumschiff (Image) mit den Pfeiltasten steuern kann. Das Raumschiff wird durch ein Array mit vier Einträgen beschrieben: [heading, speed, pos_x, pos_y]
Bisher war es kein Problem die Bewegung des Bildes zu realisieren:

Code: Alles auswählen

.
pos_x = pos_x + scipy.sin(heading) * speed * elapsed_time
pos_y = pos_y + scipy.cos(heading) * speed * elapsed_time
.
Damit das gut aussieht, muss sich natürlich auch das Bild des Raumschiffes entsprechend drehen. Dazu habe ich bereits hier im Forum gefunden, dass man nicht das gedrehte Bild nochmal drehen darf, sondern immer wieder das Ursprungsbild dreht. Jedoch dreht pygame mit der eingebauten rotate Funktion das Bild um die obere linke Ecke, während ich eine Drehung um die Bildmitte brauche. Gibt es dazu bereits eine Lösung mittels Pygame? Ansonsten dachte ich daran das Bild als Matrix aufzufassen und schließlich mit der Givens-Rotation zu drehen.
Wendigo
User
Beiträge: 7
Registriert: Montag 2. August 2010, 08:09

Versuchs mal mit "pygame.transform.rotate" in verbindung mit "Rect.clamp"
Hier mal ein Beispiel:

Code: Alles auswählen

import pygame
from pygame.locals import *

pygame.init()

res = (800,600)
screen = pygame.display.set_mode(res)

image = pygame.image.load("test.png").convert()
image_rect_org = image.get_rect()

images = []
framenr = 0

for degrees in xrange(0,360,6):    
    images.append(pygame.transform.rotate(image,degrees))

running = True
timer = pygame.time.Clock()

while running:
    timer.tick(40)
    
    for event in pygame.event.get():
        if event.type == QUIT:
            running = False
        elif event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                running = False

    screen.fill((0,0,0))

    image_rect = images[framenr].get_rect().clamp(image_rect_org)
    screen.blit(images[framenr],image_rect)
    
    if (framenr + 1) <= 59:
        framenr += 1
    else:
        framenr = 0
    
    pygame.display.flip()

pygame.quit()
Antworten