Vorneweg: Nein, ich bin kein Anfänger und ja, ich traue mir diese Aufgabe durchaus zu .
Problembeschreibung: Ich möchte ein kleines Jump'n Run-Spielchen mit (ist klar) einem steuerbaren Helden erstellen, der auch bei Sprüngen kontrollierbar bleibt. Hier habe ich das Problem, dass Python bei mehr als einer gedrückten Taste die erste "vergisst", sobald die zweite Taste ausgelassen wird.
Etwas blöd erklärt, daher folgendes Beispiel:
- Ich drücke "Pfeil-Rechts" und halte sie gedrückt; der Held läuft nach Rechts.
- Ich drücke "Pfeil-oben" und halte sie gedrückt (während "Pfeil-Rechts" ebenfalls immer noch gedrückt wird); der Held läuft jetzt schräg oben-rechts
- Ich lasse "Pfeil-oben" los; der Held bleibt - entgegen meinen Willen - komplett stehen (obwohl "Pfeil-Rechts" immer noch gedrückt wird)
---
Ich habe mal einen (extrem vereinfachten) Code erstellt, der aufzeigt, wie es genau abläuft. Zum Ausführen wird im selben Verzeichnis leider eine Grafikdatei namens "grafik.bmp" benötigt - ich weiß es leider noch nicht, wie man es anders macht:
Code: Alles auswählen
# -*- coding: cp1252 -*-
# Voreinstellungen, nix besonderes
import pygame, sys
pygame.init()
screen = pygame.display.set_mode((640,480))
screen.fill((250,250,250))
try:
player = pygame.image.load('grafik.bmp').convert()
except:
print 'Bitte Datei "grafik.bmp" mit irgendeinem Inhalt erstellen.'
sys.exit(1)
playerpos = player.get_rect()
clock = pygame.time.Clock()
# "Meine" Methode, um überhaupt sowas wie dauerhafte Tasten zu ermöglichen:
# Tastenwiederholung lt. pygame-Doku aktivieren und jeweils eine Variable
# für jede Richtung deklarieren.
pygame.key.set_repeat(1,30)
plinks = 0
prechts = 0
punten = 0
poben = 0
schleife = -1
while schleife:
screen.fill((250,250,250))
screen.blit(player, playerpos)
pygame.display.update()
clock.tick(30)
for event in pygame.event.get():
if event.type == pygame.QUIT:
schleife = 0
break
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT or plinks == 1:
playerpos = playerpos.move(-5,0)
plinks = 1
if event.key == pygame.K_RIGHT or prechts == 1:
playerpos = playerpos.move(5,0)
prechts = 1
if event.key == pygame.K_UP or poben == 1:
playerpos = playerpos.move(0,-5)
poben = 1
if event.key == pygame.K_DOWN or punten == 1:
playerpos = playerpos.move(0,5)
punten = 1
if event.key == pygame.K_ESCAPE:
schleife = 0
break
if event.type == pygame.KEYUP:
if event.key == pygame.K_LEFT:
plinks = 0
if event.key == pygame.K_RIGHT:
prechts = 0
if event.key == pygame.K_UP:
poben = 0
if event.key == pygame.K_DOWN:
punten = 0
pygame.quit()
Leider tritt dabei der beschriebene Effekt auf: Druck rechts, Druck oben, Druck oben loslassen = Stillstand.
Tjoar, ich brauche einen Anstoß: Wie löse ich das Problem? Ich hänge momentan komplett und weiß nicht, wie ich weitermachen soll... Ich hätte mir schon andere Quellcodes angesehen, die meiner Interpretation nach nicht viel anders machen, als ich... Need help^^.