我正在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]))
瓷砖课
这就是发生的事情
答案 0 :(得分:1)
我认为只在玩家附近重新绘制图块的想法是可行的,但需要稍作修改。
这将需要将位置值更改为pygame.math.Vector2
,因此首先,我还建议将这些值的所有实例都更改为self.pos
,这样我将向您展示的循环更容易制作
self.pos = pygame.math.Vector2(Position)
要使用x和y值,它们只是self.pos.x
或self.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()
这仅应重新绘制距离玩家最近的图块,而不必处理每个图块。