使用Pygame在Python中连续向下滚动的背景

时间:2017-06-21 01:13:38

标签: 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天做这个循环背景,请帮助我。感谢。

2 个答案:

答案 0 :(得分:1)

好吧我之前没有使用过pygame,只是快速浏览一下你的代码和文档,看起来你在一个号码get_height()x_bg上呼叫y_bg )不是,pygame称为surface对象。

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

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

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

答案 1 :(得分:0)

我不完全确定您的某些代码正在尝试做什么,但我可以帮助您入门。

你可以看到错误说:  &#34;属性错误:&#39; int&#39;对象没有属性&#39; get_height&#39;&#34;

这告诉你x_bg是一个整数,而不是一个对象,所以它不能访问名为&#39; get_height&#39;的任何属性。我建议在python中学习更多关于对象和函数的知识,以及它们是如何工作的。

您好像已经使用x_bg和y_bg作为背景的位置,因此无需尝试使用任何名为get_height的函数,您可以将其替换为:

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

这段代码的另一个问题是检查x_bg的值是否与完全相等到一个数字。虽然这有时可以工作,特别是当你只处理整数时,通常最好检查你的变量是否大于/小于一个数字。例如,如果您的背景位于y = 99,并且您正在检查y == 100,但屏幕每步移动2个像素,则您的状况将永远不会达到,而如果您正在检查y&gt; 100它应该总是被抓住。你可能想要这样的东西:

if y_bg < 0:
    y_bg = height

这不会很完美,但它不应该导致任何错误,应该帮助你走上正确的轨道