[pygame] - Objekt hält nicht an

Hier werden alle anderen GUI-Toolkits sowie Spezial-Toolkits wie Spiele-Engines behandelt.
Antworten
Jukan
User
Beiträge: 2
Registriert: Montag 22. August 2016, 10:16

Hallo liebe Community,

ich versuche gerade mich mit pygame auseinanderzusetzen und nun bin ich auf ein kleines Problem gestoßen.
Im unteren Code wird ein Strich-Männchen gezeichnet und mit den Pfeil-Tasten lässt sich dieses bewegen. In x-Richtung klappt es auch so wie es soll, aber in y-Richtung hält das Männlein nicht an. Man muss erst in die Gegenrichtung drücken, damit es anhält. Das selbe Problem besteht auch, wenn ich die wasd-Tasten benutze (statt die Pfeil-Tasten). Ich verstehe es nicht, das der Code für die y-Achse ja der gleiche ist wie für die x-Achse.

Anmerkung: Ich weiß der Code ist nicht perfekt geschrieben. Man könnte beispielsweise das Männchen als Klasse definieren und ihr findet bestimmt noch einige andere Formfehler. Aber mir geht es nur um den oben beschriebenen Fehler. Dieses kleine Programm soll nur zum Verständnis dienen, damit ich die Benutzung der Tasten begreife.

Könnt ihr mir helfen? Vielen Dank im Voraus.

Code: Alles auswählen

import pygame
 
# Define some colors
black = (0, 0, 0)
white = (255, 255, 255)
green = (0, 255, 0)
red = (255, 0, 0)
 
 
def draw_stick_figure(screen, x, y):
    # Head
    pygame.draw.ellipse(screen, black, [1 + x, y, 10, 10], 0)
 
    # Legs
    pygame.draw.line(screen, black, [5 + x, 17 + y], [10 + x, 27 + y], 2)
    pygame.draw.line(screen, black, [5 + x, 17 + y], [x, 27 + y], 2)
 
    # Body
    pygame.draw.line(screen, red, [5 + x, 17 + y], [5 + x, 7 + y], 2)
 
    # Arms
    pygame.draw.line(screen, red, [5 + x, 7 + y], [9 + x, 17 + y], 2)
    pygame.draw.line(screen, red, [5 + x, 7 + y], [1 + x, 17 + y], 2)
 
# Setup
pygame.init()
 
# Set the width and height of the screen [width,height]
size = [800, 600]
screen = pygame.display.set_mode(size)
 
pygame.display.set_caption("My Game")
 
# Used to manage how fast the screen updates
clock = pygame.time.Clock()
 
# Hide the mouse cursor
pygame.mouse.set_visible(0)
 
# Speed in pixels per frame
x_speed = 0
y_speed = 0
 
# Current position
x_coord = 10
y_coord = 10
 
# -------- Main Program Loop -----------
done = False
while not done:
    # --- Event Processing
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True
            # User pressed down on a key
 
        elif event.type == pygame.KEYDOWN:
            # Figure out if it was an arrow key. If so
            # adjust speed.
            if event.key == pygame.K_LEFT:
                x_speed = -3
            elif event.key == pygame.K_RIGHT:
                x_speed = 3
            elif event.key == pygame.K_UP:
                y_speed = -3
            elif event.key == pygame.K_DOWN:
                y_speed = 3
 
        # User let up on a key
        elif event.type == pygame.KEYUP:
            # If it is an arrow key, reset vector back to zero
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                x_speed = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                y_speed = 0
 
    # --- Game Logic
 
    # Move the object according to the speed vector.
    x_coord += x_speed
    y_coord += y_speed
 
    # --- Drawing Code
 
    # First, clear the screen to white. Don't put other drawing commands
    # above this, or they will be erased with this command.
    screen.fill(white)
 
    draw_stick_figure(screen, x_coord, y_coord)
  
    # Go ahead and update the screen with what we've drawn.
    pygame.display.flip()
 
    # Limit frames per second
    clock.tick(60)
 
# Close the window and quit.
pygame.quit()
Zuletzt geändert von Anonymous am Montag 22. August 2016, 11:22, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@Jukan: Ich kann das Problem nicht nachvollziehen. Bei mir hält das Strichmännchen in jede Richtung wieder an wenn ich die Taste loslasse.
Astorek
User
Beiträge: 72
Registriert: Samstag 24. Januar 2009, 15:06
Kontaktdaten:

EDIT: Ich war zu vorschnell, Sorry. BlackJack (Beitrag nach mir) hat recht; Meinen Beitrag bitte ignorieren^^.


Ursprünglicher Beitrag:
Hehe, irgendwie macht jeder Pygame-Anfänger denselben Fehler, ich hab ihn damals auch gemacht^^:

Versuche, die Tastenerkennung u. das Bewegen des Bildes voneinander zu trennen, dann klappt es. Warum es klappt, würd ich ehrlichgesagt auch gerne wissen, aber so konnte ich seinerzeit das Problem lösen. Examplarisch folgendes Beispiel (nur schnell im Editor reingeschwurbelt, musst du dementsprechend anpassen):

Code: Alles auswählen

left = False
right = False
up = False
down = False

for event in pygame.event.get():
    if event.type == pygame.KEYDOWN:
       if event.key == pygame.K_LEFT:
           left = True
       if event.key == pygame.K_RIGHT:
           right = True
       if event.key == pygame.K_UP:
           up = True
       if event.key == pygame.K_DOWN:
           down = True

   if event.type == pygame.KEYUP:
       if event.key == pygame.K_LEFT:
           left = False
       if event.key == pygame.K_RIGHT:
           right = False
       if event.key == pygame.K_UP:
           up = False
       if event.key == pygame.K_DOWN:
           down = False

if left:
    x -= 1
if right:
    x += 1
if up:
    y -= 1
if down:
    y += 1

draw_stick_figure(screen, x, y)
Zuletzt geändert von Astorek am Montag 22. August 2016, 13:01, insgesamt 1-mal geändert.
BlackJack

@Astorek: Genau das hat Jukan doch gemacht‽ Statt Wahr und Falsch hat er bei den Tasten die Geschwindigkeit gesetzt, aber das macht von der Idee her ja keinen Unterschied ob man da noch mal diese unnötige Indirektion rein bringt oder nicht. Wie gesagt funktioniert Jukan's Code bei mir ohne Probleme mit Anhalten.
Jukan
User
Beiträge: 2
Registriert: Montag 22. August 2016, 10:16

Wow, erst einmal vielen Dank für eure wahnsinnig schnelle Antwort.

Leider habe ich mir das schon gedacht, dass es nicht am Code liegen kann. Da ja x- und y- Richtung identisch sind und dennoch unterschiedlich reagieren. Meine Hoffnung war, dass vielleicht bei jemanden das Problem bekannt ist/war. Die Ursache scheint also nicht bei python/pygame zu liegen. Ich werde mal versuchen auf einem anderen Rechner das Programm zu starten.

@BlackJack: Wie hast du den Code so schön hinbekommen?
Antworten