KEYDOWN

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Mal wieder eine Frage von mir. Ich hoffe ihr helft mir noch mal.

Code: Alles auswählen

import pygame
import os, sys
from pygame.locals import*
from pygame.event import*
from pygame.key import*
from pygame.mouse import*
from pygame.draw import*
from pygame.display import*
pygame.init()
black = 0, 0, 0
size = width, height = 800, 800
screen = pygame.display.set_mode(size)
Player = pygame.image.load('Söldner.jpg')
Player_Rect = Player.get_rect()
while True:
[color=green]    for event in pygame.event.get():
        if event.type == KEYDOWN:
            while event.key == K_UP:
                Player_Rect = Player_Rect.move (0, -2)
            while event.key == K_DOWN:
                Player_Rect = Player_Rect.move (0, 2)
            while event.key == K_RIGHT:
                Player_Rect = Player_Rect.move (2, 0)
            while event.key == K_LEFT:
                Player_Rect = Player_Rect.move (-2, 0)[/color]


    screen.fill(black)
    screen.blit (Player, Player_Rect)
    pygame.display.update()
Kann mir jemand sagen warum das Bild sich nicht bewegt? Wenn man statt while if nimmt klappt es, aber man ´muss immer wieder drücken.
Und es heißt doch KEYDOWN, also so lange der Knopf gedrückt ist.
BlackJack

KEYDOWN ist das Ereignis das der Knopf runtergedrückt wurde, das kommt nur *einmal* und nicht ständig. Wenn man Deine Vermutung umdrehen würde, müssten ja ständig und für *alle* Tasten, die gerade nicht unten sind, Unmengen an KEYUP-Ereignissen gemeldet werden.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Stimmt. Aber wie kann ich es dann machen. Gibt es vielleicht KEYPRESS?
Ich probiers mal damit.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Verdammt Keypress gibt es nicht. JEtzt bin ich ratlos.
BlackJack

Du musst Dir die Information einfach selber merken. Wenn ein KEYDOWN gesendet wurde ein Flag setzen und wenn das dazugehörige KEYUP kommt das Flag wieder löschen.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Meinst du das in etwa so:

Code: Alles auswählen

for event in pygame.event.get():
                     if event.type == KEYDOWN:
                            if event.key == K_UP:
                                     x = 1
                                     while x == 1:
                                         Player_Rect = Player_Rect.move (0, -2)
...


Warum komm ich bloß nie auf so was? :(
BlackJack

Nein so natürlich nicht, die ``while``-Schleife wird hier ja nie verlassen, weil sich `x` in der Schleife nie ändert.

Abfrage des Flags und bewegen darf nicht in dem ``if`` passieren sondern sollte am Ende der "Event"-Schleife stehen. Ungetestet:

Code: Alles auswählen

    move_up = False
    
    for event in pygame.event.get():
        if event.type == KEYDOWN and event.key == K_UP:
            move_up = True
        if event.type == KEYUP and event.key == K_UP:
            move_up = False
        # 
        # Eventuell weitere `event`-Auswertungen...
        # 
        if move_up:
            player_rect = player_rect.move(0, -2)
        # 
        # Eventuell weitere Bewegungen...
        #
Und soweit noch nicht geschehen, sollte man eine "Framerate"-Begerenzung in die Schleife einbauen, sonst hängt die Geschwindigkeit der Bewegung von der Geschwindigkeit des Rechners ab.
Imperator
User
Beiträge: 275
Registriert: Montag 20. August 2007, 14:43
Kontaktdaten:

Ich hab ein ... hingemacht, weiß also das man die Schleife unterbrechen können muss. Aber danke!
Antworten