如何在pygame中移动角色而不制作多张图片

时间:2019-05-22 10:34:15

标签: python pygame

我正在pygame中做我的第一场比赛,但是当我创造了自己的世界并尝试移动我的角色时,他的精灵仍然保留在原来的位置。我不能在每一帧都遮挡背景,因为它太大了,使pygame的性能停顿了。

我尝试过每一帧,但同时也降低了pygame的速度。然后我尝试使其围绕角色变色,以使其覆盖角色的旧照片,但我也无法使其正常工作。

def MakeTerrain():
    TempY = 0
    for o in range(51):
        for i in range(51):
            TempX = 16 * i
            if TempX >= 800:
                TempY = 16 * o
                TempX = 0
            rnd = random.randrange(10)
            if rnd <= 8:
                tile = Tile("Grass",[TempX,TempY])
            else:
                tile = Tile("Stone",[TempX,TempY])

            Tiles.append(tile)
            tile.BlitTile(Display)

用于创建地形的功能[也就是世界/背景]

class Player():
def __init__(self,MovementSpeed=1):
    self.DirectionX = 0
    self.DirectionY = 0
    self.PlayerPos = [0,0]
    self.MovementSpeed = MovementSpeed
    self.PlayerSprite = pygame.image.load("Jeffrey.png")

def BlitPlayer(self,display):
    display.blit(self.PlayerSprite,(self.PlayerPos[0],self.PlayerPos[1]))

具有blit功能的播放器类别

class Tile():
    def __init__(self,sprite,Position):
        self.TilePosition = Position
        self.TileSprite = pygame.image.load(sprite+".png")

    def BlitTile(self,display):
        display.blit(self.TileSprite,(self.TilePosition[0],self.TilePosition[1]))

瓷砖课

http://prntscr.com/nrtnyx

这就是发生的事情

1 个答案:

答案 0 :(得分:1)

我认为只在玩家附近重新绘制图块的想法是可行的,但需要稍作修改。

这将需要将位置值更改为pygame.math.Vector2,因此首先,我还建议将这些值的所有实例都更改为self.pos,这样我将向您展示的循环更容易制作

self.pos = pygame.math.Vector2(Position)

要使用x和y值,它们只是self.pos.xself.pos.y

在图形代码中,您可以先对其进行更改,以使其遍历每个精灵:

for sprite in my_sprites:
    pass

在此循环内,您可以使用以下新矢量检查从子画面到播放器的距离:

deltaVec = player.pos - sprite.pos # Find delta [difference] between player position and sprite position
len = deltaVec.length() # Find the length between those two points through the distance formula

然后,最后检查新距离是否在某个阈值以下:

if len < 100: # 100 being the distance, change if needed
    sprite.draw()

最后,新的绘图代码如下所示:

for sprite in my_sprites:
    deltaVec = player.pos - sprite.pos
    len = deltaVec.length() 

    if len < 100: # 100 being the distance, change if needed
        sprite.draw()

这仅应重新绘制距离玩家最近的图块,而不必处理每个图块。