Pygame: видеоигры

Первым шагом в создании видеоигры является инициализация Изучение

Pygame — это модуль на языке Python, используемый для разработки видеоигр; эти видеоигры варьируются от простых крестиков-ноликов до космических истребителей. Независимо от того, хотите ли вы разработать простую игру или сложную, вы должны начать с основ работы Pygame. В этом руководстве мы рассмотрим основы Pygame, создав видеоигру.

Установите Pygame, используя:

pip install pygame

Шаг 1: Создание начального окна

Первым шагом в создании видеоигры является инициализация pygame с помощью метода init (). Затем мы устанавливаем геометрию экрана с помощью pygame.display.set_mode (), где мы передаем ширину и высоту экрана (в этом порядке). Эти две строки кода создадут окно, которое быстро исчезнет, ​​поэтому нам нужен основной цикл, чтобы окно работало. В этот основной цикл мы добавим стратегию выхода. Стратегия выхода создается путем выбора события из списка событий (этот список событий находится в pygame.event.get (), который содержит все доступные события). Затем мы заявляем, что если выбранное нами событие — это pygame.QUIT, то выходим. Последний создаст основной цикл для окна, который будет поддерживать его работу до тех пор, пока вы не нажмете кнопку выхода.

import pygame
import sys

pygame.init()
size = width, height = 800, 600

screen = pygame.display.set_mode(size)

while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

Первым шагом в создании видеоигры является инициализация

Шаг 2. Добавление заголовков, значков, цветов фона и изображений

В этом разделе мы добавим в окно заголовки, цвета фона и изображения, а также значки.

(а) Заголовок добавлен с использованием:

# set title of window
pygame.display.set_caption(«Video Game»)

(б) Я получил свой логотип с https://icons8.com/icon/set/computer-hardware/doodle. Если вы используете PyCharm, поместите загруженный значок в соответствующую папку (в моем случае это был C: \ Users \ never \ PycharmProjects \ pythonProject2 \ icon.png). Логотип добавляется с использованием:

# set the icon
image = pygame.image.load(«icon.png»)
pygame.display.set_icon(image)

© Вы также можете изменить цвет фона. Для этого мы используем screen.fill (), который принимает цвет RGB. В моем случае я установил (0,0,0). После того, как вы установили цвет, вы также должны обновить pygame, чтобы изменение цвета вступило в силу.

# fill the background
screen.fill((0, 0, 0))
pygame.display.update()

(г) Что, если бы вы хотели установить фоновое изображение на свой экран? Это тоже возможно. Поскольку вы хотите, чтобы изображение запускалось все время, его необходимо поместить в цикл while. Фактически, все, что должно работать постоянно, должно быть помещено в главный цикл. Мы используем pygame.image.load () для выбора изображения, которое мы хотим загрузить, и метод blit () для его размещения. Здесь screen.blit () принимает два аргумента — загруженное изображение, кортеж места, куда будет помещен верхний левый угол изображения. Кроме того, для обновления экрана необходимо поместить pygame.display.update () в самый конец! При разработке видеоигр порядок, в котором вы размещаете код, имеет значение !!! Например, обновление не может предшествовать картинкам!

    # create the background image
bg_image = pygame.image.load(«bg_image.jpg»)
screen.blit(bg_image, (15,25))
pygame.display.update()

В качестве альтернативы мы также можем выгрузить его в фоновую

В качестве альтернативы мы также можем выгрузить его в фоновую функцию (что будет полезно позже), поэтому мы переписываем фон следующим образом:

# create the background image
bg_image = pygame.image.load(«bg_image_3.jpg»)

def background():
screen.blit(bg_image, (15, —25))

Обратите внимание, что мы поместили фон в функцию с именем background (), которую мы активируем в цикле while позже.

Шаг 3: Добавление изображений игрока в окно

Далее давайте создадим человека. Для этого сначала загружается изображение, а затем используется screen.blit () для его размещения.

# person image
image_person = pygame.image.load(«person.png»)
screen.blit(image_person, (400, 550))

Обратите внимание, что порядок, в котором вы размещаете код, также имеет значение! Если вы поместите код для фона после кода для врага, ни человек, ни враг не будут видны!

Однако, опять же, для всего кода мы поместим его в функцию. Таким образом, код можно переписать следующим образом:

# person image
person_x = 400
person_y = 550
image_person = pygame.image.load(«girl.png»)

def person(x,y):
screen.blit(image_person, (x, y))

Эта функция может быть активирована в цикле while следующим образом:

person(person_x, person_y)

Эта функция может быть активирована в цикле while следующим образом

Шаг 4: Переместить человека ()

Теперь это становится непросто, поэтому обратите внимание. Нам нужно нажимать клавиши, чтобы переместить человека вправо, поэтому мы введем их в цикл while следующим образом:

    pressed_keys = pygame.key.get_pressed()
if pressed_keys[pygame.K_RIGHT]:
person_x += 0.1

if pressed_keys[pygame.K_LEFT]:
person_x += —0.1

Мы используем pygame.key.get_pressed (), чтобы получить нажатую клавишу, а затем проверить ее. Если нажатая клавиша является клавишей со стрелкой вправо (pygame.K_RIGHT), то наша переменная person_x увеличивается на значение 0,1. Если, с другой стороны, нажата клавиша со стрелкой влево (pygame.K_LEFT), то мы уменьшаем на 0,1. Что мы делаем, так это меняем расположение картинки на консоли. Если нажать правую стрелку, начальный кортеж (400, 550) станет (400.1, 550) — и это местоположение изображения!

Мы также должны активировать обе функции — background () и person (). Функция background () очищает экран каждый раз при запуске цикла, и без этого у вас будет «перетаскивание».

Код в целом на этом этапе будет выглядеть так:

import pygame
import sys

# initialize
pygame.init()

# set screen geometry
size = width, height = 800, 600
screen = pygame.display.set_mode(size)

# set title of window
pygame.display.set_caption(«Video Game»)

# set the icon
image = pygame.image.load(«icon.png»)
pygame.display.set_icon(image)

# create the background image
bg_image = pygame.image.load(«bg_image_3.jpg»)

def background():
screen.blit(bg_image, (15, —25))

# person image
person_x = 400
person_y = 550
image_person = pygame.image.load(«girl.png»)

def person(x,y):
screen.blit(image_person, (x, y))

# mainloop
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

# check for keys pressed
pressed_keys = pygame.key.get_pressed()

# if the key pressed is the right arrow,
# then move to the right
if pressed_keys[pygame.K_RIGHT]:
person_x += 0.1

# if the key pressed is the left arrow,
# then move to the left
if pressed_keys[pygame.K_LEFT]:
person_x += —0.1

# activate the background function
background()

# activate the person function
person(person_x,person_y)

# update everything
pygame.display.update()

Шаг 5. Установите границы

Когда мы нажимаем клавишу со стрелкой вправо или влево, в данный момент человек (или главный герой) в нашей игре будет продолжать двигаться и двигаться даже за пределами диапазона или за пределами окна консоли. Итак, следующее, что мы должны сделать, — это установить ограничения на движение.

Установить ограничения легко. Мы переходим к аргументу press_keys [pygame.K_RIGHT] и добавляем условие. Мы добавляем условие, что x должен быть меньше ширины нашего экрана — ширины символа.

В моем случае ширина символа составляла 50 пикселей

В моем случае ширина символа составляла 50 пикселей, а ширина моего экрана по x была 800. Поэтому я установил для правой стороны значение 800 — 50 = 750 пикселей. Это ограничивает движение моего персонажа. Мой персонаж не может выходить за пределы 750 пикселей и поэтому всегда будет оставаться на экране консоли.

pressed_keys = pygame.key.get_pressed()
# if the key pressed is the right arrow,
# then move to the right
if pressed_keys[pygame.K_RIGHT] and person_x < 750:
person_x += 0.1

# if the key pressed is the left arrow,
# then move to the left
if pressed_keys[pygame.K_LEFT] and person_x > 0:
person_x += —0.1

Шаг 6: Создание врага

Создание врага — самая простая часть. Делаем это так же, как создавали главного героя. Здесь мы хотели бы рандомизировать место, где появляется враг, поэтому мы будем использовать для этого модуль random. Мы используем random.randint () для установки случайного местоположения.

импорт случайных

import random

# enemy image
enemy_x = random.randint(0, 750)
enemy_y = random.randint(0, 300)
image_enemy = pygame.image.load(«enemy.png»)

def enemy(x,y):
screen.blit(image_enemy, (x, y))

Не забудьте активировать врага в цикле while:

# activate the enemy
enemy(enemy_x, enemy_y)

Не забудьте активировать врага в цикле while

Шаг 7: перемещение врага

Перемещение врага требует немного воображения. Инициализируем переменные (вне цикла while):

#initialize variables
enemy_diff = 0.6
enemy_x = 0

А внутри цикла while мы пишем:

# move the enemy
enemy_x += enemy_diff
if enemy_x <= 0:
enemy_x = 0
enemy_diff = 0.6
if enemy_x >= 730:
enemy_x = 730
enemy_diff = —0.6

Что это значит, так это то, что если изображение врага находится в пределах границ (в данном случае от 0 до 730), оно вычисляет уравнение врага_x = врага_x + врага_дифф и перемещает его. Если, с другой стороны, местоположение врага больше, чем 730, то мы устанавливаем местоположение врага_x на 730 и меняем скорость, записывая −0,6 вместо 0,6. Если местоположение врага меньше 0, то мы устанавливаем переменную врага_x в 0 и говорим ему двигаться вперед на 0,6 пикселя. Поскольку мы имеем дело с циклом while, каждый раз, когда цикл начинается заново, он вызывает изменение переменной врага_x и, следовательно, изменения местоположения врага. В конце концов, все, что это будет делать, — это вечно перемещать врага вперед и назад влево и вправо.

Что это значит, так это то, что если изображение врага

 

Шаг 8: Создание и стрельба из нескольких пуль

В моем случае я собираюсь бросить книги в огненный шар. Так что моя пуля — это книга или несколько книг. Давайте сначала инициализируем все необходимые нам переменные:

#initialize variables
books_diff = 4
books_y = 520
books_x = 420

Книги_x и книги_y — их исходное местоположение; Я разместил их рядом с главным героем. Books_diff — его скорость. Затем мы инициализируем его состояние, которое «не движется», и загружаем изображение.

# books image
books_state = «not moving»
image_books = pygame.image.load(«books.png»)

Затем мы создаем функцию, которая принимает значение books_state. Если поместить книгу на сетку, то мы изменим ее состояние на «движется». Эта функция является основной функцией, которая помещает маркер на карту / консоль. Кроме того, в функциональных книгах () я написал x + 15 и y + 1 для центрирования изображения. Без последнего книги смотрят в сторону.

def books(x,y):
global books_state
books_state = «moving»
screen.blit(image_books, (x + 15, y + 1))

И в основном цикле вы должны написать:

    # books movement
if books_y <= 0:
books_y = 420
books_state = «not moving»

if books_state is «moving»:
books_x = person_x
books(books_x, books_y)
books_y —= books_diff

# fire if the space button is pressed
if pressed_keys[pygame.K_SPACE]:
books_x = person_x
books(books_x, books_y)

Сначала мы определяем, что происходит, когда пуля / книги перемещаются за пределы сетки или находятся в позиции y <0. В этом случае мы снова меняем состояние на «не движется» и помещаем книги обратно на ось Y в положение 420. Если, с другой стороны, книга находится в состоянии «движется», мы говорим, что мы хотим, чтобы она была для перемещения (books_y — = books_diff, где books_diff — его скорость). Затем мы также заявляем, что при нажатии клавиши мы хотим, чтобы функция books () была активирована, помещая изображение книг в сетку консоли.

Код в целом на этом этапе будет выглядеть примерно так:

import pygame
import sys

# initialize
pygame.init()

# initialize the clock
clock = pygame.time.Clock()

# set screen geometry
size = width, height = 800, 600
screen = pygame.display.set_mode(size)

# set title of window
pygame.display.set_caption(«Video Game»)

# set the icon
image = pygame.image.load(«icon.png»)
pygame.display.set_icon(image)

# create the background image
bg_image = pygame.image.load(«bg_image_3.jpg»)

def background():
screen.blit(bg_image, (15, —25))

# person image
person_x = 400
person_y = 550
image_person = pygame.image.load(«girl.png»)

def person(x,y):
screen.blit(image_person, (x, y))

import random

# enemy image
enemy_x = random.randint(0, 750)
enemy_y = random.randint(0, 300)
image_enemy = pygame.image.load(«enemy.png»)

def enemy(x,y):
screen.blit(image_enemy, (x, y))

#initialize enemy variables
enemy_diff = 0.6
enemy_x = 0

#initialize variables
books_diff = 4
books_y = 520
books_x = 420

# books image
books_state = «not moving»
image_books = pygame.image.load(«books.png»)

def books(x,y):
global books_state
books_state = «moving»
screen.blit(image_books, (x + 15, y + 1))

# mainloop
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

# check for keys pressed
pressed_keys = pygame.key.get_pressed()

# if the key pressed is the right arrow,
# then move to the right
if pressed_keys[pygame.K_RIGHT] and person_x < 750:
person_x += 0.8

# if the key pressed is the left arrow,
# then move to the left
if pressed_keys[pygame.K_LEFT] and person_x > 0:
person_x += —0.8

# activate the background function
background()

# activate the person function
person(person_x,person_y)

# move the enemy
enemy_x += enemy_diff
if enemy_x <= 0:
enemy_x = 0
enemy_diff = 0.6
if enemy_x >= 730:
enemy_x = 730
enemy_diff = —0.6

# books movement
if books_y <= 0:
books_y = 420
books_state = «not moving»

if books_state is «moving»:
books_x = person_x
books(books_x, books_y)
books_y —= books_diff

# fire if the space button is pressed
if pressed_keys[pygame.K_SPACE]:
books_x = person_x
books(books_x, books_y)

# activate the enemy
enemy(enemy_x, enemy_y)

# update everything
pygame.display.update()

clock.tick(60)

Этот код будет снимать несколько книг одну за другой при нажатии клавиши пробела.

Этот код будет снимать несколько книг одну за другой при нажатии клавиши пробела

Шаг 9: обнаружение столкновения

Следующим шагом является обнаружение столкновения, и это кажется довольно простым. Вы должны использовать pygame.Rect (x, y, width, height) для определения прямоугольника. Затем используйте метод colliderect () для обнаружения столкновения между двумя прямоугольниками. Мы также говорим, что если он обнаруживает столкновение, мы увеличиваем счет на 1, перемещаем врага и удаляем пулю, сбросив ее.

    # collision detection
enemy_rect = pygame.Rect(enemy_x, enemy_y, 64, 64)
books_rect = pygame.Rect(books_x, books_y, 64, 64)

if books_rect.colliderect(enemy_rect):
enemy_x = random.randrange(0, 800)
enemy_y = random.randrange(0, 300)
score += 1
bullet_state = «not moving»
enemy(enemy_x, enemy_y)
books_y = 0

Шаг 10: отображение текста

Вне основного цикла вы должны написать:

score = 0

#initialize font
pygame.font.init()
myfont = pygame.font.SysFont(‘Comic Sans MS’, 50)

def text_score(x, y):
text_score = myfont.render(‘Score: ‘str(score), True, (0, 0, 0))
screen.blit(text_score, (x, y))

В основном цикле вы должны написать:

    # activate text score
text_score(6, 6)

Здесь шрифты должны быть инициализированы, поэтому инициализируйте их с помощью pygame.font.init (). Затем вы выбираете шрифт с помощью pygame.font.SysFont (), где вы передаете шрифт и размер. Затем давайте определим функцию, в которой мы используем метод рендеринга для ее рендеринга. Здесь, поскольку оценка является целым числом, мы используем str (score). Затем мы размещаем их на экране с помощью метода blit ().

На этом этапе весь код будет выглядеть так:

import pygame
import sys

# initialize
pygame.init()

# initialize the clock
clock = pygame.time.Clock()

# set screen geometry
size = width, height = 800, 600
screen = pygame.display.set_mode(size)

# set title of window
pygame.display.set_caption(«Video Game»)

# set the icon
image = pygame.image.load(«icon.png»)
pygame.display.set_icon(image)

# create the background image
bg_image = pygame.image.load(«bg_image_3.jpg»)

def background():
screen.blit(bg_image, (15, —25))

# person image
person_x = 400
person_y = 550
image_person = pygame.image.load(«girl.png»)

def person(x,y):
screen.blit(image_person, (x, y))

import random

# enemy image
enemy_x = random.randint(0, 750)
enemy_y = random.randint(0, 300)
image_enemy = pygame.image.load(«enemy.png»)

def enemy(x,y):
screen.blit(image_enemy, (x, y))

#initialize enemy variables
enemy_diff = 0.6
enemy_x = 0

#initialize variables
books_diff = 4
books_y = 520
books_x = 420

# books image
books_state = «not moving»
image_books = pygame.image.load(«books.png»)

def books(x,y):
global books_state
books_state = «moving»
screen.blit(image_books, (x + 15, y + 1))

score = 0

#initialize font
pygame.font.init()
myfont = pygame.font.SysFont(‘Comic Sans MS’, 50)

def text_score(x, y):
text_score = myfont.render(‘Score: ‘str(score), True, (0, 0, 0))
screen.blit(text_score, (x, y))

# mainloop
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

# check for keys pressed
pressed_keys = pygame.key.get_pressed()

# if the key pressed is the right arrow,
# then move to the right
if pressed_keys[pygame.K_RIGHT] and person_x < 750:
person_x += 0.8

# if the key pressed is the left arrow,
# then move to the left
if pressed_keys[pygame.K_LEFT] and person_x > 0:
person_x += —0.8

# activate the background function
background()

# activate the person function
person(person_x,person_y)

# move the enemy
enemy_x += enemy_diff
if enemy_x <= 0:
enemy_x = 0
enemy_diff = 0.6
if enemy_x >= 730:
enemy_x = 730
enemy_diff = —0.6

# books movement
if books_y <= 0:
books_y = 420
books_state = «not moving»

if books_state is «moving»:
books_x = person_x
books(books_x, books_y)
books_y —= books_diff

# fire if the space button is pressed
if pressed_keys[pygame.K_SPACE]:
books_x = person_x
books(books_x, books_y)

# activate the enemy
enemy(enemy_x, enemy_y)

# collision detection
enemy_rect = pygame.Rect(enemy_x, enemy_y, 64, 64)
books_rect = pygame.Rect(books_x, books_y, 64, 64)

if books_rect.colliderect(enemy_rect):
enemy_x = random.randrange(0, 800)
enemy_y = random.randrange(0, 300)
score += 1
bullet_state = «not moving»
enemy(enemy_x, enemy_y)
books_y = 0

# activate text score
text_score(6, 6)

# update everything
pygame.display.update()

clock.tick(60)

Шаг 11: Добавление звуков

Добавлять звуки очень просто!

Вне основного цикла вы должны написать:

# initialize sounds
pygame.mixer.init()
pygame.mixer.music.load(«gun-cocking-01.wav»)

В главном цикле я собираюсь активировать звук, если произойдет столкновение! Здесь мы используем pygame.mixer.music.play ().

    # collision detection
enemy_rect = pygame.Rect(enemy_x, enemy_y, 64, 64)
books_rect = pygame.Rect(books_x, books_y, 64, 64)

if books_rect.colliderect(enemy_rect):
enemy_x = random.randrange(0, 800)
enemy_y = random.randrange(0, 300)
score += 1
bullet_state = «not moving»
enemy(enemy_x, enemy_y)
books_y = 0
pygame.mixer.music.play()

Шаг 12: Завершение игры

Я собираюсь сделать эту игру выигрышной, если результат будет больше 5. Итак, вне основного цикла мы напишем следующий код:

text_game_over = pygame.font.SysFont(‘Comic Sans MS’, 80)

# game over function
def game_over(x, y):
text_game_over_2 = myfont.render(‘YOU WON’, True, (0, 0, 0))
screen.blit(text_game_over_2, (x, y))

И в основном цикле вы должны написать:

    # check for win
if score > 5:
game_over(400, 300)
pygame.display.flip()
time.sleep(5)
break

# activate text score
text_score(6, 6)
timer(500, 6)

Это означает, что если оценка больше 5, то будет активирована функция game_over (), экран будет обновлен, а затем мы скажем, что нужно немного поспать перед тем, как выйти.

Весь код будет выглядеть так:

import pygame
import sys
import time

# initialize
pygame.init()

# initialize the clock
clock = pygame.time.Clock()

# set screen geometry
size = width, height = 800, 600
screen = pygame.display.set_mode(size)

# set title of window
pygame.display.set_caption(«Video Game»)

# set the icon
image = pygame.image.load(«icon.png»)
pygame.display.set_icon(image)

# create the background image
bg_image = pygame.image.load(«bg_image_3.jpg»)

def background():
screen.blit(bg_image, (15, —25))

# person image
person_x = 400
person_y = 550
image_person = pygame.image.load(«girl.png»)

def person(x,y):
screen.blit(image_person, (x, y))

import random

# enemy image
enemy_x = random.randint(0, 750)
enemy_y = random.randint(0, 300)
image_enemy = pygame.image.load(«enemy.png»)

def enemy(x,y):
screen.blit(image_enemy, (x, y))

#initialize enemy variables
enemy_diff = 0.6
enemy_x = 0

#initialize variables
books_diff = 4
books_y = 520
books_x = 420

# books image
books_state = «not moving»
image_books = pygame.image.load(«books.png»)

def books(x,y):
global books_state
books_state = «moving»
screen.blit(image_books, (x + 15, y + 1))

score = 0

#initialize font
pygame.font.init()
myfont = pygame.font.SysFont(‘Comic Sans MS’, 50)

def text_score(x, y):
text_score = myfont.render(‘Score: ‘str(score), True, (0, 0, 0))
screen.blit(text_score, (x, y))

# initialize sounds
pygame.mixer.init()
pygame.mixer.music.load(«gun-cocking-01.wav»)

text_game_over = pygame.font.SysFont(‘Comic Sans MS’, 80)

# game over function
def game_over(x, y):
text_game_over_2 = myfont.render(‘YOU WON’, True, (0, 0, 0))
screen.blit(text_game_over_2, (x, y))

def timer(x, y):
text_timer = myfont.render(‘Time: ‘str(pygame.time.get_ticks()), True, (0, 0, 0))
screen.blit(text_timer, (x, y))

# mainloop
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()

# check for keys pressed
pressed_keys = pygame.key.get_pressed()

# if the key pressed is the right arrow,
# then move to the right
if pressed_keys[pygame.K_RIGHT] and person_x < 750:
person_x += 0.8

# if the key pressed is the left arrow,
# then move to the left
if pressed_keys[pygame.K_LEFT] and person_x > 0:
person_x += —0.8

# activate the background function
background()

# activate the person function
person(person_x,person_y)

# move the enemy
enemy_x += enemy_diff
if enemy_x <= 0:
enemy_x = 0
enemy_diff = 0.6
if enemy_x >= 730:
enemy_x = 730
enemy_diff = —0.6

# books movement
if books_y <= 0:
books_y = 420
books_state = «not moving»

if books_state is «moving»:
books_x = person_x
books(books_x, books_y)
books_y —= books_diff

# fire if the space button is pressed
if pressed_keys[pygame.K_SPACE]:
books_x = person_x
books(books_x, books_y)

# activate the enemy
enemy(enemy_x, enemy_y)

# collision detection
enemy_rect = pygame.Rect(enemy_x, enemy_y, 64, 64)
books_rect = pygame.Rect(books_x, books_y, 64, 64)

if books_rect.colliderect(enemy_rect):
enemy_x = random.randrange(0, 800)
enemy_y = random.randrange(0, 300)
score += 1
bullet_state = «not moving»
enemy(enemy_x, enemy_y)
books_y = 0
pygame.mixer.music.play()

# check for win
if score > 5:
game_over(400, 300)
pygame.display.flip()
time.sleep(5)
break

# activate text score
text_score(6, 6)
timer(500, 6)

# update everything
pygame.display.update()

clock.tick(60)

Это, конечно, самая простая из всех игр, которые вы можете создать! Однако это начало для тех, кто хочет изучить pygame и разрабатывать лучшие видеоигры.

Это, конечно, самая простая из всех игр, которые вы можете создать

Удачной игры!

Читайте также:  График Matplotlib
Оцените статью
bestprogrammer.ru
Добавить комментарий