我正在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))
我还尝试根据播放器是否在移动来分别使背景滚动,但这导致舞台和背景上的实际平台未对齐。这是非常有问题的,因为我的“故事”依赖于背景和文本框,踩在某些砖上时,这些砖位于背景上绘制的字符旁边。
我希望我已提供了所有必要的答案,并提出了一个可以理解的问题。否则,请让我知道还需要什么其他信息,谢谢任何提前尝试的人。
答案 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
,因此它将在摄像机移动时随水平移动。