Tôi muốn nhập một trang tính và chọn một sprite. Làm thế nào tôi sẽ làm điều này trong Python/pygame?Làm thế nào để bạn chọn một hình ảnh sprite từ một bảng sprite bằng Python?
Trả lời
Tôi làm điều này, nó có thể bạn quan tâm:
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
Hy vọng tôi có thể giúp
Tôi nhận ra điều này là hồi sinh một câu trả lời khá cũ, nhưng tôi đã tự hỏi tại sao bạn lại gặp rắc rối khi sử dụng set_clip và get_clip khi bạn có thể vừa thông qua Rect bạn muốn trực tiếp trực tiếp. – jlund3
Oh wow, đây là từ gần một năm trước lol. Chà, lúc đó tôi thực sự vẫn còn mới mẻ với pygame mặc dù tôi đang trả lời các câu hỏi, và đó là cách tôi học được nó. Nó cũng có vẻ sạch hơn một chút với tôi theo cách của nó. Nhưng bạn là chính xác, bạn có thể dễ dàng vượt qua chính Rect. – hammythepig
Các spritesheet nạp trên là một phương pháp tốt. Dựa trên mã đó, tôi đã thực hiện chức năng này tổng quát mà làm việc cho bất kỳ 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
Để tham khảo, điều này cắt tấm thành sprites cá nhân một hàng tại một thời điểm từ trái sang phải.
Mã trên được đăng bởi aquasheep thật tuyệt vời! Mặc dù trong dòng:
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
tôi đã phải gỡ bỏ -len_sprt_y
và -len_sprt_x
nó chỉ sẽ không tải các sprites cuối cùng trên trục x và y. Nó có thể thay đổi tùy thuộc vào kích thước sprite, kích thước y và kích thước sprite thực tế.
Bạn không cần gọi số set_clip
và get_clip
như được đề cập trong các câu trả lời khác. Chỉ cần vượt qua một rect, tuple hoặc danh sách để 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))
Bạn nên cung cấp thêm thông tin, như thư viện và khung mà bạn đang sử dụng để phát triển trò chơi. Giải pháp có thể phụ thuộc vào điều đó. –
oh. Có, tôi quên đề cập đến tôi đang sử dụng Pygame. – enrique2334