[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)