我正在尝试使用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]一样移动
这就是我想要背景的样子(请忽略它是我唯一能找到的标志)
我现在发现了真正的问题所在
答案 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
这似乎提供了比您正在使用的背景程序更聪明,更实用的背景类。我想试试看。