我正在编写一个自上而下类型的游戏,当我们被屏幕绘制时,我无法修复我的世界实体的闪烁......我想知道是否有人可以查看此代码并帮助我找到解。感谢。
#!/usr/bin/env python
#Unnamed Game
import pygame,sys,spriteUtil,random
from pygame.locals import *
from threading import Thread
class Game():
def __init__(self):
pygame.init()
pygame.key.set_repeat(1,100)
self.size = (512, 512)
self.screen = pygame.display.set_mode(self.size)
self.clock = pygame.time.Clock()
self.titleScreen = pygame.image.load("unnamed.png")
self.titleScreenRect = self.titleScreen.get_rect()
self.screen.blit(self.titleScreen, self.titleScreenRect)
pygame.display.flip()
class Hero(pygame.sprite.Sprite):
def __init__(self, screen, background):
pygame.sprite.Sprite.__init__(self)
self.size = (30,30)
self.northWalk = 'link.png'
self.screen = screen
self.background = background
self.s = spriteUtil.SpriteUtility() #this just takes a sprite sheet and returns a list of sprite images
self.northSprites = self.s.getSprites(self.size, self.northWalk) #as above
self.x_coord = 0
self.y_coord = 0
def walkNorthAnimation(self):
for sprite in self.northSprites:
self.screen.blit(self.background,(0,0))
self.screen.blit(sprite, (256-20,256-30))
pygame.display.update()
class WorldEntity(pygame.sprite.Sprite):
def __init__(self, screen, ent_img, size=(60,90)):
pygame.sprite.Sprite.__init__(self)
self.screen = screen
self.size = size
self.ent = pygame.image.load(ent_img)
self.layer = -100
self.width, self.height = size
self.x_coord = random.randint(0,513)
self.y_coord = random.randint(0,513)
def drawEnt(self):
self.screen.blit(self.ent,(self.x_coord, self.y_coord))
class World():
def __init__(self, screen):
self.screen = screen
self.background = pygame.image.load('grass.png')
self.backgroundRect = self.background.get_rect()
self.entityList = []
def loadWorld(self):
self.screen.blit(self.background, self.backgroundRect)
pygame.display.update()
def populateEntities(self):
for tree in range(1):
tree = WorldEntity(self.screen,'tree.png')
self.entityList.append(tree)
def drawWorld(self):
for ent in self.entityList:
ent.drawEnt()
pygame.display.update()
def main():
g = Game()
world = World(g.screen)
world.populateEntities()
player = Hero(g.screen, world.background)
player.walkNorthAnimation()
world.drawWorld()
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == KEYDOWN:
if event.key == pygame.K_w:
steps = 6
for step in range(steps):
for ent in world.entityList:
ent.y_coord += 5
player.walkNorthAnimation()
world.drawWorld()
if __name__ == '__main__':
main()
我试过在northWalk动画方法中调整sprite,而不是更新那里的显示,这样可以成功地删除闪烁,但是精灵没有动画/“走路”......感激建议如何解决这个问题。
答案 0 :(得分:1)
如果你需要动画精灵,你必须在for event
循环之外移动blit。
你的例子
# --- events ---
for event in pygame.event.get():
if event.key == pygame.K_w:
move_y = 1
if event.key == pygame.K_s:
move_y = -1
if event.key == pygame.K_a:
move_x = -1
if event.key == pygame.K_d:
move_x = 1
# --- updates in every loop (without drawing) ---
for sprite in player.northSprites:
for ent in world.entityList:
ent.x_coord += move_x
ent.y_coord += move_y
# --- draws in every loop (without updates) ---
g.screen.blit(world.background, (0,0))
g.screen.blit(sprite, (256-20,256-30))
world.drawWorld()
pygame.display.update()
# --- 25 FPS ---
clock.tick(25)
-
Pygame并不理想 - 可能它与VSYNC(vertical synchronization)有问题,所以它与screen tearing有问题。
答案 1 :(得分:0)
感谢小伙伴们 - 我把它解决了!
<variable name="subReportCount" class="java.lang.Integer"/>
并从班级中删除了更新。