如何使用pygame在python中创建滚动背景?

如何使用pygame在python中创建滚动背景?,python,pygame,Python,Pygame,在过去的两天里,我一直在尝试制作一个太空射击游戏,我想让背景向下滚动,但我不知道怎么做。 这是我的密码: import pygame import time 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 =

在过去的两天里,我一直在尝试制作一个太空射击游戏,我想让背景向下滚动,但我不知道怎么做。 这是我的密码:

import pygame
import time
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()

background = pygame.image.load("Space.png").convert()

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

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
    x_bg = 0
    while True:
        disp.blit(background, (0,x_bg)) # i tried this but when i launch
                                        #a black screen just appears without 
        x_bg -= 1                       #any image
    ship(x,y)

    pygame.display.update()
    clock.tick(60)

gameLoop()
pygame.quit()
quit()
我有一个背景,我想让它不断向下滚动。你能帮我吗?

先做一些事情:

修正你的缩进 你的飞船功能几乎没有用 使用Rect来处理移动 您真正的问题是,由于第二个while循环,您的代码从未到达pygame.display.update 因此,要制作一个无休止的滚动背景,简单的方法是执行以下操作:

将背景图像放大两次,一次放在y位置,一次放在y+图像宽度处,将y替换为所需的x。然后,在主循环的每次迭代中,您都可以从y中减去以创建运动。一旦图像移动了整个高度,请将y重置为起始值

下面是一个完整的示例,显示了滚动背景以及如何使用精灵、组、向量和矩形:

import pygame
pygame.init()
SCREEN = pygame.display.set_mode((300, 300))

move_map = {pygame.K_w: pygame.math.Vector2( 0, -1),
            pygame.K_s: pygame.math.Vector2( 0,  1),
            pygame.K_a: pygame.math.Vector2(-1,  0),
            pygame.K_d: pygame.math.Vector2( 1,  0)}

class Actor(pygame.sprite.Sprite):
    def __init__(self, group, color, pos, size=(30, 30)):
        self.image = pygame.Surface(size)
        self.image.fill(color)
        self.rect = self.image.get_rect(center=pos)
        pygame.sprite.Sprite.__init__(self, group)

class Bullet(Actor):
    def __init__(self, *args):
        Actor.__init__(self, *args)
        self.speed = 10

    def update(self):
        self.rect.move_ip(self.speed, 0)
        if not SCREEN.get_rect().colliderect(self.rect):
            self.kill()

class Player(Actor):
    def __init__(self, *args):
        self._layer = 4
        Actor.__init__(self, *args)
        self.speed = 4
        self.timeout = 0

    def update(self):
        p = pygame.key.get_pressed()
        move_vector = pygame.math.Vector2(0, 0)
        for v in [move_map[key] for key in move_map if p[key]]:
            move_vector += v
        if move_vector:
            self.rect.move_ip(*move_vector.normalize() * self.speed)
            self.rect.clamp_ip(SCREEN.get_rect())

        if self.timeout :
            self.timeout -= 1
        if p[pygame.K_SPACE] and not self.timeout:
            Bullet(self.groups()[0], (130, 200, 77), self.rect.center, (10, 3))
            self.timeout = 5


class Background(pygame.sprite.Sprite):
    def __init__(self, number, *args):
        self.image = pygame.image.load('back.jpg').convert()
        self.rect = self.image.get_rect()
        self._layer = -10
        pygame.sprite.Sprite.__init__(self, *args)
        self.moved = 0
        self.number = number
        self.rect.x = self.rect.width * self.number

    def update(self):
        self.rect.move_ip(-1, 0)
        self.moved += 1

        if self.moved >= self.rect.width:
            self.rect.x = self.rect.width * self.number
            self.moved = 0

group = pygame.sprite.LayeredUpdates()
Player(group, (255, 255, 255), (100, 100))
Background(0, group)
Background(1, group)

clock = pygame.time.Clock()
run = True
while run:
    for e in pygame.event.get():
        if e.type ==pygame.QUIT:
            run = False
    SCREEN.fill((0,0,0))
    group.update()
    group.draw(SCREEN)
    pygame.display.flip()
    clock.tick(60)
为了测试这一点,您可以使用此图像将其另存为back.jpg:


我是编程新手,我不能完全理解你的解决方案。你能做一个示例代码吗?@ErenBiçer我添加了一个完整的示例这对我来说太复杂了,你能为滚动背景添加代码吗?downwards@ErenBiçer Stackoverflow不是要求人们为您编写代码的地方。这是一个人们利用空闲时间通过回答问题来帮助想要了解更多的人的网站。全部免费。利用这一点,并使用Stackoverflow作为免费工人为您生产产品的成本很低。如果你对这个主题没有足够的知识,那么你可以尝试从其他资源中学习,或者仔细研究这个例子。如果你在学习的过程中遇到了困难,那么就在Stackoverflow上询问一下。但千万不要让别人为你写代码。