2014-01-27 33 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