在pygame中使背景横向移动

时间:2019-03-07 18:02:11

标签: python pygame

我正在尝试使用pygame创建一个游戏,并且试图向其添加背景(我使用了YouTube视频中的一些代码,但这是行不通的)。我也不了解代码的含义。我的意思是背景并且确实在移动,但是当较旧的背景尚未从屏幕上消失时,它会在屏幕中间自动添加新版本的背景:

class Background:
    def __init__(self, x, y, picture):
        self.xpos = x
        self.ypos = y
        self.picture = picture
        self.rect = self.picture.get_rect()
        self.picture = pygame.transform.scale(self.picture, (1280, 720))

    def paste(self, xpos, ypos):
        screen.blit(self.picture, (xpos, ypos))

    def draw(self):
        screen.blit(self.picture, (self.xpos, self.ypos))

while True:

background=pygame.image.load("C:/images/mars.jpg").convert_alpha()       

cliff = Background(0, 0, background)


rel_x = x % cliff.rect.width

cliff.paste(rel_x - cliff.rect.width, 0)
if rel_x < WIDTH:
    cliff.paste(rel_x, 0)
    x -= 1

这就是我目前的背景 [![我的问题看起来是什么] [1]] [1]

[![我想让背景像[2]] [2]一样移动

这就是我想要背景的样子(请忽略它是我唯一能找到的标志)

我现在发现了真正的问题所在

The new problem

2 个答案:

答案 0 :(得分:2)

如果要连续重复背景,则必须绘制两次背景:

     +==================+
.----||---------+------||------+
|    ||         |      ||      |
|    ||    1    |   2  ||      |
|    ||         |      ||      |
+----||---------+------||------+
     +==================+

您必须知道屏幕的大小。高度背景图像的大小应与屏幕的高度匹配。背景的宽度可以不同,但​​至少应与窗口的宽度相同(否则背景必须绘制两次以上)。

bg_w, gb_h = size
bg =  pygame.transform.smoothscale(pygame.image.load('background.image'), (bg_w, bg_h))

背景可以想象成一排排的瓷砖。 如果要在特定位置pos_x上绘制背景,则必须通过模(%)运算符来计算图块相对于屏幕的位置。第二个磁贴的位置偏移背景宽度(bg_w):

x_rel = pos_x % bg_w
x_part2 = x_rel - bg_w if x_rel > 0 else x_rel + bg_w

最后背景必须变暗两次,以填满整个屏幕:

screen.blit(bg, (x_rel, 0))
screen.blit(bg, (x_part2, 0))

您可以通过以下示例程序测试该过程。可以分别通过 <-->

移动背景
import pygame

pygame.init()

size = (800,600)
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()

bg_w, bg_h = size 
bg = pygame.transform.smoothscale(pygame.image.load('background.image'), (bg_w, bg_h))
pos_x = 0
speed = 10

done = False
while not done:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done = True

    allKeys = pygame.key.get_pressed()
    pos_x += speed if allKeys[pygame.K_LEFT] else -speed if allKeys[pygame.K_RIGHT] else 0

    x_rel = pos_x % bg_w
    x_part2 = x_rel - bg_w if x_rel > 0 else x_rel + bg_w

    screen.blit(bg, (x_rel, 0))
    screen.blit(bg, (x_part2, 0))

    pygame.display.flip()

答案 1 :(得分:0)

This SO answer should have what you need

这似乎提供了比您正在使用的背景程序更聪明,更实用的背景类。我想试试看。