Pygame Event reset

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

Ich habe mit dem Modul pygame ein einfaches Jump and Run programmiert.
Den Sprung habe ich so ablaufen lassen, dass die Spielfigur, sobald man die Leertaste betätigt, mit der ersten for-schleife langsam nach oben gesetzt wird und dann wieder, mit der 2. for-schleife nach unten in die Ausgangsposition.
Das Problem ist, wenn ich die Leertaste betätige während eine der for schleifen läuft, wird das Event in der Event for schleife gespeichert(for event in pygame.events.get(): )und wenn der Sprung im Code abgeschlossen ist erneut ausgeführt. Das heißt, wenn ich die Leertaste zweimal schnell hintereinander betätige, findet der Sprung zweimal statt.
Wie kann es so umschreiben, dass - egal wie oft ich drücke - die Tastenabfrage erst wieder aktiv ist, wenn der Sprung abgeschlossen ist?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kein Code, keine sinnvolle Möglichkeit da was zu zu sagen. Bitte poste deinen Code, dann können wir da Stellung beziehen.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LOL-hunter: Du musst Dir halt irgendwo merken, dass sich die Figur gerade im Sprung befindet und die Sprungtaste solange ignorieren. Vor allem solltest Du die Ereignisse auch während des Sprungs verarbeiten, und dafür möglichst die bereits vorhandene Schleife verwenden. Also keine ``for``-Schleife für den Sprung, sondern das Schrittweise in der ``for``-Schleife erledigen, welche die Ereignisse verarbeitet. Denn ”parallel” zu dem Sprung sollen ja sicher noch andere Sachen passieren. Animieren von Objekten, Ablaufende Zeit darstellen, Gegner bewegen, …
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

schau mal hier rein, hilft dir bestimmt weiter
https://www.youtube.com/watch?v=2-DNswzCkqk
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

Vielen Dank für eure amtieren hier noch der Code! Entschuldigt wenn er nicht so effizient geschrieben ist aber ich lerne noch.😀 Und das Spiel ist bei weitem noch nicht fertig bin beim Sprung hängen geblieben.:

import pygame
import _thread
from time import sleep



pygame.init()
screen = pygame.display.set_mode((1191, 670), 0, 32)
pygame.display.set_caption('new')
pygame.key.set_repeat(1000000, 1 )

FPS = 30
fpsClock = pygame.time.Clock()


bg = pygame.image.load("bg.png")
maio = pygame.image.load("ov_maio_blank.png")
block = pygame.image.load("block.png")
bx=0
by=0
y=510
x=50
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))

while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:

for y in range(510,358,-10):
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))
pygame.display.update()

for y in range(358,510,10):
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))
pygame.display.update()


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

pygame.display.update()
fpsClock.tick(FPS)
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Und da haben wir doch das, was __blackjack__ schon geschrieben hat. Innerhalb der Event-Schleife darf es nicht noch andere Schleifen geben, die diese blockieren. Aktueller Sprungstatus in Variable und irgendwo in der while-True-Schleife aktualisieren.
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

Vielen Dank für euere Hilfe, ich werde es fixen und daraus lernen.👍😀
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

LOL-hunter hat geschrieben: Samstag 29. Dezember 2018, 22:09 Vielen Dank für eure Hilfe, hier noch der Code! Entschuldigt, wenn er nicht so effizient geschrieben ist, aber ich lerne noch.😀 Und das Spiel ist bei weitem noch nicht fertig, bin beim Sprung hängen geblieben.:

import pygame
import _thread
from time import sleep



pygame.init()
screen = pygame.display.set_mode((1191, 670), 0, 32)
pygame.display.set_caption('new')
pygame.key.set_repeat(1000000, 1 )

FPS = 30
fpsClock = pygame.time.Clock()


bg = pygame.image.load("bg.png")
maio = pygame.image.load("ov_maio_blank.png")
block = pygame.image.load("block.png")
bx=0
by=0
y=510
x=50
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))

while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:

for y in range(510,358,-10):
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))
pygame.display.update()

for y in range(358,510,10):
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))
pygame.display.update()


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

pygame.display.update()
fpsClock.tick(FPS)
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

Soll ich dann die for-Schleifen mühsam ausschreiben oder gibt es eine clevere Lösung 😄👍
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LOL-hunter: Was meinst Du mit „mühsam ausschreiben“?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

import pygame
import _thread
from time import sleep



pygame.init()
screen = pygame.display.set_mode((1191, 670), 0, 32)
pygame.display.set_caption('new')
pygame.key.set_repeat(1000000, 1 )

FPS = 30
fpsClock = pygame.time.Clock()


bg = pygame.image.load("bg.png")
maio = pygame.image.load("ov_maio_blank.png")
block = pygame.image.load("block.png")
bx=0
by=0
y=510
x=50
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, y))

while True:
for event in pygame.event.get():
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:

#-----------------------------------
screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, 510))#<--
pygame.display.update()


screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, 500)) #<--
pygame.display.update()


screen.blit(bg, (0, 0))
screen.blit(block, (bx, by))
screen.blit(maio, (x, 490))#<--
pygame.display.update()

#-usw-

#in zehnerschritten bis zum Wert 360(Sprung ) und wider zurück zum Wert 510(Landung )

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

pygame.display.update()
fpsClock.tick(FPS)

Dies Dauert sehr lange und der Code ist lang gibt es da einen einfacheren Weg ohne die for-schleife?😊
LOL-hunter
User
Beiträge: 7
Registriert: Freitag 28. Dezember 2018, 12:50

@_blackjack_
Das meine ich, jeden einzelnen Schritt der for-Schleife Ausschreiben und die Werte einzeln erhöhen.👍
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@LOL-hunter: Nein, natürlich nicht, das löst doch das Problem gar nicht. Diese Schleifen müssen ganz verschwinden, also weder als Schleife noch in dem man unsinnigerweise jeden Schleifendurchlauf als Code hinschreibt.

Du musst den Code so schreiben, dass Du Dir den Zustand irgendwie merkst und den in jedem Durchlauf der Hauptschleife dazu verwenden, das *ein* Schritt aus den ursprünglichen Schleifen gemacht wird. Du musst Dir merken bei welchem Schritt der Sprung gerade ist. Eventuell auf mehrere Werte aufgeteilt, also zum Beispiel ob überhaupt ein Sprung aktiv ist, ob der noch in der aufsteigenden, oder schon in der absteigenden Phase ist, und beim wievielten Schritt der jeweiligen Phase. Die Information kann man dann benutzen um die Position entsprechend anzupassen, und den Zustand zu aktualisieren. Am besten fasst man das in einer Klasse zusammen. Vielleicht auch gleich auf dem aufbauend was das `pygame.sprite`-Modul bietet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Und wenn du dir das Video oder andere Pygame Tutorials von "Tech with Tim" angeschaut hättest, wüsstest du wie es geht.
https://www.youtube.com/channel/UC4JX40 ... 4Sg/videos
Was hat dich bislang daran gehindert, dass zu tun?
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten