Не удается найти способ, чтобы одна из моих фотографий оставалась на экране при нажатии моей мыши - PullRequest
0 голосов
/ 13 января 2019

Я пытаюсь заставить изображение оставаться на экране при нажатии левой кнопки мыши. Я в основном следил за видео Sentdex на YouTube для получения информации о том, как рисовать кнопки и т. Д., Так что, если это немного грязно, то это потому, что я довольно новичок в Pygame! Цель этой игры - стать шутером от первого лица, но недавно выяснилось, что с python это практически невозможно :( Так что я просто продолжаю этот проект, чтобы посмотреть, куда еще он может пойти. Любые идеи / предложения будут высоко оценены!

import time
import pygame
from tkinter import *
#import pyautogui

pygame.mixer.pre_init(44100,16,2,4096)
pygame.init()

display_width = 1200
display_height = 600

black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)

hgrey = (77,197,179)
hlight_grey = (255,102,106)
grey = (68,187,169)
light_grey = (247,94,98)

pygame.mixer.music.load('music/privia_the_begining.mp3')
pygame.mixer.music.play(-1)

counter = 0

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Privia 1.0')
clock = pygame.time.Clock()

gameIcon = pygame.image.load('pics/priviaicon.png')
bannerIcon = pygame.image.load('pics/priviabanner.png')
backgroundMenu = pygame.image.load('pics/bgm.png')
backgroundGameType = pygame.image.load('pics/bgmws.png')

pygame.display.set_icon(gameIcon)

def text_objects(text, font):
  textSurface = font.render(text, True, black)
  return textSurface, textSurface.get_rect()

def messeage_display(text):
  largeText = pygame.font.Font('freesansbold.ttf',115)
  TextSurf, TextRect = text_objects(text, largeText)
  TextRect.center = ((display_width/2),(display_height/2))
  gameDisplay.blit(TextSurf, TextRect)

  pygame.display.update()

def button(msg,x,y,w,h,ic,ac,action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y + h > mouse[1] > y:
        pygame.draw.rect(gameDisplay, ac,(x,y,w,h))
        if click[0] == 1 and action != None:
            action()         
    else:
        pygame.draw.rect(gameDisplay, ic,(x,y,w,h))

    smallText = pygame.font.Font("freesansbold.ttf",20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)

def quitgame():
    pygame.quit()
    quit()
    pygame.mixer.stop()

def main_menu():
  intro = True

  while intro:
    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          pygame.quit()
          quit()

    gameDisplay.blit(backgroundMenu, [0, 0])

    gameDisplay.blit(bannerIcon,(300,4))

    button("SinglePlayer",430,260,350,100,grey,hgrey,game_type)
    button("Quit",507,400,200,50,light_grey,hlight_grey,quitgame)

    pygame.display.update()
    clock.tick(15)

def game_type():
  gameDisplay.blit(backgroundGameType, [0, 0])
  print("working")

main_menu()

1 Ответ

0 голосов
/ 13 января 2019

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

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

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

Была добавлена ​​новая переменная глобального флага с именем game_mode_selected и инициализирована в False, и ее значение проверяется на каждой итерации основного цикла. Пока он не имеет «истинного» значения, выполняется вызов для отображения кнопки "SinglePlayer" и проверки состояния мыши. Если щелкнуть мышью в пределах определенной для нее области и вызвать связанную функцию action, game_type(), значение этого глобального флага изменится на «запомнить», что это произошло.

Поскольку я предполагаю, что в этот момент вам больше не нужно отображать кнопку "SinglePlayer", я также добавил вызов gameDisplay.fill(black) в начало основного цикла. Без этого кнопка будет продолжать оставаться видимой, даже если она больше ничего не делает.

import time
import pygame
from tkinter import *
#import pyautogui

#pygame.mixer.pre_init(44100,16,2,4096)
pygame.init()

display_width = 1200
display_height = 600

black = (0,0,0)
white = (255,255,255)
red = (255,0,0)
green = (0,255,0)

hgrey = (77,197,179)
hlight_grey = (255,102,106)
grey = (68,187,169)
light_grey = (247,94,98)

#pygame.mixer.music.load('music/privia_the_begining.mp3')
#pygame.mixer.music.play(-1)

counter = 0

gameDisplay = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption('Privia 1.0')
clock = pygame.time.Clock()

#gameIcon = pygame.image.load('pics/priviaicon.png')
#bannerIcon = pygame.image.load('pics/priviabanner.png')
backgroundMenu = pygame.image.load('pics/bgm.png')
backgroundGameType = pygame.image.load('pics/bgmws.png')

#pygame.display.set_icon(gameIcon)

def text_objects(text, font):
  textSurface = font.render(text, True, black)
  return textSurface, textSurface.get_rect()

def messeage_display(text):
  largeText = pygame.font.Font('freesansbold.ttf',115)
  TextSurf, TextRect = text_objects(text, largeText)
  TextRect.center = ((display_width/2),(display_height/2))
  gameDisplay.blit(TextSurf, TextRect)

  pygame.display.update()

def button(msg, x, y, w, h, ic, ac, action=None):
    mouse = pygame.mouse.get_pos()
    click = pygame.mouse.get_pressed()

    if (x+w > mouse[0] > x) and (y + h > mouse[1] > y):
        pygame.draw.rect(gameDisplay, ac, (x,y,w,h))
        if click[0] == 1 and action != None:
            action()
    else:
        pygame.draw.rect(gameDisplay, ic, (x,y,w,h))

    smallText = pygame.font.Font("freesansbold.ttf", 20)
    textSurf, textRect = text_objects(msg, smallText)
    textRect.center = ( (x+(w/2)), (y+(h/2)) )
    gameDisplay.blit(textSurf, textRect)

def quitgame():
    pygame.quit()
    quit()
#    pygame.mixer.stop()

game_mode_selected = False  # New global variable

def main_menu():
  global game_mode_selected
  game_mode_selected = False
  intro = True

  while intro:
    gameDisplay.fill(black)  # Added.

    for event in pygame.event.get():
      if event.type == pygame.QUIT:
          pygame.quit()
          quit()

    gameDisplay.blit(backgroundMenu, [0, 0])

#    gameDisplay.blit(bannerIcon,(300,4))

    if not game_mode_selected:
        button("SinglePlayer", 430,260, 350,100, grey, hgrey, game_type)
    else:
        gameDisplay.blit(backgroundGameType, [0, 0])

    button("Quit", 507,400, 200,50, light_grey, hlight_grey, quitgame)

    pygame.display.update()
    clock.tick(15)

def game_type():
  global game_mode_selected
  game_mode_selected = True  # Change global because button was clicked.

  gameDisplay.blit(backgroundGameType, [0, 0])
  print("working")

main_menu()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...