移动时pygame sprite闪烁 - 如何修复?

时间:2016-01-08 14:48:12

标签: python pygame sprite

我正在编写一个自上而下类型的游戏,当我们被屏幕绘制时,我无法修复我的世界实体的闪烁......我想知道是否有人可以查看此代码并帮助我找到解。感谢。

#!/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,而不是更新那里的显示,这样可以成功地删除闪烁,但是精灵没有动画/“走路”......感激建议如何解决这个问题。

2 个答案:

答案 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"/>

并从班级中删除了更新。