2017-06-21 114 views
0

我对python非常陌生,我一直在试图制作游戏。但我想让背景不断循环下去,我无法做到。 这里是我的代码:使用Pygame在Python中持续向下滚动的背景

import pygame 
pygame.init() 

width = 800 
height = 600 

black = (0,0,0) 
white = (255,255,255) 
red = (255,0,0) 
green = (0,255,0) 
blue = (0,0,255) 

ship_width = 35 
ship_height = 64 

disp = pygame.display.set_mode((width,height)) 

pygame.display.set_caption("Space Jump") 

clock = pygame.time.Clock() 

bg1 = pygame.image.load("Space.png") 
bg2 = pygame.image.load("Space.png") 

shipImg = pygame.image.load("Ship.png") 

def ship(x,y): 
    disp.blit(shipImg, (x,y)) 

def gameLoop(): 
    x = (width * 0.45) 
    y = (height * 0.8) 

x_ch = 0 
y_ch = 0 

x_bg = 0 
y_bg = bg1.get_height() 

gameExit = False 

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_LEFT: 
       x_ch = -5 
      elif event.key == pygame.K_RIGHT: 
       x_ch = 5 
      elif event.key == pygame.K_UP: 
       y_ch = -5 
      elif event.key == pygame.K_DOWN: 
       y_ch = 5 


     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: 
       x_ch = 0 
      if event.key == pygame.K_UP or event.key == pygame.K_DOWN: 
       y_ch = 0 

    x += x_ch 
    y += y_ch 

    if x > width - ship_width or x < 0: 
     x_ch = 0 

    if y > height - ship_height or y < 0: 
     y_ch = 0 

    disp.blit(bg1, (0,x_bg)) 
    disp.blit(bg2, (0,y_bg)) 

    ship(x,y) 

    pygame.display.update() 

    x_bg += 1 
    y_bg += 1 

    if x_bg == -1 * x_bg.get_height(): #This is the part I'm stuck on 
     x_bg = y_bg + y_bg.get_height() #When I run this i get and error: 
             #if x_bg == -1 * x_bg.get_height(): 
             #AttributeError: 'int' object has no 
             #attribute 'get_height' 
    if y_bg == -1 * y_bg.get_height(): 
     y_bg = x_bg + x_bg.get_height() 

    clock.tick(30) 

gameLoop() 
pygame.quit() 
quit() 

所以,当我运行这段代码我得到一个错误,但是当我刚写上一个新的文件,后台代码它的工作原理,但背景在某些时候它没有循环结束。 我一直在尝试做这个过去3天的循环背景,请帮助我。谢谢。

+0

我得到它的工作感谢疯狂的meesh,但背景在某些时候结束可以有人告诉我如何循环它,所以它不会结束? –

回答

1

好,我不使用pygame的之前,但只需快速浏览一下你的代码和文档,它看起来像你打电话get_height()在一个数字(x_bgy_bg)不是,什么pygame指作为surface对象。

大致翻译的错误是说数字没有名称为get_height()的方法。

您的surface对象被定义为bg1bg2所以我的猜测是那些会有方法。

只是将变量与正确的交换出来,错误应该消失。

+0

它现在的作品谢谢,但现在如何让它循环?它在某个点结束。 –

+0

我相信有很多方法可以做到这一点,但这里有一个关于 的简短描述:我如何实现parallaxing平面: 假设(0,0)是左下角,并且您想将BG底部滚动到顶部: ' - 图像 3份 - H = IMG高度 - 对齐副本在相同的x - img1.y =中心 - img2.y = H - img3.y = H * 3 * -1 - 限定两个变量 'scroll_speed' 和“的距离= 0'' 每个帧 '上 - 每个IMG做img.y + = scroll_speed - 做距离+ = SCR oll_speed - 如果距离> h,将img2与img3交换y,将距离重设为0' –

+0

对不起,我已经得到它的工作像一个小时以前谢谢 –

0

我不完全确定你的一些代码试图做什么,但我可以让你开始。

你可以看到错误说: “AttributeError的:‘诠释’对象有没有属性‘get_height’”

这是告诉你,x_bg是一个整数,而不是一个对象,所以它不能访问任何属性名为'get_height'。我会推荐学习更多关于python中的对象和函数,以及它们是如何工作的。

if x_bg == -1 * x_bg: 
    x_bg = y_bg + y_bg 

另一个问题:

好像你已经使用x_bg和y_bg作为底色的位置,所以没有必要尝试使用任何函数调用get_height,你可以将其替换为这段代码就是检查x_bg的值是否为,正好等于为一个数字。虽然这有时可以起作用,特别是当你只处理整数时,通常是一个好主意来检查你的变量是否大于/小于数字。例如,如果您的背景为y = 99,并且您正在检查y == 100,但是屏幕每移动2个像素,您的条件将永远不会达到,而如果您要检查y> 100,它应该始终被抓住。你可能想是这样的:

if y_bg < 0: 
    y_bg = height 

这并不完美,但它不应该引起任何错误,应该可以帮助您在正确的轨道