Главная страница
Навигация по странице:

  • Исходный код программы В редакторе файлов создайте новый файл, выбрав команду меню File ⇒ New File

  • Настройка окна и создание структуры данных

  • Изменение размера спрайта

  • Установка музыки и звуков

  • Включение/отключение звука Клавиша M

  • Отображение спрайта игрока в окне

  • Проверка на столкновения

  • Отображение спрайтов вишен в окне

  • В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ

  • Обзор основных типов данных pygame Прежде чем мы начнем работу над игрой «Ловкач», давайте рассмотрим некоторые основные типы данных, использующиеся в pygame: 382

  • Учим Python, делая крутые игры 2018. Invent your owncomputer gameswith python


    Скачать 6.56 Mb.
    НазваниеInvent your owncomputer gameswith python
    Дата10.12.2022
    Размер6.56 Mb.
    Формат файлаpdf
    Имя файлаУчим Python, делая крутые игры 2018.pdf
    ТипДокументы
    #837554
    страница36 из 39
    1   ...   31   32   33   34   35   36   37   38   39
    Пример запуска игры
    Программа этой главы точно такая же, как и приложение с обнаружени- ем столкновений из главы 19. Однако в этой программе вместо простых ква- дратов мы будем использовать спрайты. Для представления игрока вместо черного блока мы будем использовать спрайт человека, а спрайт вишен — вместо зеленых квадратов «еды». Мы также воспроизведем фоновую музы- ку и добавим звуковой эффект при «съедании» каждой из вишен спрайтом игрока.
    Рис. 20.3.
    Снимок игры «Спрайты и звуки»
    В этой программе спрайт игрока будет «есть» спрайты вишен, и по мере того, как он их «ест», он будет увеличиваться. Когда вы запустите программу, игра будет выглядеть так, как показано на рис. 20.3.
    Исходный код программы
    В редакторе файлов создайте новый файл, выбрав команду меню
    File
    New File (Файл ⇒ Новый файл). В открывшемся окне введите при-

    372
    Глава 20
    веденный ниже исходный код и сохраните файл под именем spritesAndSounds.py. Затем нажмите клавишу F5 и запустите программу. Если при вы- полнении программы возникают ошибки, срав- ните код, который вы набрали, с оригинальным кодом с помощью онлайн-инструмента на сайте
    inventwithpython.com/diff/.
    spritesAndSounds.py
    1. import pygame, sys, time, random
    2. from pygame.locals import *
    3.
    4. # Установка pygame.
    5. pygame.init()
    6. mainClock = pygame.time.Clock()
    7.
    8. # Настройка окна.
    9. WINDOWWIDTH = 400 10. WINDOWHEIGHT = 400 11. windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
    12. pygame.display.set_caption('Спрайты и звуки')
    13.
    14. # Настройка цвета.
    15. WHITE = (255, 255, 255)
    16.
    17. # Создание структуры данных блока.
    18. player = pygame.Rect(300, 100, 40, 40)
    19. playerImage = pygame.image.load('player.png')
    20. playerStretchedImage = pygame.transform.scale(playerImage, (40, 40))
    21. foodImage = pygame.image.load('cherry.png')
    22. foods = []
    23. for i in range(20):
    24. foods.append(pygame.Rect(random.randint(0, WINDOWWIDTH - 20), random.randint(0, WINDOWHEIGHT - 20), 20, 20))
    25.
    26. foodCounter = 0 27. NEWFOOD = 40 28.
    29. # Создание переменных клавиатуры.
    30. moveLeft = False
    31. moveRight = False
    Make sure you’re using Python 3, not Python 2!
    УБЕ ДИТЕСЬ,
    ЧТО ИСПО ЛЬЗУЕТЕ
    PY THON 3,
    А НЕ PY THON 2!

    Использование звуков и изображений
    373
    32. moveUp = False
    33. moveDown = False
    34.
    35. MOVESPEED = 6 36.
    37. # Настройка музыки.
    38. pickUpSound = pygame.mixer.Sound('pickup.wav')
    39. pygame.mixer.music.load('background.mid')
    40. pygame.mixer.music.play(-1, 0.0)
    41. musicPlaying = True
    42.
    43. # Запуск игрового цикла.
    44. while True:
    45. # Проверка наличия события QUIT.
    46. for event in pygame.event.get():
    47. if event.type == QUIT:
    48. pygame.quit()
    49. sys.exit()
    50. if event.type == KEYDOWN:
    51. # Изменение переменных клавиатуры.
    52. if event.key == K_LEFT or event.key == K_a:
    53. moveRight = False
    54. moveLeft = True
    55. if event.key == K_RIGHT or event.key == K_d:
    56. moveLeft = False
    57. moveRight = True
    58. if event.key == K_UP or event.key == K_w:
    59. moveDown = False
    60. moveUp = True
    61. if event.key == K_DOWN or event.key == K_s:
    62. moveUp = False
    63. moveDown = True
    64. if event.type == KEYUP:
    65. if event.key == K_ESCAPE:
    66. pygame.quit()
    67. sys.exit()
    68. if event.key == K_LEFT or event.key == K_a:
    69. moveLeft = False
    70. if event.key == K_RIGHT or event.key == K_d:
    71. moveRight = False
    72. if event.key == K_UP or event.key == K_w:

    374
    Глава 20 73. moveUp = False
    74. if event.key == K_DOWN or event.key == K_s:
    75. moveDown = False
    76. if event.key == K_x:
    77. player.top = random.randint(0, WINDOWHEIGHT - player.height)
    78. player.left = random.randint(0, WINDOWWIDTH - player.width)
    79. if event.key == K_m:
    80. if musicPlaying:
    81. pygame.mixer.music.stop()
    82. else:
    83. pygame.mixer.music.play(-1, 0.0)
    84. musicPlaying = not musicPlaying
    85.
    86. if event.type == MOUSEBUTTONUP:
    87. foods.append(pygame.Rect(event.pos[0] - 10, event.pos[1] - 10, 20, 20))
    88.
    89. foodCounter += 1 90. if foodCounter >= NEWFOOD:
    91. # Добавление новой "еды".
    92. foodCounter = 0 93. foods.append(pygame.Rect(random.randint(0, WINDOWWIDTH - 20), random.randint(0, WINDOWHEIGHT - 20), 20, 20))
    94.
    95. # Создание на поверхности белого фона.
    96. windowSurface.fill(WHITE)
    97.
    98. # Перемещение игрока.
    99. if moveDown and player.bottom < WINDOWHEIGHT:
    100. player.top += MOVESPEED
    101. if moveUp and player.top > 0:
    102. player.top -= MOVESPEED
    103. if moveLeft and player.left > 0:
    104. player.left -= MOVESPEED
    105. if moveRight and player.right < WINDOWWIDTH:
    106. player.right += MOVESPEED
    107.
    108.
    109. # Отображение блока на поверхности.
    110. windowSurface.blit(playerStretchedImage, player)
    111.
    112. # Проверка, не пересекся ли блок с какими-либо блоками "еды".
    113. for food in foods[:]:

    Использование звуков и изображений
    375
    114. if player.colliderect(food):
    115. foods.remove(food)
    116. player = pygame.Rect(player.left, player.top, player.width + 2, player.height + 2)
    117. playerStretchedImage = pygame.transform.scale(playerImage, (player.width, player.height))
    118. if musicPlaying:
    119. pickUpSound.play()
    120.
    121. # Отображение "еды".
    122. for food in foods:
    123. windowSurface.blit(foodImage, food)
    124.
    125. # Вывод окна на экран.
    126. pygame.display.update()
    127. mainClock.tick(40 )
    Настройка окна и создание структуры данных
    Бóльшая часть кода в этой программе совпадает с кодом программы из главы 19. Мы сосредоточимся только на тех частях, которые добавляют спрайты и звуки. Сначала в строке кода 12 выведем название игры в заголо- вок окна.
    12. pygame.display.set_caption('Спрайты и звуки')
    Чтобы присвоить это название, вам нужно передать строку 'Спрайты и звуки'
    функции pygame.display.set_caption().
    Добавление спрайта
    Теперь, когда у нас есть заголовок, нам, собственно, нужны спрайты . Мы будем использовать три переменные для представления игрока, в отличие от предыдущих программ, где мы использовали только одну.
    17. # Создание структуры данных блока.
    18. player = pygame.Rect(300, 100, 40, 40)
    19. playerImage = pygame.image.load('player.png')
    20. playerStretchedImage = pygame.transform.scale(playerImage, (40, 40))
    21. foodImage = pygame.image.load('cherry.png')

    376
    Глава 20
    Переменная player в строке 18 будет хранить объект Rect, который от- слеживает положение и размер спрайта игрока. Переменная player не содер- жит изображение спрайта игрока. В начале программы верхний левый угол спрайта игрока расположен в (300, 100), его начальные высота и ширина со- ставляют 40 пикселей.
    Вторая переменная, представляющая спрайт игрока, — playerImage в стро- ке кода 19. Функции pygame.image.load() передается строка с именем файла за- гружаемого изображения. Возвращаемое значение представляет собой объект
    Surface
    , который содержит графику в файле изображения, отображаемого на его поверхности. Мы сохраняем этот объект Surface внутри playerImage.
    Изменение размера спрайта
    В строке кода 20 мы будем использовать новую функцию в модуле pygame.
    transform
    . Функция pygame.transform.scale() позволяет сжимать/расширять спрайт .
    Первый аргумент — это объект Surface с изображением, отображенным на нем.
    Второй аргумент — кортеж для новой ширины и высоты изображения в первом аргументе. Функция scale() возвращает объект Surface с отобра- женным изображением нового размера.
    В программе этой главы мы сделаем так, чтобы спрайт игрока растяги- вался больше по мере «поедания» вишен. Мы сохраним исходное изобра- жение в переменной playerImage, а растянутое изображение — в переменной playerStretchedImage
    В строке 21 мы снова вызываем функцию load(), чтобы создать объект
    Surface с изображением вишни, отображенном на нем. Убедитесь, что файлы
    player.png и cherry.png находятся в той же папке, что и файл spritesAndSounds.
    py, иначе модуль pygame не сможет их найти и выдаст ошибку.
    Установка музыки и звуков
    Теперь вам нужно загрузить звуковые файлы. В pygame есть два модуля для звука. Модуль pygame.mixer может воспроизводить короткие звуковые эффекты во время игры. Модуль pygame.mixer.music воспроизводит фоновую музыку.
    Добавление аудиофайлов
    Вызовите функцию-конструктор pygame.mixer.Sound() , чтобы создать объ- ект pygame.mixer.Sound (для краткости назовем объектом Sound ). Этот объект

    Использование звуков и изображений
    377
    имеет метод play(), который будет воспроизводить звуковой эффект при вы- зове.
    37. # Настройка музыки.
    38. pickUpSound = pygame.mixer.Sound('pickup.wav')
    39. pygame.mixer.music.load('background.mid')
    40. pygame.mixer.music.play(-1, 0.0)
    41. musicPlaying = True
    Код в строке 39 вызывает функцию pygame.mixer.music.load() для загруз- ки фоновой музыки, а код в строке 40 — функцию pygame.mixer.music.play(), чтобы начать воспроизведение этой музыки. Первый параметр сообщает pygame
    , сколько раз проигрывать фоновую музыку после первого запуска.
    Таким образом, передача значения 5 заставит pygame проигрывать фоновую музыку шесть раз. Здесь мы передаем параметр −1 — это специальное значе- ние, которое заставляет фоновую музыку повторяться бес конечно.
    Второй параметр play() — это момент в звуковом файле, с которого нуж- но начать воспроизведение. Передача значения 0,0 начнет воспроизведение фоновой музыки с самого начала. Передача значения 2,5 начнет воспроизве- дение с момента в 2,5 секунды после начала.
    Наконец, переменная musicPlaying имеет логическое значение, которое сообщает программе, нужно воспроизводить фоновую музыку и звуковые эффекты или нет. Было бы любезно предоставить игроку возможность за- пускать программу без звука.
    Включение/отключение звука
    Клавиша M включает или отключает фоновую музыку. Если переменной musicPlaying присвоено значение True, тогда фоновая музыка сейчас воспро- изводится, и чтобы ее остановить, нужно вызвать функцию pygame.mixer.
    music.stop()
    . Если переменной musicPlaying присвоено значение False, тог- да фоновая музыка сейчас не воспроизводится, и мы должны запустить ее, вызвав функцию play(). Для этого в строках 79–84 используются инструк- ции if.
    79. if event.key == K_m:
    80. if musicPlaying:
    81. pygame.mixer.music.stop()
    82. else:

    378
    Глава 20 83. pygame.mixer.music.play(-1, 0.0)
    84. musicPlaying = not musicPlaying
    Независимо от того, играет ли музыка или нет, нам необходимо переклю- чить значение musicPlaying.
    Переключение логического значения означает присвоение ему значения, противоположного текущему.
    Строка кода musicPlaying = not musicPlaying присваивает переменной зна- чение False, если в настоящее время она имеет значение True — или присваи- вает True, если — False.
    Представьте переключение как процесс включения или выключения света: переключение выключателя меняет его состояние на противопо- ложное.
    Отображение спрайта игрока в окне
    Помните, что значение, хранящееся в переменной playerStretchedImage, является объектом Surface. Код в строке 110 отображает спрайт игрока на объекте Surface окна (хранящемся в переменной windowSurface), используя blit()
    109. # Отображение блока на поверхности.
    110. windowSurface.blit(playerStretchedImage, player)
    Второй параметр метода blit() — это объект Rect, который указывает, где на объекте Surface должен быть отображен спрайт. Программа использует объект Rect, хранящийся в переменной player и отслеживающий положение спрайта игрока в окне.
    Проверка на столкновения
    Этот код похож на предыдущие программы, но здесь есть несколько но- вых строк.
    114. if player.colliderect(food):
    115. foods.remove(food)
    116. player = pygame.Rect(player.left, player.top, player.width + 2, player.height +
    2)

    Использование звуков и изображений
    379
    117. playerStretchedImage = pygame.transform.scale(playerImage, (player.width, player.height))
    118. if musicPlaying:
    119. pickUpSound.play()
    Когда спрайт игрока «съедает» одну из вишен, его размер увеличивается на два пикселя по высоте и ширине. В строке 116 новый объект Rect на два пикселя больше старого объекта Rect, будет назначен в качестве нового зна- чения переменной player.
    В то время как объект Rect представляет положение и размер игрока, изображение игрока сохраняется в playerStretchedImage как объект Surface.
    В строке 117 программа создает новое растянутое изображение, вызывая функцию scale().
    Растяжение изображения часто немного искажает его. Если вы продолжи- те растягивать уже растянутое изображение, то быстро получите искажения.
    Но, каждый раз растягивая исходное изображение — путем передачи функции scale()
    в качестве первого аргумента playerImage, не playerStretchedImage, — вы искажаете изображение только один раз.
    Наконец, код в строке 119 вызывает метод play() в объекте Sound, сохра- ненном в переменной pickUpSound. Но вызов осуществляется только если пе- ременной musicPlaying присвоено значение True (это означает, что звук вклю- чен).
    Отображение спрайтов вишен в окне
    В предыдущих программах вы вызывали функцию pygame.draw.rect(), чтобы отобразить зеленый квадрат для каждого объекта Rect, сохраненного в списке foods.
    Однако в данной программе вам вместо этого нужно отобразить спрайты вишен.
    Вызовите метод blit() и передайте объект Surface, хранящийся в пере- менной foodImage, на котором отображено изображение вишен.
    121. # Отображение "еды".
    122. for food in foods:
    123. windowSurface.blit(foodImage, food)
    Переменная food, содержащая каждый из объектов Rect в списке foods при каждой итерации цикла for, сообщает методу blit(), где нужно отображать foodImage

    Заключение
    Вы добавили в свою игру изображения и звук. Изображения, называе- мые спрайтами, выглядят намного лучше, чем простые рисунки, которые ис- пользовались в предыдущих программах. Спрайты можно масштабировать
    (то есть растягивать), увеличивая или уменьшая их размер, поэтому мы мо- жем отображать спрайты любого желаемого размера. В игре, представленной в этой главе, также есть фон и воспроизводятся звуковые эффекты.
    Теперь, когда мы знаем, как создавать окно, отображать спрайты и гео- метрические примитивы, получать ввод с клавиатуры и мыши, воспроизво- дить звуки и осуществлять обнаружение столкновений, мы готовы создать настоящую графическую игру в pygame. Глава 21 объединяет все эти элементы для создания нашей самой продвинутой игры.

    Игра «Ловкач» с графикой и звуком
    381
    21
    ИГРА «ЛОВКАЧ» С ГРАФИКОЙ И ЗВУКОМ
    Предыдущие четыре главы рассказали вам о модуле pygame и научили вас ис- пользовать многие его функции. В этой главе мы будем использовать эти знания для создания графической игры под на- званием «Ловкач».
    В ЭТОЙ ГЛАВЕ РАССМАТРИВАЮТСЯ СЛЕДУЮЩИЕ ТЕМЫ:
    • Флаг pygame.FULLSCREEN
    • Метод
    Rect move_ip()
    • Добавление чит-кодов
    • Изменение игры «Ловкач»
    В игре «Ловкач» игрок управляет спрайтом (своим персонажем), который должен уклоняться от целой кучи злодеев, падающих c верхней части экрана.
    Чем дольше игрок сможет уклоняться от злодеев, тем больше очков он по- лучит.
    Шутки ради мы также добавим в эту игру некоторые чит-режимы. Если игрок удерживает клавишу X, скорость каждого злодея становится сверхниз- кой. Если игрок удерживает клавишу Z, злодеи будут менять направление на противоположное, перемещаясь по экрану снизу вверх.
    Обзор основных типов данных pygame
    Прежде чем мы начнем работу над игрой «Ловкач», давайте рассмотрим некоторые основные типы данных, использующиеся в pygame:

    382
    Глава 21

    pygame.Rect
    Объекты
    Rect представляют местоположение и размер прямоугольной области. Местоположение определяется атрибутом topleft объек та
    Rect
    (или его атрибутами topright, bottomleft и bottomright). Эти угло- вые атрибуты — кортежи целых чисел для обозначения координат x и y. Размер определяется атрибутами width и height, которые являются целыми числами, указывающими количество пикселей, содержащих- ся в прямоугольнике по ширине и высоте. Объекты Rect поддержива- ют метод colliderect(), проверяющий, сталкиваются ли они с други- ми объектами Rect.

    pygame.Surface
    Объекты
    Surface представляют области цветных пикселей. Объект
    Surface представляет изображение прямоугольника, в то время как объект Rect представляет только прямоугольную область и ее распо- ложение. Объекты Surface имеют метод blit(), который используется для вывода изображения одного объекта Surface на другой такой объ- ект. Объект Surface, который возвращается функцией pygame.display.
    set_mode()
    , — особый, так как все отображенное на этом объекте, ото- бражается на экране пользователя, когда вызывается функция pygame.
    display.update()

    pygame.event.Event
    Модуль pygame.event генерирует объекты Event каждый раз, когда пользователь осуществляет ввод с клавиатуры, мыши или ввод иного рода. Функция pygame.event.get() возвращает список этих объектов
    Event
    . Вы можете определить тип объекта Event, проверив его атри- бут type. Примерами некоторых типов событий являются QUIT, KEYDOWN и MOUSEBUTTONUP. (См. раздел «Обработка событий» в главе 19, в кото- ром указан полный список всех типов событий.)

    pygame.font.Font
    Модуль pygame.font использует тип данных Font, который представля- ет шрифт, используемый для оформления текста в pygame. Аргументы, передающиеся pygame.font.SysFont() — строка с названием шрифта
    (обычно в качестве названия шрифта передается None, чтобы исполь- зовать шрифт по умолчанию) и целое число размера шрифта.

    1   ...   31   32   33   34   35   36   37   38   39


    написать администратору сайта