如何在pygame中移动角色而不产生多个pictu

2024-10-03 04:38:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做我在pygame中的第一个游戏,但是当我生成了我的世界并试图移动我的角色时,他的精灵仍然留在原来的位置。我不能blit我的背景每一帧也太大,使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)

用于生成我的地形的函数[a.k.a world/background]

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

事情就是这样


Tags: inself角色fordefdisplaypygametile
1条回答
网友
1楼 · 发布于 2024-10-03 04:38:26

我认为只重绘播放器附近的瓷砖的想法可以工作,但它需要稍微修改

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

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

要提升x和y值,它们只是self.pos.xself.pos.y

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

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

这应该只重绘最接近玩家的瓷砖,而不必处理管理每个瓷砖

相关问题 更多 >