Pygame Combine Sprites
Я пытаюсь создать игру, в которой объединение изображений (спигитов-пигеймов) является важным инструментом.
Я настроил свой код так, чтобы я мог перемещать спрайты по оси x,y с помощью мыши и вращать их. Спрайты скрыты на поверхности дисплея, поэтому это движение можно увидеть на экране.
После того, как пользователь разместил два спрайта по своему усмотрению в квадратной зоне, мне нужно, чтобы они могли сохранить всю эту зону как новый спрайт.
Я не вижу способа в настоящее время в Pygame захватить область дисплея и сохранить его как спрайт. Это возможно? Какие функции я должен использовать для этой цели?
1 ответ
Вы можете проверить, какие спрайты сталкиваются с квадратной областью, и передать их Combined
спрайт класс, объедините ректы с union_ip
метод и создать новую поверхность с необходимым размером, чтобы бликать поверхности отдельных спрайтов на него. (Нажмите C, чтобы объединить спрайты.)
import pygame as pg
BLUE = pg.Color('dodgerblue1')
SIENNA = pg.Color('sienna1')
GREEN = pg.Color('green')
class Entity(pg.sprite.Sprite):
def __init__(self, pos, color):
super().__init__()
self.image = pg.Surface((42, 68))
self.image.fill(color)
self.rect = self.image.get_rect(topleft=pos)
def move(self, velocity):
self.rect.move_ip(velocity)
class Combined(pg.sprite.Sprite):
def __init__(self, sprites):
super().__init__()
# Combine the rects of the separate sprites.
self.rect = sprites[0].rect.copy()
for sprite in sprites[1:]:
self.rect.union_ip(sprite.rect)
# Create a new transparent image with the combined size.
self.image = pg.Surface(self.rect.size, pg.SRCALPHA)
# Now blit all sprites onto the new surface.
for sprite in sprites:
self.image.blit(sprite.image, (sprite.rect.x-self.rect.left,
sprite.rect.y-self.rect.top))
def move(self, velocity):
self.rect.move_ip(velocity)
def main():
pg.init()
screen = pg.display.set_mode((640, 480))
clock = pg.time.Clock()
entity = Entity((50, 80), BLUE)
entity2 = Entity((50, 180), SIENNA)
all_sprites = pg.sprite.Group(entity, entity2)
area = pg.Rect(200, 50, 200, 200)
selected = None
while True:
for event in pg.event.get():
if event.type == pg.QUIT:
return
elif event.type == pg.MOUSEBUTTONDOWN:
for sprite in all_sprites:
if sprite.rect.collidepoint(event.pos):
selected = sprite
elif event.type == pg.MOUSEBUTTONUP:
selected = None
elif event.type == pg.MOUSEMOTION:
if selected:
selected.move(event.rel)
elif event.type == pg.KEYDOWN:
if event.key == pg.K_c:
# A 'list comprehension' to find the colliding sprites.
colliding_sprites = [sprite for sprite in all_sprites
if sprite.rect.colliderect(area)]
combined = Combined(colliding_sprites)
all_sprites.add(combined)
# Kill the colliding sprites if they should be removed.
# for sprite in colliding_sprites:
# sprite.kill()
all_sprites.update()
screen.fill((30, 30, 30))
pg.draw.rect(screen, SIENNA, area, 2)
all_sprites.draw(screen)
for sprite in all_sprites: # Outlines.
pg.draw.rect(screen, GREEN, sprite.rect, 1)
pg.display.flip()
clock.tick(60)
if __name__ == '__main__':
main()
pg.quit()
В качестве альтернативы вы можете попытаться добавить объединенные спрайты в другую группу спрайтов или список, а затем скопировать и переместить их вместе.