УРОК 4
Познаём питон с самого начала. Для этого нужно пройти небольшие уроки по написанию программы при помощи следующих авторов:
sentdex, и следующий автор Евгений Колтырин, пройдя уроки по написанию игр вы с лёгкостью сможете написать свою простую игру. Пример первой игры - Маша + Миша, картинки и музыкальные файлы поместить в ту же папку куда перенесете код программы.
m2.gif mash2.gif banca.gif
fon1.gif
Музыкальные и звуковые файлы:
music1.mp3, s2.ogg, s11.wav
#!/usr/bin/env python
# -*- coding: utf-8
# использoвание шрифтов игра с полным меню
# выход в меню при шестом попадании поворот картинки по направлению движения
import sys
import os
import pygame
pygame.init()
# окно
window = pygame.display.set_mode((600,630))# создаём окно
pygame.display.set_caption('Masha and Misha') # титул строка
# поле игры-холст
info_string = pygame.Surface((600,30)) # информационная строка
screen = pygame.Surface((600,600)) # создаем игровое поле(экран)
# загрузка музыки
pygame.mixer.music.load('music1.mp3')
def men(a,b): # отображение клавиш упрвления из пункта OPTION меню
done = True # условие существования цикла меню
pygame.key.set_repeat(0,0) # отключение залипания кнопок
pygame.mouse.set_visible(True) # курсор мышки видим
while done:
screen.fill((100,0,200)) # закраска игрового поля(экрана меню)
for e in pygame.event.get():
if e.type == pygame.QUIT:
sys.exit()
if e.type == pygame.KEYDOWN:
if e.key == pygame.K_ESCAPE:
done = False
im2 = pygame.transform.flip(im1,True,False)# переворот изображения im1 - горизонтально
screen.blit(im1,(40,140)) # отображаем картинку
screen.blit(im2,(420,140)) # отображаем картинку
# отображаем информационную строку
screen.blit(b,(180,100))
screen.blit(inf_font.render(u'движение вниз - курсор DOWN',1,(0,250,250)),(130,260))
screen.blit(inf_font.render(u'движение вверх - курсор UP',1,(0,250,250)),(130,300))
screen.blit(inf_font.render(u'движение влево - курсор LEFT',1,(0,250,250)),(130,340))
screen.blit(inf_font.render(u'движение вправо - курсор RIGHT',1,(0,250,250)),(130,380))
screen.blit(inf_font.render(u'огонь - ПРОБЕЛ',1,(0,250,250)),(180,200))
screen.blit(inf_font.render(u'выход в меню - ESC',1,(0,250,250)),(180,500))
window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
pygame.display.flip() # всё отобразить
class Sprite:
def __init__(self,xpos,ypos,filename):
self.x = xpos
self.y = ypos
self.bitmap=pygame.image.load(filename) # создаем рисунок-загрузка из файла
def obgrey (self):# отображение обьекта на игровом поле(экране)
screen.blit(pygame.transform.flip(self.bitmap,True,False),(self.x,self.y))
def render (self):# отображение обьекта на игровом поле(экране)
screen.blit(self.bitmap,(self.x,self.y))
def Intersect(x1,x2,y1,y2,dl1,dl2):# dl1,dl2-параметры цели----функция столкновения
if (x1>x2-dl1) and (x1<x2+dl1) and (y1>y2-dl2) and (y1<y2+dl2):
return 1
else:
return 0
class Menu:
def __init__(self,punkt=[120,140,u'Punkt',(250,25,250),(250,250,25),0]):
self.punkts=punkts
self.ppunkts=ppunkts
def render(self,poverhnost,font,num_punkt):# подсветка активного пункта
for i in self.punkts:
if num_punkt == i[5]:
poverhnost.blit(font.render(i[2],1,i[4]),(i[0],i[1]))
else:
poverhnost.blit(font.render(i[2],1,i[3]),(i[0],i[1]))
def menu(self):
done = True
font_menu = pygame.font.Font(None,50) # определяем шрифт
pygame.key.set_repeat(0,0) # отключение залипания кнопок
pygame.mouse.set_visible(True) # курсор мышки видим
#pygame.mixer.music.load('music0.mp3')
# Проигрывание музыки.
pygame.mixer.music.play(loops=-1)
punkt = 0
while done:
screen.fill((0,100,200)) # закраска игрового поля(экрана меню)
# наведение курсора на пункт меню
# проверка событий мышь
mp = pygame.mouse.get_pos() # получаем координаты курсора [0]-x, [1]-y
for i in self.punkts:
if mp[0]>i[0] and mp[0]<i[0]+150 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.QUIT:
sys.exit()
if 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:
if punkt< len(self.punkts)-1:
punkt +=1
if e.key == pygame.K_SPACE:# активация пункта меню клавишей пробел
if punkt == 0:
done = False
if punkt == 1:
sys.exit()
if punkt == 2:
men(im1,b)
if e.type == pygame.MOUSEBUTTONDOWN and e.button ==1:
if punkt == 0:
done = False
if punkt == 1:
sys.exit()
if punkt == 2:
men(im1,b)
screen.blit(im1,(240,140))
window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
pygame.display.flip() # всё отобразить
# ШРИФТЫ
pygame.font.init() # иницифлизация модуля шрифтов
speed_font =pygame.font.SysFont('Comic Sans MS',24)
inf_font = pygame.font.SysFont('Comic Sans MS',24)
label_font = pygame.font.Font(None,32)# создаем рабочий шрифт(None-стандарт,32-размер)
im1 =pygame.image.load(u'm2.gif')
hero = Sprite(200,350,'mash2.gif')# создаём героя маша
fon = Sprite(0,0,'fon1.gif')
zet = Sprite(10,100,'m2.gif')# создаём цель миша
zet.right = False
strela=Sprite(-60,350,'banca.gif')# создание стрелы
strela.push = False
# Создаём меню для каждого пункта
punkts = [(120,140,u'GAME',(250,25,250),(250,250,25),0),(120,210,u'QUIT',(250,25,250),(250,250,25),1),(120,280,u'OPTION',(250,25,250),(250,250,25),2)]
# создаем подпункт меню OPTION
ppunkts = [(120,140,u'UP',(250,25,250),(250,250,25),0),(120,210,u'DOWN',(250,25,250),(250,250,25),1),(120,280,u'LEFT',(250,25,250),(250,250,25),2)]
b = inf_font.render(u'клавиши управления',1,(0,250,250)) # строка в подпункте
game = Menu() # создание oбьекта класса меню
game.menu() # применение метода меню к обьекту класса
# загрузка звуков
sound1 = pygame.mixer.Sound('s11.wav')
sound2 = pygame.mixer.Sound('s2.ogg')
# подготовка к игре
arrow_color = 250
zet.step = 0.6 # начальная скорость движения-миша
enumerator = 0 # количество попаданий(счёт)
dd = 0 #количество патронов
pygame.key.set_repeat(1,1)# повтор нажатия
done = True# некая переменная
while done:# условие существования игрового цикла
#pygame.mixer.music.stop()
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
if done == False:
game.menu()
if e.type == pygame.KEYDOWN: # если была нажата клавиша
if e.key == pygame.K_LEFT:
if hero.x >10:
hero.x -= 1
if e.key == pygame.K_RIGHT:
if hero.x <550:
hero.x += 1
if e.key == pygame.K_UP:
if hero.y >270:
hero.y -= 1
if e.key == pygame.K_DOWN:
if hero.y <580:
hero.y += 1
if e.key == pygame.K_SPACE:
if strela.push == False:
strela.x = hero.x
strela.y = hero.y
strela.push = True # для ограничения запуска следующей стрелы
if e.key == pygame.K_ESCAPE: # выход в меню по нажатию ESC
game.menu()
pygame.key.set_repeat(1,1) # включение залипания
pygame.mouse.set_visible(False) # курсор не видим
if e.type == pygame.MOUSEBUTTONDOWN:
if pygame.mouse.get_pressed()[2]:
m = pygame.mouse.get_pos()
hero.x = m[0]-25
hero.y= m[1]-50
if e.type == pygame.MOUSEBUTTONDOWN:
if pygame.mouse.get_pressed()[0]:
if strela.push == False:
strela.x = hero.x
strela.y = hero.y
strela.push = True
if e.type == pygame.MOUSEMOTION:# перемещение героя мышкой
pygame.mouse.set_visible(False) # скрытие курсора
m = pygame.mouse.get_pos() # получение координат мыши
if m[0]>10 and m[0]<550: # ограничение выхода героя за мышкой
hero.x = m[0]# передача координат герою
if m[1]>300 and m[1]<550:
hero.y= m[1]
# закраска
screen.fill((25,250,70))# зарисовка игрового поля(экрана)
info_string.fill((45,90,45))
# изменение цвета названия- плавно
arrow_color +=0.1
if arrow_color >250:
arrow_color = 100
# движение до границы поля и переключения движения-миша
if zet.right == True:
zet.x += zet.step # можем менять скорость
if zet.x >510:
zet.right = False
else:
zet.x -= zet.step
if zet.x <0:
zet.right = True
if strela.push == True:# движение стрелы
if strela.y>0:
strela.y -=1
else:
strela.x = -60
strela.push = False
dd +=1
# звук промаха
sound_channel = sound2.play()
if Intersect(strela.x,zet.x,strela.y,zet.y,48,48) == True:# условие столкновения
strela.x = -60
strela.push = False
zet.step -=0.1
enumerator +=1
dd +=1
# звук попадания
sound_channel = sound1.play()
# отображаем информационную строку
info_string.blit(inf_font.render(u'сьел: '+str(enumerator),1,(0,250,250)),(5,0))
info_string.blit(speed_font.render(u'баночки-'+str(dd),1,(250,250,0)),(450,0))
info_string.blit(label_font.render(u'маша+миша',1,(0,arrow_color,10)),(200,5))
# отображаем элементы#
fon.render()
if zet.right == False:
zet.render()
else:
zet.obgrey()
strela.render()
hero.render()
window.blit(info_string,(0,0))# на окне прорисовываем информационную строку
window.blit(screen,(0,30))# на окне прорисовываем поле игры
pygame.display.flip()# отображаем полностью дисплей(окно)
if enumerator == 6:
zet.step = 0.6
enumerator = 0
dd = 0
game.menu()
pygame.key.set_repeat(1,1)# повтор нажатия
pygame.mouse.set_visible(False) # курсор не видим
|