2016-06-27 5 views
0

Dies ist mein erstes Pygame-Spiel, das ich mache.Warum springt mein Charakter nicht in pygame/python?

Ich plane ein 2-Spieler-Kampfspiel mit einfachen Quadraten/Blöcken.

Ich versuche jetzt, in das erste Zeichen zu springen und in meinen Augen sieht die ganze Logik korrekt aus und ich habe im Moment keine Fehler. Wenn ich jedoch versuche, w zu drücken, passiert nichts!

Alle Hilfe wird geschätzt. (PS, wenn Sie sich fragen, warum ich keine Klassen in meinem Skript haben, kann ich nicht scheinen, meinen Kopf um Klassen zu bekommen und sie verwirren mich sehr: P) Danke und hier ist mein Code:

import pygame 

pygame.init() 

#Sets up 8 bit colours 
white = (255,255,255) 
black = (0,0,0) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 
lightblue = (180,235,255) 
grassgreen =(20,200,50) 

#Sets up pygame window 
gameDisplay = pygame.display.set_mode((1000,600)) 
pygame.display.set_caption('Block Fighter') 

gameExit = False 

#Variables 
x = 50 
y = 480 
x_change = 0 
y_change = 0 

clock = pygame.time.Clock() 

#Main Game Loop 
while not gameExit: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      gameExit = True 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_a: 
       x_change = -5 
      if event.key == pygame.K_d: 
       x_change = 5 
      if event.key == pygame.K_w: 
       y_change = -5 
     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_a or event.key == pygame.K_d: 
       x_change = 0 

    if y <= 480: 
     onGround = False 
    else: 
     onGround = True 
    if onGround == False: 
     y_change = 5 
    if onGround == True: 
     y_change = 0 


    x += x_change 
    y += y_change 

    gameDisplay.fill(lightblue) 
    pygame.draw.rect(gameDisplay, grassgreen, [1000,600,-1000,-100]) 
    pygame.draw.rect(gameDisplay, black, [x,y,20,20]) 
    pygame.display.update() 

    clock.tick(40) 

pygame.quit() 
quit() 
+1

Auf jeden Fall etwas Aufwand in das Verständnis der Klassen. Wenn Sie Python (oder wirklich die meisten Sprachen) schreiben wollen, ist es entscheidend. Es wird auch Ihr allgemeines Verständnis dafür verbessern, wie objektorientierte Programmierung funktioniert, und Ihnen so bei allem helfen. – Jeff

+0

Was Ihr tatsächliches Problem betrifft, wenn Sie einen 'print (" changed ")' in Ihren Code hinter der Zeile 'y_change = -5' setzen, wird" geändert "gedruckt, wenn Sie w drücken? –

+0

@Jake Biggs: Johan hat gerade deine Frage beantwortet. : D –

Antwort

3

Wenn Sie die Taste w, um zu springen, wird das Spiel den Wert von y_change zu -5 wie beabsichtigt ändern. Wenn die Ereigniswarteschlange verarbeitet wurde, geht es auf diesen Block:

if y <= 480: 
     onGround = False 
else: 
    onGround = True 
if onGround == False: 
    y_change = 5 
if onGround == True: 
    y_change = 0 

Ihre Physik ist an dieser Stelle nicht simuliert noch, so dass Ihr Charakter ist immer noch auf dem Boden. Mit anderen Worten, onGround ist immer noch True. Daher wird der Code if onGround == True: y_change = 0 ausgeführt und y_change wird wieder auf 0 zurückgesetzt.

Nachdem dies passiert ist, passiert Ihre Physik-Simulation, und y_change ist jetzt 0. Dies ist der Grund, warum Ihr Charakter nicht springt. Sie müssen Ihren Code neu gestalten, damit das Spiel erkennt, dass Ihr Charakter zu springen beginnt, wenn er überprüft, ob er am Boden ist oder nicht. Viel Glück mit deinem Spiel!