#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
Слишком просто, не так ли ?!
Пучок травы взят из открытого клипа (лицензия на общественное достояние).
Вот ссылочный код:
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()