2017-01-16 4 views
0

Я пытаюсь создать игру в Pygame, где он нацелен на то, чтобы начать игру, но кнопка запуска продолжает двигаться, когда вы касаетесь ее, но окно не ответит. Я еще не закончил код, потому что я его тестировал, и он не работал. Вот мой код до сих пор:Pygame Window не отвечает

import pygame 
import random 
import time 
pygame.init() 
display = pygame.display.set_mode((800,600)) 
pygame.display.set_caption('BEST 3D PLATFORMER FPS GAME!') 
clock = pygame.time.Clock() 
pygame.display.update() 
clock.tick(60) 
display.fill((255,255,255)) 
def newposition() 
    randx = random.randrange(100, 700) 
    randy = random.randrange(100,500) 
while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pass 
     if event.ty 
    button = pygame.image.load('start.png') 
    display.blit(button,(randx,randy)) 

pygame.quit() 
quit() 
+2

Задать вопрос. Кроме того, предпочтительным будет рабочий код для этого. – robbymurphy

+1

У вас есть инструкция if, которая не выполнена должным образом. Кроме того, вы бесконечно зацикливаетесь, говоря «while True», не ожидая, или что-то остановить, это просто разрушит игру. –

+0

найди какой-то учебник, и вы узнаете быстрее, чем спрашиваете на SO – furas

ответ

1

Все комментарии внутри кода

import pygame 
import random 

# --- constants --- (UPPER_CASE names) 

WHITE = (255, 255, 255) # space after every `,` 

FPS = 30 

# --- classes --- (CamelCase names) 

#empty 

# --- functions --- (lower_case names) 

def new_position(): 
    x = random.randrange(100, 700) # space after every `,` 
    y = random.randrange(100, 500) # space after every `,` 
    return x, y # you have to return value 

# --- main --- (lower_case names) 

# - init - 

pygame.init() 

display = pygame.display.set_mode((800, 600)) # space after every `,` 

pygame.display.set_caption('BEST 3D PLATFORMER FPS GAME!') 

# - objects - 

# load only once - don't waste time to load million times in loop 
button = pygame.image.load('start.png').convert_alpha() 
button_rect = button.get_rect() # button size and position 
button_rect.topleft = new_position() # set start position 

# - mainloop - 

clock = pygame.time.Clock() 

running = True 

while running: 

    # - events - 

    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      #pass # it does nothing so you can't exit 
      running = False # to exit `while running:` 

     elif event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       running = False # to exit `while running:` 

     elif event.type == pygame.MOUSEBUTTONDOWN: 
      if event.button == 1: # left button 
       button_rect.topleft = new_position() # set new position 

     # if event.ty # Syntax Error 

    # - updates (without draws) - 

    #empty 

    # - draws (without updates) - 

    # you have to use it inside loop 
    display.fill(WHITE) # clear screeen before you draw elements in new place 

    display.blit(button, button_rect) 

    # you have to use it inside loop 
    pygame.display.update() # you have to send buffer to monitor 

    # - FPS - 

    # you have to use it inside loop 
    clock.tick(FPS) 

# - end - 

pygame.quit() 

КСТАТИ: simple template, которые вы можете использовать при запуске нового проекта.

PEP 8 -- Style Guide for Python Code

+0

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

+0

@ C._ OP может узнать, как создать хороший код - потому что код OP уродлив. См. PEP8. – furas

0

Вы должны загрузить button вне цикла (это нужно только сделать один раз.)

button = pygame.image.load('start.png')

Кроме того, у вас есть определенныеnewposition(), но не называл это. Кроме того, randx и randy не будут доступны из за пределами функции, потому что это будет локально для него.

Таким образом, изменить свою функцию следующим образом:

def newposition() 
    randx = random.randrange(100, 700) 
    randy = random.randrange(100,500) 
    return randx, randy # Output the generated values 

Затем перед циклом:

rand_coords = newposition() 

Вы просто забыли обновление На дисплее Pygame с изменениями к нему ,

В конце своего цикла, добавьте pygame.display.update(), как это:

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pass 
     # if event.ty why is that here? 

    display.blit(button,(rand_coords[0],rand_coords[1])) # Take our generated values 
    pygame.display.update() 

Окончательная код:

import pygame 
import random 
import time 

pygame.init() 
display = pygame.display.set_mode((800,600)) 
pygame.display.set_caption('BEST 3D PLATFORMER FPS GAME!') # Yeah, exactly :) 

clock = pygame.time.Clock() 

display.fill((255,255,255)) 

def newposition() 
    randx = random.randrange(100, 700) 
    randy = random.randrange(100,500) 
    return randx, randy # Output the generated values 

rand_coords = newposition() # Get rand coords 

while True: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      pygame.quit() # Quit pygame if window in closed 
     # if event.ty why is that here? 

    clock.tick(60) # This needs to be in the loop 

    display.fill((255,255,255)) # You need to refill the screen with white every frame. 
    display.blit(button,(rand_coords[0],rand_coords[1])) # Take our generated values 
    pygame.display.update() 
1

У меня была аналогичная проблема, исправление не прямо вперед. Вот мои заметки для питона 3.6.1 и 1.9.3 Pygame:

1) событие не отвечает, потому что нет дисплея генерируется для Pygame, добавьте витрину после инициализации Pygame:

pygame.init() # Initializes pygame 
pygame.display.set_mode((500, 500)) # <- add this line. It generates a window of 500 width and 500 height 

2) pygame.event.get() - это список событий, но не все классы событий имеют метод .key, например, движение мыши. Таким образом, измените все.ключевые коды обработки событий, таких как

if event.key == pygame.K_q: 
    stop = True 

Для

if event.type == pygame.KEYDOWN: 
    if event.key == pygame.K_q: 
     stop = True 

3) В некоторых комбинациях макинтош/питона даже после того, как окно генерируется не фокус/запись событий клавиатуры, это вопрос Pygame и фиксируется в повторной реализации pygame с использованием sdl2 (SDL - это кросс-платформенная библиотека разработки, которая обеспечивает низкий уровень доступа к клавиатуре, аудио, мыши и т. д.). его можно установить, следуя инструкциям здесь https://github.com/renpy/pygame_sdl2. Возможно, для этого потребуется установить homebrew, что является еще одним диспетчером пакетов для macOS. Инструкции можно найти здесь https://brew.sh/

4) после установки с помощью инструкции на GitHub ссылке вы должны изменить весь импорт Pygame импортировать pygame_sdl2 в Pygame

5) Voila! fixed ...

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