[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[pygame] Pixel Ships: Rotation



Here's a bit of code that turns one animation frame into a strip
containing rotated versions of that frame. It uses the "pixel ships"
code I posted recently and demonstrates a ship rotating. (Hit Escape to quit.) Rotations of 10 or 22.5 degrees seem to give smooth-looking rotation.

A friend is interested in getting a single-player PC version of the game "Binary Homeworlds," made for the Icehouse system. (Anyone interested?) I could also imagine these rotating ships being used for something inspired by "Sinistar," "Starfox," "The Ur-Quan Masters," "Zone 66," or "Gate 88."

import random
import pygame
from pygame.locals import *
import pixel_ships
SCREEN_SIZE = (1024,480)
screen = pygame.display.set_mode(SCREEN_SIZE)

def MakeSpriteFromFrame(frame,angle_per_frame=45):
    ## Make the frames, meanwhile determining which is biggest.
    frames = 360 / angle_per_frame
    max_size = 0
    frameset = []
    for n in range(frames):
        img = pygame.transform.rotate(frame,n*angle_per_frame)
        size = img.get_size()
        if size > max_size:
            max_size = size[0]
        frameset.append(img)

    ## Now combine those into one image strip.
    sprite = pygame.surface.Surface((max_size*frames,max_size))
    for n in range(len(frameset)):
        size = frameset[n].get_size()[0]
##        if size < max_size:
##            x = (n*max_size) + (max_size-size)/2
##            y = (max_size-size)/2
##        else:
##            x = n*max_size
##            y = 0

        x = (n*max_size) + (max_size-size)/2
        y = (max_size-size)/2

        sprite.blit(frameset[n],(x,y))
    return sprite, max_size, frames

s = pixel_ships.MakeShip(pixel_ships.BASE)
s = pygame.transform.scale2x(s)
s = pygame.transform.scale2x(s)

angle = 10 ## Try 45, 22.5 or 2 also. 1 makes Pygame crash for me -- big sprite.
ship_sprite, frame_size, frames = MakeSpriteFromFrame(s,angle)

screen.fill((0,0,150))
screen.blit(ship_sprite,(0,50))

clock = pygame.time.Clock()
frame = 0
done = False
while not done:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            if event.key == K_ESCAPE:
                done = True

    screen.fill((0,0,0))
    screen.blit(ship_sprite,(100,100),(frame*frame_size,0,frame_size,frame_size))
    pygame.display.update()

    frame += 1
    if frame == frames:
        frame = 0

    clock.tick(20)