2012-05-12 39 views

Respuesta

6

hice esto, podría interesarle:

import pygame, sys 
from pygame.locals import * 

SCREEN_X=400 
SCREEN_Y=400 
#Screen size 

SPRT_RECT_X=0 
SPRT_RECT_Y=0 
#This is where the sprite is found on the sheet 

LEN_SPRT_X=100 
LEN_SPRT_Y=100 
#This is the length of the sprite 

screen = pygame.display.set_mode((SCREEN_X, SCREEN_Y)) #Create the screen 
sheet = pygame.image.load('C:\YOURFILE') #Load the sheet 

sheet.set_clip(pygame.Rect(SPRT_RECT_X, SPRT_RECT_Y, LEN_SPRT_X, LEN_SPRT_Y)) #Locate the sprite you want 
draw_me = sheet.subsurface(sheet.get_clip()) #Extract the sprite you want 

backdrop = pygame.Rect(0, 0, SCREEN_X, SCREEN_Y) #Create the whole screen so you can draw on it 

screen.blit(draw_me,backdrop) #'Blit' on the backdrop 
pygame.display.flip() 
#Draw the sprite on the screen 

Espero que podría ayudar a

+1

Me doy cuenta de que esta es una resurrección bastante antigua, pero me preguntaba por qué se tomó la molestia de usar set_clip y get_clip cuando podría haber pasado el Rect que deseaba subsuperficiar directamente. – jlund3

+0

Oh wow, esto fue desde hace casi un año jaja. Bueno, en aquel entonces yo todavía era nuevo en pygame aunque estaba respondiendo preguntas, y así fue como lo aprendí. También me parece un poco más limpio de lo que es. Pero tienes razón, podrías pasar tan fácilmente el Recto mismo. – hammythepig

6

El cargador spritesheet anterior es un buen método. Sobre la base de ese código, he hecho esta función generalizada que funciona para cualquier spritesheet:

#!/usr/bin/python 
# 
# Sprite Sheet Loader - hammythepig 
# 
# Edited by Peter Kennedy 
# 
# License - Attribution - hammythepig 
    #http://stackoverflow.com/questions/10560446/how-do-you-select-a-sprite-image-from-a-sprite-sheet-in-python 
# 
# Version = '2.0' 

import pygame,sys 
from pygame.locals import * 

def sprite_sheet(size,file,pos=(0,0)): 

    #Initial Values 
    len_sprt_x,len_sprt_y = size #sprite size 
    sprt_rect_x,sprt_rect_y = pos #where to find first sprite on sheet 

    sheet = pygame.image.load(file).convert_alpha() #Load the sheet 
    sheet_rect = sheet.get_rect() 
    sprites = [] 
    print sheet_rect.height, sheet_rect.width 
    for i in range(0,sheet_rect.height-len_sprt_y,size[1]):#rows 
     print "row" 
     for i in range(0,sheet_rect.width-len_sprt_x,size[0]):#columns 
      print "column" 
      sheet.set_clip(pygame.Rect(sprt_rect_x, sprt_rect_y, len_sprt_x, len_sprt_y)) #find sprite you want 
      sprite = sheet.subsurface(sheet.get_clip()) #grab the sprite you want 
      sprites.append(sprite) 
      sprt_rect_x += len_sprt_x 

     sprt_rect_y += len_sprt_y 
     sprt_rect_x = 0 
    print sprites 
    return sprites 

#VERSION HISTORY 

    #1.1 - turned code into useable function 

    #2.0 - fully functional sprite sheet loader 

Como referencia, esto corta hojas en sprites individuales de una fila a la vez, de izquierda a derecha.

0

¡El código de arriba publicado por aquasheep es brillante! Aunque en líneas:
for i in range(0,sheet_rect.height-len_sprt_y,size[1]):#rows
for i in range(0,sheet_rect.width-len_sprt_x,size[0]):#columns

tuve que quitar -len_sprt_y y -len_sprt_x simplemente no sería cargar los últimos sprites en los ejes X e Y. Puede variar según la hoja de sprite x, y, y el tamaño del sprite real también.

0

No necesita llamar al set_clip y get_clip como se menciona en las otras respuestas. Simplemente pase un rect, tuple o list al Surface.subsurface.

# The size of a sprite in this example is 64x64 pixels. 
x_coord = 64 * 2 # This would be the third column. 
y_coord = 64 * 3 # Fourth row. 
width = 64 
height = 64 

sheet = pygame.image.load('your_sprite_sheet.png').convert_alpha() 
single_image = sheet.subsurface((x_coord, y_coord, width, height)) 
Cuestiones relacionadas