В Pygame, как можно добавить фоновое изображение, которое прокручивается вместе с объектами на экране, к этому классу камеры? - PullRequest
0 голосов
/ 23 сентября 2019

Я делаю небольшую игру в pygame и использую скрипт из первого ответа здесь , чтобы создать камеру, которая будет следовать за моим персонажем по экрану:

    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, чтобы я мог его изменить, но был очень смущен, так как я новичок в 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 Ответ

1 голос
/ 24 сентября 2019

Не уверен, действительно ли это то, что вам нужно, но мы идем:

Создайте 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, оно будет двигаться вместе с уровнем при перемещении камеры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...