在pygame中,如何将与屏幕上的对象一起滚动的背景图像添加到此相机类?

时间:2019-09-23 19:36:15

标签: python pygame

我正在pygame中做一个小游戏,我一直在使用第一个答案here中的脚本来制作一个在屏幕上跟随我的角色的摄像机:

    def __init__(self, target, world_size):
        super().__init__()
        self.target = target
        self.cam = pygame.Vector2(0, 0)
        self.world_size = world_size
        if self.target:
            self.add(target)

    def update(self, *args):
        super().update(*args)
        if self.target:
            x = -self.target.rect.center[0] + SCREEN_SIZE.width/2
            y = -self.target.rect.center[1] + SCREEN_SIZE.height/2
            self.cam += (pygame.Vector2((x, y)) - self.cam) * 0.05
            self.cam.x = max(-(self.world_size.width-SCREEN_SIZE.width), min(0, self.cam.x))
            self.cam.y = max(-(self.world_size.height-SCREEN_SIZE.height), min(0, self.cam.y))

    def draw(self, surface):
        spritedict = self.spritedict
        surface_blit = surface.blit
        dirty = self.lostsprites
        self.lostsprites = []
        dirty_append = dirty.append
        init_rect = self._init_rect
        for spr in self.sprites():
            rec = spritedict[spr]
            newrect = surface_blit(spr.image, spr.rect.move(self.cam))
            if rec is init_rect:
                dirty_append(newrect)
            else:
                if newrect.colliderect(rec):
                    dirty_append(newrect.union(rec))
                else:
                    dirty_append(newrect)
                    dirty_append(rec)
            spritedict[spr] = newrect
        return dirty            

如何添加背景图像,该背景图像与级别同时/一起滚动,并且仅 在播放器移动时移动。我试图弄清楚Camera的draw方法中的代码意味着什么,以便我可以对其进行更改,但是由于我对pygame相当陌生,而且还不太精通python,因此非常困惑。该级别是使用以下代码构建的(也来自另一个问题):

def main():
    pygame.init()
    screen = pygame.display.set_mode(SCREEN_SIZE.size)
    pygame.display.set_caption("Use arrows to move!")
    timer = pygame.time.Clock()

    level = [
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
        "P                                          P",
        "P                 PPPPPP                   P",
        "P                                          P",
        "PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]


    platforms = pygame.sprite.Group()
    player = Player(platforms, (TILE_SIZE, TILE_SIZE))
    level_width  = len(level[0])*TILE_SIZE
    level_height = len(level)*TILE_SIZE
    entities = CameraAwareLayeredUpdates(player, pygame.Rect(0, 0, level_width, level_height))

我还尝试根据播放器是否在移动来分别使背景滚动,但这导致舞台和背景上的实际平台未对齐。这是非常有问题的,因为我的“故事”依赖于背景和文本框,踩在某些砖上时,这些砖位于背景上绘制的字符旁边。

我希望我已提供了所有必要的答案,并提出了一个可以理解的问题。否则,请让我知道还需要什么其他信息,谢谢任何提前尝试的人。

1 个答案:

答案 0 :(得分:1)

不确定这是否是您真正想要的,但是我们开始:

为背景图片创建一个Sprite

class StaticImage(pygame.sprite.Sprite):
    def __init__(self, image, *groups):
        super().__init__(*groups)
        self.image = image
        self.rect = self.image.get_rect()
        self._layer = -1 # always draw first.

并将实例添加到Group

def main():
    ...
    entities = CameraAwareLayeredUpdates(player, pygame.Rect(0, 0, level_width, level_height))    
    backimage = pygame.image.load('*PATH*').convert()
    StaticImage(backimage, entities)

由于此Sprite的位置始终为0, 0,因此它将在摄像机移动时随水平移动。