2017-12-12 2 views
0

문제가 있습니다. 이미 텍스트와 버튼으로 가득 찬 화면이 있고 버튼을 누르고 배경에 색상을 채우고 싶습니다. (나는이 주제에 관해 수백 가지의 질문이 있지만 그것들을 이해할 수는 없다). 이것은 버튼이있는 코드의 섹션입니다. 버튼을 눌렀을 때 색상을 변경하는 함수를 만드는 것이 쉽다는 생각이 들었지만 버튼을 누르면 마우스 버튼을 누르고있는 한 색상이 바뀝니다. 누르고 있지 않을 때는 텍스트와 버튼이있는 화면으로 돌아갑니다.파이썬 파이 게임 화면. 채우기

def game_loop(): 
    global display_text 
    global display_button_1 
    global display_button_2 

    gameExit = False 
    display_text = True 
    display_button_1 = True 
    display_button_2 = False 

    meie_font = pygame.font.SysFont("Arial", 36) 

    tekst = "This game will go as far as you choose!" 
    teksti_pilt1 = meie_font.render(tekst, False, (50,50,155)) 

    tekst2 = "You are the smith of your destiny" 
    teksti_pilt = meie_font.render(tekst2, False, (50,50,155)) 
######################################################################## 
    while not gameExit: 

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

     gameDisplay.fill(white) 
######################################################################## 
     if display_text: 
      gameDisplay.blit(teksti_pilt1, (100, 250)) 
      gameDisplay.blit(teksti_pilt, (100, 400)) 
######################################################################## 
     if display_button_1: 
      button("Start playing", 300,500,150,50,green,bright_green, hide_text) 
######################################################################## 
     if display_button_2: 
      #gameDisplay.fill(white) 
      bg = pygame.image.load("natsalo.jpg") 
      gameDisplay.blit(bg, (0, 0)) 

      tekst = "You, just have a friendly dinner with your family!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 30)) 

      tekst = "It wasn't so usualy as always, it was always something...!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (50, 100)) 

      tekst = "You are Lee Everett, you are a professor who taught history" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (25, 170)) 

      tekst = "For over six years at the University of Georgia" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 240)) 

      tekst = "You, just have a friendly dinner with your family!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 310)) 

      button("I am to lazy to wash hands, just sit", 100,500,600,50,green,bright_green, hide_text) 
      button("Wash your hands", 100,400,600,50,green,bright_green, next_screen) 

     def next_screen(): 
      gameDisplay.fill((0,0,0)) 


     pygame.display.update() 

이것은 필요한 경우 전체 코드입니다.

import pygame 
import sys 


pygame.init() 
############# 
pygame.mixer.music.load('Invincible.mp3') 
pygame.mixer.music.play() 

############# 
clock = pygame.time.Clock() 

display_width = 800 
display_height = 600 

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

red = (200,0,0) 
green = (0,200,0) 

bright_red = (255,0,0) 
bright_green = (0,255,0) 

block_color = (53,115,255) 


gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('One Day After') 
clock = pygame.time.Clock() 

gameIcon = pygame.image.load('gameicon.jpg') 
pygame.display.set_icon(gameIcon) 

pause = False 

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


def GameOver(): 
    #################################### 
    pygame.mixer.Sound.play("smb_gameover.wav") 
    pygame.mixer.music.stop() 
    #################################### 
    largeText = pygame.font.SysFont("comicsansms",115) 
    TextSurf, TextRect = text_objects("Game Over", largeText) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 


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



     button("Play Again",150,450,100,50,green,bright_green,game_loop) 
     button("Quit",550,450,100,50,red,bright_red,quitgame) 

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

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: 
      pygame.mixer.music.stop() 
      action() 

    else: 
     pygame.draw.rect(gameDisplay, ic,(x,y,w,h)) 
    smallText = pygame.font.SysFont("comicsansms",20) 
    textSurf, textRect = text_objects(msg, smallText) 
    textRect.center = ((x+(w/2)), (y+(h/2))) 
    gameDisplay.blit(textSurf, textRect) 


def quitgame(): 
    pygame.quit() 
    sys.exit() 
    quit() 

def hide_text(): 
    global display_text 
    global display_button_1 
    global display_button_2 

    display_text = False 
    display_button_1 = False 
    display_button_2 = True 

def unpause(): 
    global pause 
    pygame.mixer.music.unpause() 
    pause = False 


def paused(): 
    ############ 
    pygame.mixer.music.pause() 
    ############# 
    largeText = pygame.font.SysFont("comicsansms",115) 
    TextSurf, TextRect = text_objects("Paused", largeText) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 


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


     button("Continue",150,450,100,50,green,bright_green,unpause) 
     button("Quit",550,450,100,50,red,bright_red,quitgame) 

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


def game_intro(): 

    intro = True 

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

     pilt1 = pygame.image.load('apoc2.jpg').convert() 
     gameDisplay.blit(pilt1, [0,0]) 

     button("Start",150,450,100,50,green,bright_green,game_loop) 
     button("Quit",550,450,100,50,red,bright_red,quitgame) 

     pygame.display.update() 

def game_loop(): 
    global display_text 
    global display_button_1 
    global display_button_2 

    gameExit = False 
    display_text = True 
    display_button_1 = True 
    display_button_2 = False 

    meie_font = pygame.font.SysFont("Arial", 36) 

    tekst = "This game will go as far as you choose!" 
    teksti_pilt1 = meie_font.render(tekst, False, (50,50,155)) 

    tekst2 = "You are the smith of your destiny" 
    teksti_pilt = meie_font.render(tekst2, False, (50,50,155)) 
######################################################################## 
    while not gameExit: 

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

     gameDisplay.fill(white) 
######################################################################## 
     if display_text: 
      gameDisplay.blit(teksti_pilt1, (100, 250)) 
      gameDisplay.blit(teksti_pilt, (100, 400)) 
######################################################################## 
     if display_button_1: 
      button("Start playing", 300,500,150,50,green,bright_green, hide_text) 
######################################################################## 
     if display_button_2: 
      #gameDisplay.fill(white) 
      bg = pygame.image.load("natsalo.jpg") 
      gameDisplay.blit(bg, (0, 0)) 

      tekst = "You, just have a friendly dinner with your family!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 30)) 

      tekst = "It wasn't so usualy as always, it was always something...!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (50, 100)) 

      tekst = "You are Lee Everett, you are a professor who taught history" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (25, 170)) 

      tekst = "For over six years at the University of Georgia" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 240)) 

      tekst = "You, just have a friendly dinner with your family!" 
      meie_font = pygame.font.SysFont("Arial", 36) 
      teksti_pilt = meie_font.render(tekst, False, (25,25,155)) 
      gameDisplay.blit(teksti_pilt, (100, 310)) 

      button("I am to lazy to wash hands, just sit", 100,500,600,50,green,bright_green, hide_text) 
      button("Wash your hands", 100,400,600,50,green,bright_green, next_screen) 

     def next_screen(): 
      gameDisplay.fill((0,0,0)) 


     pygame.display.update() 



game_intro() 
game_loop() 
pygame.quit() 
quit() 
+1

[mcve 페이지] (https://stackoverflow.com/help/mcve)를 참조하십시오. 우리는 관련 코드 만 포함하고 복사, 붙여 넣기 및 실행할 수있는 최소한의 예제를 좋아합니다. 당신이하려는 일은 내게는 분명하지 않습니다. 올바르게 이해하면 다음 장면으로 전환하고 화면을 지우거나 채우고 싶지만 이전 그래픽은 계속 볼 수 있습니다. 그 맞습니까? – skrx

+0

@skrx 예, 그것이 계획이었습니다. (버튼을 누르면) 다음 장면으로 전환하려고 할 때 화면에 색상이 채워지지만 마우스 버튼을 놓으면 이전 그래픽이 여전히 보입니다. –

+0

어떤 버튼을 의미합니까? ''손 씻으 라구? '? 'while' 루프가 어떻게 작동하는지 모를 것 같습니다 - 모든 코드를 반복해서 반복합니다 - 버튼을 클릭하면 색상이'(0,0,0)'로 바뀌지 만 while 루프는 처음으로 돌아갑니다. 모든 요소를 ​​다시 그립니다. 변수'True/False'를 사용하여 어떤 요소를 표시하고'fill (white)'에서 사용해야하는 변수'background_color'를 제어해야합니다. 그리고 나서 새로운 색상을'background_color'에 할당 할 수 있습니다. 그리고 나서 그것을 사용할 것입니다. – furas

답변

0

코드를 재구성해야합니다.

나는 fill(), 텍스트, 버튼 및 update()으로 "subscenes"을 만듭니다.

변수 번호는 display_subscene이고 숫자는 subscene 표시를 결정합니다.

클래스를 사용하여 더 잘 구성 할 수 있습니다.

이제 주된 문제점은 mouse.get_pressed()을 사용하는 버튼입니다. 그래서 다른 서브 스테이션의 같은 위치에서 버튼을 계속 누르고 있습니다. 버튼을 다른 장소로 옮겨야했습니다.

당신은 모든을 클릭하지 않는 내가 (새 인수로) button()에서 사용하는 변수 mouse_button을 설정 event.type == MOUSEBUTTONDOWN를 사용할 때마다 루프 및이 방법으로 event.type == MOUSEBUTTONDOWN


편집를 사용하는 것 내가 누른 버튼을 누른 시간. 변수 mouse_button은 각각 for event 앞에 0으로 설정해야합니다.

Pause 화면에 반투명 배경을 추가합니다. pgame_loop을 눌러 볼 수 있습니다.

import pygame 
import sys 

# --- constants --- 

display_width = 800 
display_height = 600 

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

red = (200,0,0) 
green = (0,200,0) 

bright_red = (255,0,0) 
bright_green = (0,255,0) 

block_color = (53,115,255) 

# --- functions --- 

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

def button(msg, x, y, w, h, ic, ac, click, action=None): 

    mouse = pygame.mouse.get_pos() 

    if x+w > mouse[0] > x and y+h > mouse[1] > y: 
     pygame.draw.rect(gameDisplay, ac,(x,y,w,h)) 
     if click == 1 and action != None: # <-- click instead of click[0] 
      pygame.mixer.music.stop() 
      action() 
    else: 
     pygame.draw.rect(gameDisplay, ic,(x,y,w,h)) 

    smallText = pygame.font.SysFont("comicsansms",20) 
    textSurf, textRect = text_objects(msg, smallText) 
    textRect.center = ((x+(w/2)), (y+(h/2))) 

    gameDisplay.blit(textSurf, textRect) 

def quitgame(): 
    pygame.quit() 
    sys.exit() 
    quit() 

# --- scenes --- 

# - scene Paused - 

def unpause(): 
    global pause 
    #pygame.mixer.music.unpause() 

    pause = False 

def paused(): 
    global pause 

    pause = True 

    background_image = pygame.Surface((display_width, display_height)).convert() 
    background_rect = background_image.get_rect(center=(display_width//2, display_height//2)) 
    background_image.set_alpha(220) 

    gameDisplay.blit(background_image, background_rect) 

    largeText = pygame.font.SysFont("comicsansms", 115) 
    TextSurf, TextRect = text_objects("Paused", largeText, white) 
    TextRect.center = ((display_width/2),(display_height/2)) 
    gameDisplay.blit(TextSurf, TextRect) 

    while pause: 

     mouse_button = 0 # reset in every loop 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       mouse_button = event.button 

     button("Continue",150,450,100,50,green,bright_green, mouse_button, unpause) 
     button("Quit",550,450,100,50,red,bright_red, mouse_button, quitgame) 

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

# - scene GameOver - 

def GameOver(): 

    largeText = pygame.font.SysFont("comicsansms",115) 
    TextSurf, TextRect = text_objects("Game Over", largeText) 
    TextRect.center = ((display_width/2),(display_height/2)) 

    gameDisplay.blit(TextSurf, TextRect) 

    while True: 

     mouse_button = 0 # reset in every loop 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       mouse_button = event.button 

     button("Play Again",150,450,100,50,green,bright_green, mouse_button, game_loop) 
     button("Quit",550,450,100,50,red,bright_red, mouse_button, quitgame) 

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

# - scene GameIntro - 

def game_intro(): 

    # - objects - 

    #pilt1 = pygame.image.load('apoc2.jpg').convert() 

    # - loop - 

    intro = True 

    while intro: 

     # - events - 

     mouse_button = 0 # reset in every loop 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       pygame.quit() 
       quit() 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       mouse_button = event.button 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_p: 
        paused() 

     # - updates - 

     button("Start",150,450,100,50,green,bright_green, mouse_button, game_loop) 
     button("Quit",550,450,100,50,red,bright_red, mouse_button, quitgame) 

     # - draws - 

     #gameDisplay.blit(pilt1, [0,0]) 
     pygame.display.update() 

# - scene GameLoop - 

def goto_subscene(number): 
    global display_subscene 

    display_subscene = number 

def game_loop(): 
    global display_subscene 

    # at start display subscene 1 
    display_subscene = 1 

    #bg = pygame.image.load("natsalo.jpg") 

    meie_font = pygame.font.SysFont("Arial", 36) 

    # - subscene 1 - 

    tekst = "This game will go as far as you choose!" 
    subscene_1_text_1 = meie_font.render(tekst, False, (50,50,155)) 

    tekst = "You are the smith of your destiny" 
    subscene_1_text_2 = meie_font.render(tekst, False, (50,50,155)) 

    # - subscene 2 - 

    tekst = "You, just have a friendly dinner with your family!" 
    subscene_2_text_1 = meie_font.render(tekst, False, (25,25,155)) 

    tekst = "It wasn't so usualy as always, it was always something...!" 
    subscene_2_text_2 = meie_font.render(tekst, False, (25,25,155)) 

    tekst = "You are Lee Everett, you are a professor who taught history" 
    subscene_2_text_3 = meie_font.render(tekst, False, (25,25,155)) 

    tekst = "For over six years at the University of Georgia" 
    subscene_2_text_4 = meie_font.render(tekst, False, (25,25,155)) 

    tekst = "You, just have a friendly dinner with your family!" 
    subscene_2_text_5 = meie_font.render(tekst, False, (25,25,155)) 

    # - subscene 3 - 

    tekst = "You killed by viruses !" 
    subscene_3_text_1 = meie_font.render(tekst, False, white) 

    # - subscene 4 - 

    tekst = "You lost searching bathroom !" 
    subscene_4_text_1 = meie_font.render(tekst, False, white) 

    # - subscene 5 - 

    tekst = "Good Bye !" 
    subscene_5_text_1 = meie_font.render(tekst, False, white) 

    # - loop - 

    gameExit = False 

    while not gameExit: 

     mouse_button = 0 # reset in every loop 

     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       return 
      elif event.type == pygame.MOUSEBUTTONDOWN: 
       mouse_button = event.button 
      elif event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_p: 
        paused() 

     if display_subscene == 1: 
      gameDisplay.fill(white) 

      gameDisplay.blit(subscene_1_text_1, (100, 250)) 
      gameDisplay.blit(subscene_1_text_2, (100, 400)) 

      button("Start playing", 300,500,150,50,green,bright_green, mouse_button, lambda:goto_subscene(2)) 

      pygame.display.update() 

     elif display_subscene == 2: 
      gameDisplay.fill(white) 

      gameDisplay.blit(subscene_2_text_1, (100, 30)) 
      gameDisplay.blit(subscene_2_text_2, (50, 100)) 
      gameDisplay.blit(subscene_2_text_3, (25, 170)) 
      gameDisplay.blit(subscene_2_text_4, (100, 240)) 
      gameDisplay.blit(subscene_2_text_5, (100, 310)) 

      button("Wash your hands", 100,400,600,50,green,bright_green, mouse_button, lambda:goto_subscene(4)) 
      button("I am to lazy to wash hands, just sit", 100,500,600,50,green,bright_green, mouse_button, lambda:goto_subscene(3)) 

      pygame.display.update() 

     elif display_subscene == 3: 
      gameDisplay.fill(black) 

      gameDisplay.blit(subscene_3_text_1, (100, 30)) 
      button("Go forward", 100,500,600,50,green,bright_green, mouse_button, lambda:goto_subscene(5)) 

      pygame.display.update() 

     elif display_subscene == 4: 
      gameDisplay.fill(black) 

      gameDisplay.blit(subscene_4_text_1, (100, 30)) 
      button("Go forward", 100,500,600,50,green,bright_green, mouse_button, lambda:goto_subscene(5)) 

      pygame.display.update() 

     elif display_subscene == 5: 
      gameDisplay.fill(black) 

      gameDisplay.blit(subscene_5_text_1, (100, 30)) 
      button("Exit", 100,500,600,50,green,bright_green, mouse_button, quitgame) 

      pygame.display.update() 

# --- main --- 

# - init - 

pygame.init() 
gameDisplay = pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('One Day After') 

# - m 

clock = pygame.time.Clock() 
pause = False 

game_intro() 
game_loop() 
pygame.quit() 
+0

@ 0x5453 코드를 넣은 다음 설명을 쓰기 시작합니다. :) – furas