Ich habe ein ziemlich typisches Pygame -Projekt mit einer Spielschleife, die Ereignisse verarbeitet, Spielstatus und Daten aktualisiert und dann den nächsten Frame zeichnet. Das funktioniert alles. < /P>
Aus verschiedenen Gründen ist dies nur im Moment Windows. Also dachte ich, ich würde dem Windows -Systemmenü einen "About ..." -Screening hinzufügen (a.k.a. Fenstermenü /Steuermenü).
WM_COMMAND = 0x0111
ABOUT_MENU_ID = 1001
hwnd = pygame.display.get_wm_info()["window"]
menu = ctypes.windll.user32.GetSystemMenu(hwnd, False)
ctypes.windll.user32.AppendMenuW(menu, 0, ABOUT_MENU_ID, "About...")
< /code>
Ich verstehe, dass PyGame keine Systemmeldungen erhält, daher muss ich Pygame.event.pump () verwenden. Meine vollständige Spielschleife lautet: < /p>
running = True
while running:
# Include system events.
pygame.event.pump()
if game.state == "playing":
if pygame.key.get_pressed()[pygame.K_a] or pygame.key.get_pressed()[pygame.K_LEFT]:
game.players[-1].move([-4, 0])
elif pygame.key.get_pressed()[pygame.K_d] or pygame.key.get_pressed()[pygame.K_RIGHT]:
game.players[-1].move([4, 0])
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
elif event.key == pygame.K_SPACE:
game.players[-1].fire()
elif event.type == pygame.QUIT:
running = False
elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID:
handle_about_screen()
game.handleFrame()
elif game.state == "splash":
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
if event.key == pygame.K_p:
game.__init__()
elif event.type == pygame.QUIT:
running = False
elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID:
handle_about_screen()
elif game.state == "about":
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_ESCAPE:
running = False
if event.key == pygame.K_p:
if(game.lastState == "splash"):
handle_splash_screen()
elif event.type == pygame.QUIT:
running = False
pygame.display.update()
clock.tick(game.frame_rate)
< /code>
handle_about_screen () wird nie aufgerufen. Wenn die Ereignismeldung sie zum PyGame erfolgt, wird sie nicht korrekt identifiziert. Aber Sie können die unendliche Schleife im Code unten sehen ... Ich konnte keinen Weg finden, um bei meinem Überblick über Bildschirm-Menüelemente zu kommen, ohne entweder eine offensichtliche unendliche Schleife zu haben, oder ohne potenziell wichtige Nachrichten zu werfen, die ich nicht bearbeite, oder mit der Reihenfolge der Ereignisse, die ich nicht veranlasste, nicht: < /p>
krabbelnwhile True:
msg = ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 1) # Check without removing (to avoid deleting other events)
if not msg:
break # No events found
if msg[0] == WM_COMMAND and msg[1] == ABOUT_MENU_ID:
handle_about_screen() # It's ours...
ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 0) # Remove the "About" menu message from the queue
else:
break # It's an event we don't handle... But now we're
# infinite looping because we will find this one again.
Dies scheint einfach zu sein ... fehlt mir eine offensichtliche API-, Pygame- oder Python -Funktionalität?>
Ich habe ein ziemlich typisches Pygame -Projekt mit einer Spielschleife, die Ereignisse verarbeitet, Spielstatus und Daten aktualisiert und dann den nächsten Frame zeichnet. Das funktioniert alles. < /P> Aus verschiedenen Gründen ist dies nur im Moment Windows. Also dachte ich, ich würde dem Windows -Systemmenü einen "About ..." -Screening hinzufügen (a.k.a. Fenstermenü /Steuermenü).[code]WM_COMMAND = 0x0111 ABOUT_MENU_ID = 1001 hwnd = pygame.display.get_wm_info()["window"] menu = ctypes.windll.user32.GetSystemMenu(hwnd, False) ctypes.windll.user32.AppendMenuW(menu, 0, ABOUT_MENU_ID, "About...") < /code> Ich verstehe, dass PyGame keine Systemmeldungen erhält, daher muss ich Pygame.event.pump () verwenden. Meine vollständige Spielschleife lautet: < /p> running = True while running: # Include system events. pygame.event.pump()
if game.state == "playing": if pygame.key.get_pressed()[pygame.K_a] or pygame.key.get_pressed()[pygame.K_LEFT]: game.players[-1].move([-4, 0]) elif pygame.key.get_pressed()[pygame.K_d] or pygame.key.get_pressed()[pygame.K_RIGHT]: game.players[-1].move([4, 0])
for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False elif event.key == pygame.K_SPACE: game.players[-1].fire() elif event.type == pygame.QUIT: running = False elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID: handle_about_screen() game.handleFrame() elif game.state == "splash": for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False if event.key == pygame.K_p: game.__init__() elif event.type == pygame.QUIT: running = False elif event.type == WM_COMMAND and event.wparam == ABOUT_MENU_ID: handle_about_screen() elif game.state == "about": for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False if event.key == pygame.K_p: if(game.lastState == "splash"): handle_splash_screen() elif event.type == pygame.QUIT: running = False
pygame.display.update() clock.tick(game.frame_rate) < /code> handle_about_screen () wird nie aufgerufen. Wenn die Ereignismeldung sie zum PyGame erfolgt, wird sie nicht korrekt identifiziert. Aber Sie können die unendliche Schleife im Code unten sehen ... Ich konnte keinen Weg finden, um bei meinem Überblick über Bildschirm-Menüelemente zu kommen, ohne entweder eine offensichtliche unendliche Schleife zu haben, oder ohne potenziell wichtige Nachrichten zu werfen, die ich nicht bearbeite, oder mit der Reihenfolge der Ereignisse, die ich nicht veranlasste, nicht: < /p> krabbelnwhile True: msg = ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 1) # Check without removing (to avoid deleting other events) if not msg: break # No events found
if msg[0] == WM_COMMAND and msg[1] == ABOUT_MENU_ID: handle_about_screen() # It's ours... ctypes.windll.user32.PeekMessageW(None, None, 0, 0, 0) # Remove the "About" menu message from the queue
else: break # It's an event we don't handle... But now we're # infinite looping because we will find this one again. [/code] Dies scheint einfach zu sein ... fehlt mir eine offensichtliche API-, Pygame- oder Python -Funktionalität?>
Ich habe Anfang dieser Woche gerade angefangen, den Umgang mit Pygame zu erlernen. Während ich damit herumspielte, stellte ich fest, dass, wenn ich ein Vollbildfenster erstelle, es etwa 10 Sekunden...
def draw_board():
global turn, board
for col in range(0, 5):
for row in range(0, 6):
rect_bg = pygame.draw.rect(screen, THISTLE, , 0, 10)
rect_inside_border = pygame.draw.rect(screen, BLACK, , 8,...
Ich mache ein Spiel in Pygame und versuche, ein Waffenbild um meinen Spieler um zu drehen, aber derzeit dreht sich das Bild um die obere linke Ecke des Bildes. Daher liegt die einzige korrekte...
Ich mache ein Spiel in Pygame und versuche, ein Waffenbild um meinen Spieler um zu drehen, aber derzeit dreht sich das Bild um die obere linke Ecke des Bildes. Daher liegt die einzige korrekte...