Как мне создать клоны спрайта в Pygame?

#python #class #pygame #sprite #clone

#python #класс #pygame #спрайт #клонировать

Вопрос:

Я добавляю grass в платформу прокрутки в Pygame и Python 2.7. Проблема в том, что пока у меня есть только одна прядь травы, и я хочу, чтобы их было больше. В принципе, я хочу, чтобы были клоны.

Я слышал, что классы могут создавать клоны спрайтов, но я не совсем уверен, как работают классы и как их создать. Все учебные пособия, которые я нашел в Интернете, только еще больше меня смутили.

Эта часть вызывает grass_rotate функцию, а также выполняет grass_rect :

 grass_rect = grass.get_rect(topleft = (grass_x, 480 - player_y   460))
grass_rotate(screen, grass_rect, (grass_x, 480 - player_y   460), grass_angle)
 

Это grass_rotate функция:

 def grass_rotate(screen, grass_rect, topleft, grass_angle):
    rotated_grass = pygame.transform.rotate(grass, grass_angle)
    rotated_grass_rect = rotated_grass.get_rect(center = grass_rect.center)
    screen.blit(rotated_grass, rotated_grass_rect)
 

Комментарии:

1. Если вы пытаетесь создать игру, даже не зная, как работают классы, это может быть признаком того, что вы слишком рано начинаете слишком масштабно. Вы действительно должны иметь базовое представление о концепциях программирования, прежде чем писать большую программу.

2. да, возможно, ты прав

3. Кстати, если вы только начинаете с Python, вам действительно не следует использовать устаревший и официально мертвый Python 2. Переключитесь на Python 3.

4. Я не могу запустить Pygame в python 3 в PyCharm. Он просто продолжает говорить, что установка была неудачной.

5. Я отчасти согласен с @RandomDavis, хотя и не хочу вас обескураживать. Почему бы не начать с чего-то простого , например, с Pac Man — en.wikipedia.org/wiki/Pac-Man Сначала заставьте спрайт перемещаться по экрану, затем добавьте гранулы для еды (столкновения), затем добавьте счет (текст и шрифты), затем добавьте лабиринт (столкновения), затем сделайте Pacman mouth-chomp (анимация), затемдобавьте звуки, затем добавьте призраков (AI), затем сделайте его лабиринтами прокрутки (прокрутка). Моя точка зрения такова: попробуйте создать игру небольшими достижимыми шагами. Мы все здесь стремимся помочь.

Ответ №1:

Чтобы ответить на ваш вопрос, для создания повернутых «клонов» спрайта, я думаю, было бы лучше создать объект спрайта на основе pygame.sprite.Sprite , с опциями для поворота растрового изображения.

Сначала давайте создадим действительно простой спрайт:

 class Grass( pygame.sprite.Sprite ):
    """ Creates a tuft of grass at (x,y) """
    def __init__( self, image, x, y ):
        pygame.sprite.Sprite.__init__(self)
        self.image    = image
        self.rect     = self.image.get_rect()
        self.rect.center = ( x, y )
 

Поскольку это основано на библиотеке спрайтов, оно автоматически получает (наследует) функцию Grass.draw() из pygame.sprite.Sprite .

РЕДАКТИРОВАТЬ: приведенный выше абзац неверен. Спрайты не наследуются draw() , это только часть групп спрайтов. необходимо реализовать свой собственный draw() , если не использовать группы спрайтов:

     def draw( self, surface ):
        surface.blit( self.image, self.rect )
 

Итак, чтобы вывести его на экран, мы можем просто сделать:

 grass_image = pygame.image.load( 'grass_clump.png' ).convert_alpha()
my_grass1 = Grass( grass_image, 10, 10 )
my_grass2 = Grass( grass_image, 50, 40 )

...

my_grass1.draw( window )
my_grass2.draw( window )

...
 

Но мы хотим немного изменить угол наклона, чтобы каждый пучок травы не был таким плоским и регулярным. Один из способов сделать это — создать повернутую копию изображения при инициализации Grass спрайта ( Grass.__init__() ). В PyGame уже есть rotozoom функция, которая делает это.

Итак, у нас в основном то же самое, за исключением того, что теперь мы добавляем дополнительный необязательный параметр для поворота. Я установил значение по умолчанию None , и без параметра класс может выбирать свой собственный случайный угол.

 ### Creates a sprite that is rotated slightly to the left or right
class Grass( pygame.sprite.Sprite ):
    """ Creates a tuft of grass at a jaunty angle """
    def __init__( self, image, x, y, rotation=None ):
        pygame.sprite.Sprite.__init__(self)
        if ( rotation == None ):                                       # choose random angle if none
            angle = random.randrange( -15, 16 )                        # choose random angle if none
        self.image    = pygame.transform.rotozoom( image, angle, 1 )   # rotate the image
        self.rect     = self.image.get_rect()
        self.rect.center = ( x, y )
 

Теперь нам нужно собрать все это вместе. Одна из очень полезных функций PyGame и библиотеки спрайтов Pygame — это группы спрайтов. Я не хочу вдаваться в подробности, но, по сути, это позволяет вам работать с целой кучей спрайтов одновременно, что значительно упрощает код.

Итак, теперь нам нужно много клонов grass, поэтому мы просто создаем 50 из них и добавляем в новую группу:

 ### create lots of grass sprites, adding them to a group
grass_image = pygame.image.load( 'grass_clump_48.png' ).convert_alpha()
all_grass_sprites = pygame.sprite.Group()
for i in range( 50 ):
    new_x     = random.randrange( WINDOW_WIDTH )
    new_y     = random.randrange( WINDOW_HEIGHT )
    new_grass = Grass( grass_image, new_x, new_y )
    all_grass_sprites.add( new_grass )
 

Чтобы отобразить их в окне, вы можете перебирать все спрайты в группе с for() помощью инструкции. Но в этом нет необходимости, потому что группа спрайтов уже может сделать это за нас:

 all_grass_sprites.draw( window )   # draws all the grass sprites
 

grass_sprites_clones

Слишком просто, не так ли ?!

Пучок травы взят из открытого клипа (лицензия на общественное достояние).

Вот ссылочный код:

 import pygame
import random

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF

GREEN = ( 130, 220,   0 )  # background colour

### Creates a sprite that is rotated slightly to the left or right
class Grass( pygame.sprite.Sprite ):
    """ Creates a tuft of grass at a jaunty angle """
    def __init__( self, image, x, y, rotation=None ):
        pygame.sprite.Sprite.__init__(self)
        if ( rotation == None ):                                       # choose random angle if none
            angle = random.randrange( -15, 14 )                        # choose random angle if none
        self.image    = pygame.transform.rotozoom( image, angle, 1 )   # rotate the image
        self.rect     = self.image.get_rect()
        self.rect.center = ( x, y )


### Initialisation
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Grass Sprite Clones")

### create lots of grass sprites, adding them to a group
grass_image = pygame.image.load( 'grass_clump_48.png' ).convert_alpha()
all_grass_sprites = pygame.sprite.Group()
for i in range( 50 ):
    new_x     = random.randrange( WINDOW_WIDTH )
    new_y     = random.randrange( WINDOW_HEIGHT )
    new_grass = Grass( grass_image, new_x, new_y )
    all_grass_sprites.add( new_grass )

### Main Loop
clock = pygame.time.Clock()
done = False
while not done:

    # Handle user-input
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # On mouse-click
            pass

    # Update the window, but not more than 60fps
    window.fill( GREEN )
    all_grass_sprites.draw( window )   # draws all the grass sprites
    pygame.display.flip()

    # Clamp FPS
    clock.tick(60)

pygame.quit()