Создание игр с Python + Pygame. Урок 7. Стартовое меню.

preview_player
Показать описание
Ура, ура, ура. Долгожданный седьмой выпуск вышел. Всех прошу простить меня за ожидание дольше чем обещал, не ожидал, что так дела навалятся - учеба, работа и не только. Этот урок немного сложнее предыдущих и на любые ваши вопросы я всегда готов ответить в комментариях и ВКонтакте.

так же добавляйтесь в мою группу в ВК

Рекомендации по теме
Комментарии
Автор

7 лет назад выложили видео, а помогает по сей день!

ytaccount
Автор

Большое спасибо за урок! В сентябре начал пробовать pygame, основы ветки 3х взял из ваших уроков, но потом забросил из за других проектов... И теперь, когда pygame понадобился, вы добавляете очень нужный урок, здорово!

СвенельдПольшин
Автор

Лучшие уроки много для себя нового узнал, спасибо большое тебе за уроки !!

kcenotkcenot
Автор

Молодец! Спасибо за видео! Более доступных разъяснений не встречал.

Svips
Автор

3D с python - это очень круто! Буду ждать новых уроков 

AmercanMe
Автор

Отличное видео с подробным объяснением!! Очень выручил меня с универскоим проектом)) Если ты это читаешь, то от души СПАСИБО!!

vrnur
Автор

Огромное спасибо! Классные уроки, жду новых с нетерпением. Нужно больше уроков:D

РудольфКизовичКизовской
Автор

Бро а что делать если унопки играть и закрыть не рабоают

ЧитиловДмитрий
Автор

Евгений, ви еще планируете випускать уроки?

pythondeveloper
Автор

Урок отличый, мне понравился. Однако выедает глаза название punkt. Лучше, конечно, все это делать на чистом английском, однако это дело вкуса :)
И еще. Меню можно было сделать не прибегая к индусовству :)

AgeStar
Автор

А как сделать чтобы код заного начинался при нажатии эскейп в меню?

green_map
Автор

Выдаёт ошибку в строке def_init_(self, punkts = [120, 140, u "Punkt", (250, 250, 30, ), (250, 30, 250)]
):

nikitan
Автор

Здравствуйте мне пишет на 32 строке File "/storage/emulated/0/Python/gametophz.py", line 32
else:
^
SyntaxError: invalid syntax
вот код:
import pygame, sys
#ИГРОВОЕ ОКНО
window = pygame.display.set_mode((400, 430))
pygame')
#холст
screen = pygame.Surface((450, 450))
#строка состояния
info_string = pygame.Surface((450, 30))
#ОБЕКТЫ
class Sprite:
def __init__(self, xpos, ypos, filename):
self.x = xpos
self.y = ypos
self.bitmap = pygame.image.load(filename)
self.bitmap.set_colorkey((0, 0, 0))
def render(self):
screen.blit(self.bitmap, (self.x, self.y))

def Intersect(x1, x2, y1, y2, db1, db2):
if (x1 > x2 - db1) and (x1 < x2 + db2) and (y1 > y2 - db1) and (y1 < y2 + db2):
return 1
else:
return 0

class menu:
def __init__(self, punkts = [120, 140, u'punkt', (250, 250, 30), (250, 30, 250)]):
self.punkts = punkts
def render(self, poverhnost, font, num_punkt):
for i in self.punkts:
if num_punkt == i[5]:
1, i[4], (i[0], i[1]))
else:
1, i[3]), (i[0], i[1]))
def menu(self):
done = True
font_menu = pygame.font.Font('495.ttf', 50)
punkt = 0
while done:
screen.fill((0, 100, 200))

mp = pygame.mouse.get_pos()
for i in self.punkts:
if mp[0]>i[0] and mp[0]<i[0]+155 and mp[1]>i[1] and mp[1]<i[1]+50:
= i[5]
self.render(screen, font_menu, punkt)

for e in pygame.event.get():
e.type == pygame.QUIT:
sys.exit()
e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
sys.exit()
if e.key == pygame.K_UP:
if punkt > 0:
punkt -= 1
if e.key == pygame.K_DOWN:
punkt < len(self.punkts)-1:
+= 1
e.type == pygame.MOUSEBUTTONDOWN and e.button ==1:
punkt == 0:
= False
punkt == 1:

window.blit(screen, (0, 0))
pygame.display.flip()
#шрифты
pygame.font.init()
speed_font = pygame.font.Font(None, 32)
inf_font = pygame.font.SysFont('Comic Sans MS', 32, True, True)
label_font = pygame.font.SysFont('efum10', 32)
#ГЕРОЙ
hero = Sprite(350, 350, 'h.png')
#ЦЕЛЬ
zet = Sprite(10, 10, 'z.png')
zet.right = False
zet.step = 1
#пуля
gun = Sprite(-10, 350, 'gun.png')
gun.push = False
#menu
punkts = [(120, 140, u'Game', (250, 250, 30), (250, 30, 250), 0), (130, 210, u'Quit', (250, 250, 30), (250, 30, 250), 1)]
game = Menu(punkts)
game.menu()
#ЗАКРЫТИЕ ИГРОВОГО ОКНА И ОТСЛЕДЖОВАНИЕ НАЖАТОЙ КНОПКИ
done = True
pygame.key.set_repeat(1, 1)
enumerator = 0
arrow_color = 255
while done:
for e in pygame.event.get():
if e.type == pygame.QUIT:
done = False
#событие нажатия клавиш
if e.type == pygame.KEYDOWN:
#перемешение героя
if e.key == pygame.K_LEFT:
if hero.x > 1:
-= 1
if e.key == pygame.K_RIGHT:
hero.x < 350:
+= 1
if e.key == pygame.K_UP:
hero.y > 150:
-= 1
if e.key == pygame.K_DOWN:
hero.y < 350:
+= 1
#запуск стрелы
if e.key == pygame.K_SPACE:
gun.push == False:
= hero.x+15
= hero.y
= True
#мишка
if e.type == pygame.MOUSEMOTION:
= pygame.mouse.get_pos()
m[0] > 10 and m[0] < 350:
= m[0]
m[1] > 150 and m[1] < 350:
= m[1]

if e.type == pygame.MOUSEBUTTONDOWN:
e.button == 1:
gun.push == False:
= hero.x+15
= hero.y
= True
#заливка
screen.fill((50, 50, 50))
info_string.fill((40, 50, 67))
arrow_color += 0.1
if arrow_color > 254:
arrow_color = 50

#ДВИЖЕНИЕ ЦЕЛИ
if zet.right == True:
zet.x -= zet.step
if zet.x < 0:
zet.right = False
else:
zet.x += zet.step
if zet.x > 350:
zet.right = True
#ДВИЖЕНИЕ СТРЕЛЫ
if gun.push < 0:
gun.push == False
enumerator -= 1

if gun.y < 0:
gun.push = False
enumerator -= 1
if gun.push == False:
gun.y = 350
gun.x = -10
else:
gun.y -= 1

#СТОЛКНОВЕНИЕ СТРЕЛЫ И ЦЕЛИ
if Intersect (gun.x, zet.x, gun.y, zet.y, 40, 40) == True:
gun.push = False
zet.step += 0.2
enumerator += 1
#ОТОБРАЖЕНИЕ ЦЕЛИ И ГЕРОЯ
gun.render()
zet.render()
hero.render()
#отрисовка шрифтов
'+ str(zet.step), 1, (210, 120, 200)), (310, 5))
'+str(enumerator), 1, (0, 250, 200)), (10, 0))
', 1, (0, arrow_color, 0)), (120, 5))
#отображение холста
window.blit(info_string, (0, 0))
window.blit(screen, (0, 30))
pygame.display.flip()
pygame.time.delay(5)

treider
Автор

Можешь сказать как добавить музыку в меню и в самой игре?

FrogDoc
Автор

а почему тогда все пишут - что self по умолчанию и указывать необязаетльно

remvord
Автор

привет, пишу игру на pygame. Возникла проблема. Перегуглил все, включая зарубежные источники. Окно моей игры на растянуто на весть экран и при отрисовки в нем заднего фона фпс в игре проседает с 60 до 30 и все начинает жутко лагать. Кто-нибудь помогите оптимизировать это.

coffeecoder
Автор

Не могу понять, как у вас все работает, а у меня нет. в игровой файл встроил этот класс кнопок, но у меня не работает. Потом создал отдельно файл, записал туда код также, как на видео, просмотрев его раз 5. Но увы, даже и тут не запустилось. Единственное, что тут я не использовал как у автора, так это шрифт (я взял системный 'arial black'). Ошибок никаких, но при запуске черный экран и ничего не работает, даже крестик выхода. На клавиатуру не реагирует, на мышку не реагирует, экран черный. Что за фигня, не могу понять. То же самое происходит, если я в главный игровой файл встраиваю этот код перед тем меню, что я сам создал, а если после своего, то мой отображается нормально, но тогда окно не закрывает на крестик и не выходит на escape.

МаксимМячин-нр
Автор

Пожалуйста дай код для создания стартового меню! Мне скучно смотреть видео!

aegraphic
Автор

Эммм... Ну вы знаете что я хочу сказать.

РудольфКизовичКизовской
Автор

Traceback (most recent call last):
File "E:\Games\IGI\Archer\game.py", line 147, in <module>
game.menu()
File "E:\Games\IGI\Archer\game.py", line 46, in menu
self.render(screen, font_menu, punkt)
File "E:\Games\IGI\Archer\game.py", line 32, in render
sheet.blit(font.render(i[2], 1, i[4], (i[0], i[1])))
TypeError: Invalid background RGBA argument

вот такое выдаёт, помоги плиз(все инит с двойным подчеркиваниям)
Код ниже:
import pygame


def Intersect(x1, x2, y1, y2, db1, db2):
if (x1 > x2 - db1) and (x1 < x2 + db2) and (y1 > y2 - db1) and (y1 < y2 + db2):
return 1
else:
return 0



window = pygame.display.set_mode((800, 670))
pygame.display.set_caption('Hello, pygame!')
screen = pygame.Surface((800, 640))
info = pygame.Surface((800, 30))

class Sprite:
def __init__(self, xpos, ypos, filename):
self.x = xpos
self.y = ypos
self.bitmap = pygame.image.load(filename)
self.bitmap.set_colorkey((0, 0, 0))
def render(self):
screen.blit(self.bitmap, (self.x, self.y))

class Menu:
def __init__(self, punkts = [400, 350, u'Punkt', (9, 0, 77), (11, 0, 77)]):
self.punkts = punkts
def render(self, sheet, font, num_punkt):
for i in self.punkts:
if num_punkt == i[5]:
sheet.blit(font.render(i[2], 1, i[4], (i[0], i[1])))
else:
sheet.blit(font.render(1[2], 1, i[3], (i[0], i[1])))
def menu(self):
done = True
font_menu = pygame.font.SysFont('Arial', 50)
punkt = 0
while done:
screen.fill((0, 100, 200))

mp = pygame.mouse.get_pos()
for i in self.punkts:
if mp[0]>i[0] and mp[0]<i[0]+155 and mp[1]>i[1] and mp[1]<i[1]+50:
punkt =i[5]
self.render(screen, font_menu, punkt)

for e in pygame.event.get():
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
exit()
if e.key == pygame.K_UP:
if punkt > 0:
punkt -= 1
if e.key == pygame.K_DOWN:
if punkt < len(self.punkts)-1:
punkt += 1
if e.type == pygame.MOUSEBUTTONDOWN and e.button == 1:
if punkt == 0:
done = False
elif punkt == 1:
exit()
window.blit(screen, (0, 0))
pygame.display.flip()


hero = Sprite(400, 600, 'hero.png')
meta = Sprite(300, 0, 'object.png')
arrow = Sprite(-100, 600, 'arrow.png')

meta.move = True
hero.move_right = True
hero.move_down = True
arrow.push = False
meta.speed = 0
arrow.speed = 0.5
score = 0
lifes = 3

pygame.font.init()
score_f = pygame.font.SysFont('Arial', 32)
lifes_f = pygame.font.SysFont('Arial', 32)
end = pygame.font.SysFont('Times new roman', 80)
again = pygame.font.SysFont('Times new roman', 40)

done = True
pygame.key.set_repeat(1, 1)
while done:
for e in pygame.event.get():
if e.type == pygame.QUIT:
done = False
if e.type == pygame.MOUSEMOTION:

p = pygame.mouse.get_pos()
if p[0] > 0 and p[0] < 760:
hero.x = p[0]
if p[1] < 600 and p[1] > 200:
hero.y = p[1]
if e.type == pygame.MOUSEBUTTONDOWN:
if e.button == 1:
if arrow.push == False:
arrow.x = hero.x + 4
arrow.y = hero.y
arrow.push = True


y = -300
x = -200

if meta.move == True:
meta.x += meta.speed
if meta.x > 760:
meta.move = False
else:
meta.x -= meta.speed
if meta.x < -10:
meta.move = True

if arrow.y < 0:
arrow.push = False
lifes -= 1
if arrow.push == False:
arrow.x = -100
arrow.y = 600
else:
arrow.y -= arrow.speed

if Intersect(arrow.x, meta.x, arrow.y, meta.y, 5, 40) == True:
arrow.push = False
meta.speed += 0.2
arrow.speed += 0.2
score += 1
if lifes <= 0:
y = 300
x = 450
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_SPACE:
lifes = 3
score = 0
meta.speed = 0
else:
exit()

punkts = [(120, 140, u'Game', (9, 0, 77), (11, 0, 77), 0),
(130, 210, u'Quit', (9, 0, 77), (11, 0, 77), 1)]
game = Menu(punkts)
game.menu()



screen.fill((50, 50, 50))
info.fill((45, 80, 45))

arrow.render()
meta.render()
hero.render()


screen.blit(end.render ('Game Over', 1, (210, 120, 200)), (200, y))
screen.blit(again.render ('Try again?(press Space)', 1, (210, 120, 200)), (200, x))
info.blit(lifes_f.render ('Lifes: ' +str(lifes), 1, (210, 120, 200)), (600, 0))
info.blit(score_f.render ('Score: ' +str(score), 1, (210, 120, 200)), (5, 0))
window.blit(info, (0, 0))
window.blit(screen, (0, 30))
pygame.display.flip()
pygame.time.delay(5)

madmagic