首先,我已经事先研究了stackoverflow这个主题,但是我想了解更多关于它的信息,所以我要问一个新问题。
所以基本上,我一直在PyGame1.9中工作。我已经成功地制作了一个简单的2D图形游戏。我使用的是Sprite类,因此我经常使用Group()方法。我使用groupName在屏幕上绘制图形。绘制(屏幕)。
我的游戏的一个组成部分是与地形互动的能力,例如移除瓷砖和放置瓷砖。每个磁贴都是绘制到屏幕上的我的块雪碧组的一部分。
然而,我的程序开始明显滞后,因为块瓷砖的数量增加。以下是我为解决这个问题所做的努力:
然而,我的游戏继续落后。
自然,如果我增加我的块精灵的大小(这意味着我如何调整他们加载各自的图像时),我可以最终放置更多的块没有滞后发生,直到后来,因为有较少的精灵总数,但这不是我想要的理想完成。
此外,我还实施了两个NPC团队,他们与该地形交互。因此,我的程序需要检查主游戏循环中的大量冲突是可以理解的,但尽管如此,我并不期望我的程序会滞后,除非我加入一个约30个NPC的团队(我目前只与10个NPC合作,每个团队5个NPC)。
当我的程序开始延迟时,我计算出精灵总数(将每组中的所有精灵相加)为170。
所以,最后,我的问题是:如果我计划有一个同时使用多个精灵的程序(倍数约为170),pygame在速度方面是否不适合这项工作?
我相信我已经使用了很好的实现实践,比如在删除sprite之后从它们各自的组中删除它们,以及上面的简要列表。
我已经要求提供一些代码,所以这里有一些重要的部分,我已经包括在内。
主要游戏循环:
# Main Game Loop
while gameRunning:
for event in pygame.event.get():
if event.type == pygame.QUIT:
gameRunning = False
keys = pygame.key.get_pressed()
if keys[LEFT_KEY]:
player1.goLeft()
if keys[RIGHT_KEY]:
player1.goRight()
if keys[JUMP_KEY]:
player1.jump()
if keys[DOWN_KEY]:
player1.ducking = True
if keys[SPRINT_KEY] and player1.movementKeyPressed:
player1.startSprinting()
if keys[SHOW_SCORES_KEY]:
Screen.DISPLAY_SCORES = True
# KEYUP EVENT
elif event.type == pygame.KEYUP:
if event.key == LEFT_KEY or event.key == RIGHT_KEY or event.key == SPRINT_KEY:
player1.stopMovingX()
player1.isSprinting = False
if event.key == DOWN_KEY:
player1.ducking = False
if event.key == SHOW_SCORES_KEY:
Screen.DISPLAY_SCORES = False
# MOUSE
if event.type == pygame.MOUSEBUTTONDOWN:
# Left Click
if event.button == ATTACK_KEY:
player1.attack()
# Right Click
elif event.button == PLACE_BLOCK_KEY:
player1.requestToPlaceBlock()
# Clear the screen
Screen.gameScreen.fill(Colors.WHITE)
# Update Sprites
EntityLists.npcGroup.update()
EntityLists.redTeamGroup.update()
EntityLists.blackTeamGroup.update()
EntityLists.corpseGroup.update()
# Update Blocks
EntityLists.blockGroup.update()
#
print(len(EntityLists.blockGroup) + len(EntityLists.redTeamGroup) + len(EntityLists.blackTeamGroup) +
len(EntityLists.npcGroup) + len(EntityLists.wallGroup))
if Screen.takeScreenShot:
# Blit background first
Screen.gameScreen.blit(background, (0, 0))
# Draw blocks and wall next
EntityLists.wallGroup.draw(Screen.gameScreen)
EntityLists.blockGroup.draw(Screen.gameScreen)
# Next, take screenshot
pygame.image.save(Screen.gameScreen, "BACKGROUND_AND_BLOCKS.png")
backgroundAndBlocks = pygame.image.load('BACKGROUND_AND_BLOCKS.png')
# Reset variable
Screen.takeScreenShot = False
# Blit
Screen.gameScreen.blit(backgroundAndBlocks, (0, 0))
# Draw Entities
EntityLists.npcGroup.draw(Screen.gameScreen)
EntityLists.redTeamGroup.draw(Screen.gameScreen)
EntityLists.corpseGroup.draw(Screen.gameScreen)
EntityLists.blackTeamGroup.draw(Screen.gameScreen)
# Player names
Screen.drawNames()
# Draw Death Messages
Screen.displayDeathMessages()
# Draw scores if viable
if Screen.DISPLAY_SCORES:
Screen.displayScores()
# Update screen
pygame.display.flip()
# FPS
clock.tick(Screen.TARGET_FPS)
pygame.quit()
非常感谢你的时间。
尝试使用spritesheets,这样你只上传一个包含所有sprites的图片一次。
如果你的主角有20个不同的图像(帧),包括空闲、跑步、行走、跳跃、射击等,而你没有使用精灵表,会发生什么?
PyGame需要在每个循环中一个接一个地上传所有这些图像,从而产生延迟。
相反,spritesheet是一个单一的图像,包含所有的精灵,每个精灵都有一个(x,y,宽度,高度),所以pyplay在需要特定的精灵框架时知道每个精灵的边界。
试着使用spritesheets,它会让你的游戏运行顺畅,减少处理能力,减少图形卡的使用等,减少热量等。
100张图片,每张重100kb...那是很多,但是一张spritesheet图片只有100kb...
如果您的游戏只有5个精灵,请在没有延迟的情况下使用图像,但如果您的游戏有超过5个精灵并出现延迟,请使用精灵表,这也有助于使您的工作更有条理,当您想要打包时,请将其转换为。exe或别的什么东西,它的重量会轻一些。
注意:我不久前发布了我的答案,但我只是想补充一点,当你加载你的图像时,试着加载它们一次,在init方法中,在update方法中只引用它们。不要在循环中使用“pygame.image.load(filename)”,它会滞后。
祝你好运
我在PyGame中创建了两个简单的精灵,其中一个是雨伞,另一个是雨滴。雨滴被添加到一个名为< code>all_sprites的sprite组中。伞精灵有自己的组,名为< code>Umbrella_sprite 雨滴从屏幕顶部“落下”,如果其中一个碰到雨伞/与雨伞碰撞..雨滴应该被删除了。但是除了特定雨滴之外,所有其他雨滴都受此影响。
我正在与Pygame一起练习,试图学习类,对象等的一些基本用法。 现在,在http://programarcadegames.com/的帮助下,我正在制作一个基本的平台 我有一个精灵播放器和精灵平台。这些平台也可以是移动平台,它应该在碰撞时移动玩家,但是当玩家移动到其他平台时,会发生一些奇怪的传送,我现在没有看到问题。 基本上,当被推时,玩家在逻辑上没有被移动(至少对我来说是这样)。 非常感谢任何
对于我的pyplay塔防御计划,我试图弄清楚如何实现与地图上已经放置的其他塔的碰撞。 放置过程将创建一个48x48预览精灵,当它在游戏屏幕上时,该精灵将在玩家鼠标上的网格中移动。塔精灵保存在名为的组中。我有这段代码来检查精灵是否与某些地形瓷砖和塔精灵发生碰撞(这在精灵更新功能中): 循环前进部分是为了检查预览精灵是否与任何塔精灵矩形碰撞。如果是,它将变量设置为true或其他,False。 然后程序
我一直在学习一些pygame教程,并且基于这些教程开发了自己的代码。具体如下: 所以我想出了如何让我的家伙跳跃,但是我已经在天空中放置了一个块并试图这样做: 试图让角色停止跳跃。有没有一个内置的函数来测试这一点,或者有没有一个适合我的方法。顺便说一下,这是行不通的,我似乎也不知道该怎么做。非常感谢任何帮助:)
我正在PyGame中制作一个太空入侵者游戏,但当我尝试绘制投射物时,它会覆盖/更改主精灵(平面)。如何解决此问题,以便在屏幕上显示多个精灵?
我正在用Python pygame制作一个游戏,并制作了一个移动的背景,一个作为玩家的跳跃精灵和生成障碍物。现在我正在研究玩家和障碍物之间的碰撞,并编写了一些代码,但最终出现了错误: 我不知道,为什么那个类不是精灵,也不知道如何把它变成精灵。我希望修复这个错误后,碰撞工程。 播放器图像1 图像 2 背景图片3