Seite 1 von 1

KEYDOWN

Verfasst: Donnerstag 6. September 2007, 11:00
von Imperator
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.

Verfasst: Donnerstag 6. September 2007, 12:44
von 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.

Verfasst: Donnerstag 6. September 2007, 14:19
von Imperator
Stimmt. Aber wie kann ich es dann machen. Gibt es vielleicht KEYPRESS?
Ich probiers mal damit.

Verfasst: Donnerstag 6. September 2007, 14:28
von Imperator
Verdammt Keypress gibt es nicht. JEtzt bin ich ratlos.

Verfasst: Freitag 7. September 2007, 01:26
von 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.

Verfasst: Freitag 7. September 2007, 09:17
von Imperator
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? :(

Verfasst: Freitag 7. September 2007, 10:03
von 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.

Verfasst: Samstag 8. September 2007, 10:39
von Imperator
Ich hab ein ... hingemacht, weiß also das man die Schleife unterbrechen können muss. Aber danke!