Варианты оформления и реализации кнопок для меню
Если вы прошли предыдущие уроки и у вас возникло желание улучшить ваши разработки предлагаю варианты организации кнопок.
пример программы - сохраняем рисунки и музыку с урока 3 в туже папку, что и командный код и добавляем рисунки:
b1.gif b2.gif
mash1.gif b3.gif
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Добавляем к статической странице кнопки при помощи класса Sprite
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.font.init() # иницифлизация модуля шрифтов
# загрузка музыки
#pygame.mixer.music.load('music1.mp3')
def men(a,b): # отображение клавиш упрвления из пункта OPTION меню
done = True # условие существования цикла меню
pygame.mixer.music.stop()
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 Button(pygame.sprite.Sprite): # класс кнопка загружаем картинку кнопки
def __init__(self,x,y,filename ):#(название,коорд х,коорд у,название файла картинки)
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(filename)# загружаем картинку из файла
self.rect = self.image.get_rect() # определяем экземпляр как прямоугольник,координаты как у прямоугольника
self.rect[0] = x #присваиваем положение координатам
self.rect[1] = y
all_sprites_list.add(self)# заносим в список всех спрайтов
def update(self,w,h):
click = pygame.mouse.get_pressed() # нажатие кнопки мышки
mouse = pygame.mouse.get_pos() # кооздинаты мышки
# Проверка положения курсора мышки - не находится ли он на кнопке
if self.rect[0]+w>mouse[0]>self.rect[0] and self.rect[1]+h+30>mouse[1]>self.rect[1]+30:
screen.blit(im,(self.rect[0]+w,self.rect[1]))
if click[0] == 1:#если нажата левая кнопка
if self == close:#если кнопка = закрыть
sys.exit() #выйти в систему
if self == game:#если копка играть
games()# переходим к функции игра
if self == options:#если кнопка функции
men(im1,b) # переходим к функции описания клавиш
inf_font = pygame.font.SysFont('Comic Sans MS',24) #задаём шрифт
all_sprites_list = pygame.sprite.Group() # список спрайтов (для использования функции отображения draw)
# поле игры-холст
close = Button(160,450,'b1.gif')# создаём кнопку 1
game = Button(178,300,'b2.gif')# создаём кнопку 2
options = Button(200,175,'b3.gif')# создаём кнопку 3
b = inf_font.render(u'клавиши управления',1,(0,250,250)) # строка в подпункте
im1 =pygame.image.load(u'm2.gif') # создаём картинку 1
im =pygame.image.load(u'mash1.gif') # создаём картинку маши
def games():
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
# загрузка звуков
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)# повтор нажатия
dum = True
while dum:# условие существования игрового цикла
#pygame.mixer.music.stop()
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
#if dum == False:
#men(am1,b)
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
dum = False
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
dum = False
pygame.key.set_repeat(1,1)# повтор нажатия
pygame.mouse.set_visible(False) # курсор не видим
done = True # создаем условие существования цикла игры
while done:
pygame.mouse.set_visible(True)
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: # если клавиша Esc
sys.exit() # выход в систему
screen.blit(im1,(440,40)) # на экране отобразить рис1(m1) в координате х=240, у=140
im2 = pygame.transform.flip(im1,True,False)# поворот обьекта im1 - горизонтально
screen.blit(im2,(40,40)) # отображение обьекта im2 на экране
all_sprites_list.draw(screen)
options.update(200,80)
game.update(240,90)
close.update(270,90)
window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
pygame.display.flip()
Пример 2
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Добавляем к статической странице кнопки при помощи класса Sprite
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.font.init() # иницифлизация модуля шрифтов
# загрузка музыки
pygame.mixer.music.load('music1.mp3')
def men(a,b): # отображение клавиш упрвления из пункта OPTION меню
done = True # условие существования цикла меню
pygame.mixer.music.stop()
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 Button(pygame.sprite.Sprite): # класс кнопка загружаем картинку кнопки
def __init__(self,x,y,filename ):#(название,коорд х,коорд у,название файла картинки)
pygame.sprite.Sprite.__init__(self)
self.image = pygame.image.load(filename)# загружаем картинку из файла
self.rect = self.image.get_rect() # определяем экземпляр как прямоугольник,координаты как у прямоугольника
self.rect[0] = x #присваиваем положение координатам
self.rect[1] = y
all_sprites_list.add(self)# заносим в список всех спрайтов
def button(self,ac,ic,w,h):# изменяющий цвет прямоугольник (название кнопки,актив цвет,не актив цвет,ширина,высота прямоугольника)
click = pygame.mouse.get_pressed() # нажатие кнопки мышки
mouse = pygame.mouse.get_pos() # кооздинаты мышки
# Проверяем не попадает курсор на кнопку?
if self.rect[0]+w>mouse[0]>self.rect[0] and self.rect[1]+h+30>mouse[1]>self.rect[1]+30:
pygame.draw.rect(screen,ac,(self.rect[0]+25,self.rect[1]+10,w,h))
if click[0] == 1:#если нажата левая кнопка
if self == close:#если кнопка = закрыть
sys.exit() #выйти в систему
if self == game:
games()
if self == options:
men(im1,b)
else:
pygame.draw.rect(screen,ic,(self.rect[0]+25,self.rect[1]+10,w,h))
inf_font = pygame.font.SysFont('Comic Sans MS',24) #задаём шрифт
all_sprites_list = pygame.sprite.Group() # список спрайтов (для использования функции отображения draw)
# поле игры-холст
close = Button(160,450,'b1.gif')# создаём кнопку 1
game = Button(178,300,'b2.gif')# создаём кнопку 2
options = Button(200,175,'b3.gif')# создаём кнопку 3
b = inf_font.render(u'клавиши управления',1,(0,250,250)) # строка в подпункте
im1 =pygame.image.load(u'm2.gif') # создаём картинку 1
def games():
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
# загрузка звуков
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)# повтор нажатия
dum = True
while dum:# условие существования игрового цикла
#pygame.mixer.music.stop()
for e in pygame.event.get():# для любого события
if e.type == pygame.QUIT:# если было закрытие окна
sys.exit()
#if dum == False:
#men(am1,b)
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
dum = False
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
dum = False
pygame.key.set_repeat(1,1)# повтор нажатия
pygame.mouse.set_visible(False) # курсор не видим
done = True # создаем условие существования цикла игры
while done:
pygame.mouse.set_visible(True)
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: # если клавиша Esc
sys.exit() # выход в систему
options.button((255,0,0),(50,0,0),200,75)# отображаем подложку кнопки1 (актив цвет,не актив цвет,ширина,высота)
game.button((255,0,0),(50,0,0),220,85)# отображаем подложку кнопки1 (актив цвет,не актив цвет,ширина,высота)
close.button((255,0,0),(50,0,0),273,95)# отображаем подложку кнопки2 (актив цвет,не актив цвет,ширина,высота)
screen.blit(im1,(440,40)) # на экране отобразить рис1(m1) в координате х=240, у=140
im2 = pygame.transform.flip(im1,True,False)# поворот обьекта im1 - горизонтально
screen.blit(im2,(40,40)) # отображение обьекта im2 на экране
all_sprites_list.draw(screen)
window.blit(screen,(0,30)) # прорисовка на окне экрана для меню
pygame.display.flip()
|