2016-12-11 4 views
0

Итак, я делаю игру в Pygame, и мне нужно меню, позволяющее игроку выбирать между различными типами игр. Я попытался сделать так, чтобы при указании инструкций игрок мог использовать клавиатуру для выбора типа; однако, игра появляется, когда я это делаю. Инструкции будут оставлены на экране (иногда выполняется рисование спрайта в плоскости). Я добавил строку кода, чтобы напечатать что-то в оболочке, когда было нажато 'e', но ничего не печатается.Проблемы с игрой Pygame

def instructions(score): 
    pygame.display.set_caption("Mail Pilot!") 

    plane = Plane() 
    ocean = Ocean() 

    allSprites = pygame.sprite.Group(ocean, plane) 
    insFont = pygame.font.SysFont(None, 50) 
    insLabels = [] 
    instructions = (
    "Mail Pilot.  Last score: %d" % score , 
    "Instructions: You are a mail pilot,", 
    "delivering mail to the islands.", 
    "", 
    "Fly over an island to drop the mail,", 
    "but be careful not to fly too close",  
    "to the clouds. Press 'e' for", 
    "endless", 
    "", 
    "good luck!", 
    "", 
    "click to start, escape to quit..." 
    ) 

    for line in instructions: 
     tempLabel = insFont.render(line, 1, (255, 255, 0)) 
     insLabels.append(tempLabel) 

    keepGoing = True 
    clock = pygame.time.Clock() 
    pygame.mouse.set_visible(False) 
    while keepGoing: 
     clock.tick(30) 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       keepGoing = False 
       donePlaying = True 
       pygame.display.quit() 
       pygame.quit() 
       sys.exit() 
##   if event.type == pygame.MOUSEBUTTONDOWN: 
##    keepGoing = False 
##    donePlaying = False 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_e: 
        gameType = "endless" 
        keepGoing = False 
        donePlaying = False 
       elif event.key == pygame.K_ESCAPE: 
        keepGoing = False 
        pygame.display.quit() 
        pygame.quit() 
        sys.exit() 
        donePlaying = True 

     allSprites.update() 
     allSprites.draw(screen) 

     for i in range(len(insLabels)): 
      screen.blit(insLabels[i], (50, 30*i)) 

     pygame.display.flip() 

    plane.sndEngine.stop()  
    pygame.mouse.set_visible(True) 
    return donePlaying 

def main(): 
    gameType = "" 
    donePlaying = False 
    score = 0 
    while not donePlaying: 
     donePlaying = instructions(score) 
     if not donePlaying: 
      if gameType == "endless": 
       score = gameEndless() 


if __name__ == "__main__": 
    main() 

Прокомментированная часть - это оригинальный код, который начнет игру.

+0

Вы должны очистить экран в каждом цикле - т.е. 'screen.fill (BLACK)' или 'blit (background)'. – furas

+0

у вас есть две локальные переменные с именем 'gameType' - сначала в' main() ', второй в' instructions() '. Вы должны использовать 'return donePlaying, gameType', чтобы вернуть это значение из' commands() 'в' main() ' – furas

+0

, или вы можете использовать словарь для config -' config = {'gameType': "", "score": 0} ', а затем' commands (config) ',' gameEndless (config) 'и вам не нужно' return'. – furas

ответ

0

Благодаря @furas за помощь в реализации этой проблемы!

Чтобы исправить программу, я добавил прямой вызов к игре из цикла if в классе инструкций.

if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_e: 
        gameType = "endless" 
        keepGoing = False 
        donePlaying = False 
        score = gameEndless() 

, а затем вернулся счет в нижней

return donePlaying, score 

Основной цикл больше не называет игру, но вместо этого просто призывает инструкции, когда donePlaying это правда

def main(): 
    donePlaying = False 
    score = 0 
    while not donePlaying: 
     donePlaying = instructions(score) 

Таким образом, , Я могу обойти проблемы основного цикла и добавить более оптимизированный подход вместо подпрыгивания между основными, интраструктурами и типами игр.

0

Это еще одна причина, по которой я пренебрегаю программированием, управляемым событиями, «омни-применимым». Хотя вы, кажется, нашел решение, я считаю, что лучший способ найти mousex и мышиный просто позвонить

mousex,mousey = pygame.mouse.get_pos() 

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

Смежные вопросы