Задать вопрос
@IgorPosmashny
недоjunior python developer

Как сделать перемещение по меню?

Привет всем. Решил разобраться с pygame. Хочу реализовать игровое меню. Не знаю как сделать выбор пункта меню.

Как должно быть:
acad446e220249b8a3c903438862bda4.png

Как сделано сейчас:
120dc51e12da4329a1207200031c03e5.png

Код "game.py":
# -*- coding: utf-8 -*-
import pygame, menu
from pygame.locals import *

pygame.init() 
 
def mainloop():
	    while True: 
		        		for event in pygame.event.get(): 
            			if event.type == pygame.locals.QUIT: 
                 				pygame.quit() 
                 				return  
 
mainloop()


Код "menu.py" :
# -*- coding: utf-8 -*-
import pygame, sys

pygame.font.init()

bgcolor = (51, 51, 51)
font_color = (255, 255, 153)
highlite_color = (153, 102, 255)
font = pygame.font.Font('data/font/coders_crux.ttf', 72)
surface_width = 800
surface_height = 600

surface_menu = pygame.display.set_mode([surface_width,surface_height])

pygame.display.set_caption("Test")

surface_menu.fill(bgcolor)

def DrawText(text, font, surface_menu, x, y):
    	textobj = font.render(text, 1, font_color)
    	textrect = textobj.get_rect()
    	textrect.topleft = (x, y)
    	surface_menu.blit(textobj, textrect)

DrawText('Start', font, surface_menu, (surface_width/2)-65, (surface_height/2)-90)
DrawText('About', font, surface_menu, (surface_width/2)-65, (surface_height/2)-40)
DrawText('Exit', font, surface_menu, (surface_width/2)-50, (surface_height/2)+10)


pygame.display.update()
  • Вопрос задан
  • 4622 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
stakanmartini
@stakanmartini
инженер-программист
Я могу предложить два варианта. Первый - это воспользоваться дополнительным параметром background при рендере шрифта:
textobj = font.render(text, 1, font_color, highlite_color)

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

Второй вариант - это нарисовать прямоугольник нужного цвета
def DrawText(text, font, surface_menu, x, y, selected = False):
    	textobj = font.render(text, 1, font_color)
    	textrect = textobj.get_rect()
    	textrect.topleft = (x, y)
    	if selected:
    	    highlight = pygame.Surface((len(text) * 33, 65))
    	    highlight.fill(highlite_color)
    	    surface_menu.blit(highlight, [x - 18, y - 15])
    	surface_menu.blit(textobj, textrect)


Таким образом код menu.py, дающий результат как на скриншоте, будет таким:
# -*- coding: utf-8 -*-
import pygame, sys

pygame.font.init()

bgcolor = (51, 51, 51)
font_color = (255, 255, 153)
highlite_color = (153, 102, 255)
font = pygame.font.Font('data/font/coders_crux.ttf', 72)
surface_width = 800
surface_height = 600

surface_menu = pygame.display.set_mode([surface_width,surface_height])

pygame.display.set_caption("Test")

surface_menu.fill(bgcolor)

def DrawText(text, font, surface_menu, x, y, selected = False):
    	textobj = font.render(text, 1, font_color)
    	textrect = textobj.get_rect()
    	textrect.topleft = (x, y)
    	if selected:
    	    highlight = pygame.Surface((len(text) * 33, 65))
    	    highlight.fill(highlite_color)
    	    surface_menu.blit(highlight, [x - 18, y - 15])
    	surface_menu.blit(textobj, textrect)

DrawText('Start', font, surface_menu, (surface_width/2)-65, (surface_height/2)-110, True)
DrawText('Options', font, surface_menu, (surface_width/2)-65, (surface_height/2)-40)
DrawText('Quit', font, surface_menu, (surface_width/2)-65, (surface_height/2)+30)


pygame.display.update()
Ответ написан
Комментировать
@nikelen
Перемещение по меню можно реализовать несколькими способами, информация с сайта programmingnew.my1.ru/blog
1) как было указано выше в строке отображения текстовой информации вводят активный и не активный цвет, а активация цвета цвета при проверке положения курсора мышки. Пример кода:
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) # курсор мышки видим

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[1] and mp[1]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() # всё отобразить
2) С помощью прямоугольников связываем пункт меню с событием, причем перемещение по пунктам визуально отображается изменением цвета пункта или появлением активирующей картинки. Код для пунктов меню : https://www.youtube.com/watch?v=r_IkOU9PEXA
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы