2014-01-27 24 views
0

我一直在編寫一個簡單的平臺遊戲,用戶控制一個正方形並且必須到達窗口的另一側,而不與其他正方形碰撞。我希望其他4個方格反彈向上和向下,所以我寫了這個代碼:Python和Pygame - 試圖上下跳動矩形

import pygame 
import os 
import sys 

os.environ['SDL_VIDEO_CENTERED'] = "1" 
pygame.init() 

#Variables: 
width = 600 
height = width/16 * 9 

running = True 

#Colors 
PINK = (255, 79, 161) 
BLACK = (0, 0, 0) 
BLUE = (0, 0, 255) 

clock = pygame.time.Clock() 

#MainRectProperties 
mainRectX = 0 
mainRectY = height/2 - 20 
mainRectSpeed = 250 

#RectOneProperties: 
rectOneX = 150 
rectOneY = 0 

#RectTwoPropeties: 
rectTwoX = 250 
rectTwoY = height - 20 

#RectThreeProperties: 
rectThreeX = 350 
rectThreeY = 0 

#RectFourProperties: 
rectFourX = 450 
rectFourY = height - 20 

#Window: 
window = pygame.display.set_mode((width, height)) 
windowText = pygame.display.set_caption("Pixel Animation") 

#Rectangles: 
mainRect = pygame.draw.rect(window, PINK, (mainRectX, mainRectY, 20, 20), 0) 
obstacleRect1 = pygame.draw.rect(window, BLUE, (rectOneX, rectOneY, 20, 20), 0) 
obstacleRect2 = pygame.draw.rect(window, BLUE, (rectTwoX, rectTwoY, 20, 20,), 0) 
obstacleRect3 = pygame.draw.rect(window, BLUE, (rectThreeX, rectThreeY, 20, 20), 0) 
obstacleRect4 = pygame.draw.rect(window, BLUE, (rectFourX, rectFourY, 20, 20), 0) 
pygame.display.flip() 

#UpdateMainRectFunction 
def updateMainRect(x, y): 
    window.fill(BLACK) 
    mainRect = pygame.draw.rect(window, PINK, (mainRectX, mainRectY, 20, 20), 0) 
    pygame.display.flip() 
    clock.tick(250) 

#GameLoop 
while running: 
    goingDown = True 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      sys.exit() 

    if rectOneY < height - 21 and goingDown: 
     print "b" 
     pygame.draw.rect(window, BLACK, (rectOneX, rectOneY, 20, 20), 0) 
     rectOneY += 1 
     obstacleRect1 = pygame.draw.rect(window, BLUE, (rectOneX, rectOneY, 20, 20), 0) 
     pygame.display.flip() 
     clock.tick(100) 
     if rectOneY == height - 21: 
      goingDown = False 
     else: 
      goingDown = True 

    if not goingDown and rectOneY != 0: 
     print "a" 
     pygame.draw.rect(window, BLACK, (rectOneX, rectOneY, 20, 20), 0) 
     rectOneY -= 1 
     obstacleRect1 = pygame.draw.rect(window, BLUE, (rectOneX, rectOneY, 20, 20), 0) 
     pygame.display.flip() 
     clock.tick(100) 
     goingDown = False 
     print rectOneY < height - 21 and goingDown  


    keys = pygame.key.get_pressed() 
    #MovingRectCommands 
    if keys[pygame.K_UP]: 
     mainRectY -= 1 
     updateMainRect(mainRectX, mainRectY) 

    if keys[pygame.K_DOWN]: 
     mainRectY += 1 
     updateMainRect(mainRectX, mainRectY) 

    if keys[pygame.K_LEFT]: 
     mainRectX -= 1 
     updateMainRect(mainRectX, mainRectY) 

    if keys[pygame.K_RIGHT]: 
     mainRectX += 1 
     updateMainRect(mainRectX, mainRectY) 

基本上矩形開始在屏幕的頂部,然後sucessfuly擊中它的底部。如預期的那樣,它向控制檯輸出了很多「b」。然後,矩形向上移動一個像素,程序向控制檯打印一個「a」,但隨後它再次下降,即使「如果不下去並且rectOneY!= 0」表達式等於True,並且「if rectOneY < height - 21 and goingDown「表達式等於False。

我一直在試圖解決這個問題至少一個小時,我根本不明白什麼是錯,我可以使用一些幫助。

我希望你指出我的代碼有什麼問題(只有我問的具體問題,而不是xD之前的數百萬個錯誤代碼示例)。

在此先感謝。

回答

1

while running循環的第一行是goingDown = True。這會在循環的每次迭代開始時將變量goingDown設置爲true。您需要在循環之前放置行goingDown = True

它應該是這樣的:

#GameLoop 
goingDown = True 
while running: 
    ... 
+0

太謝謝你了! 我現在覺得很蠢,這麼簡單的修復= [ – user3124364

+0

@ user3124364很高興幫忙!如果您發現它有幫助,請記住接受答案。 – bitoffdev