pygame为游戏添加背景_如何使用pygame在python中制作滚动背景?

有些事情第一:

解决您的压痕

你的船的功能几乎是无用

使用矩形来处理移动

你真正的问题是,你的代码永远不会达到pygame.display.update()因为你的第二个while循环

所以,为了做出无尽的滚动背景,而简单的方法是做到以下几点:

BLIT背景图像两次,一旦在y位置,而一旦在y + image_width(与x取代y你想要的)。然后,您的主循环的每一次迭代都可以从y中减去以创建运动。一旦图像移动它的整个高度上,复位y起始值

这里的一个完整的例子,示出了一个滚动背景(以及如何使用精灵,组,载体和rects):

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):

你可能感兴趣的:(pygame为游戏添加背景)