移动时,Pygame Sprite闪烁

时间:2015-08-07 23:51:08

标签: python animation pygame sprite

我是pygame的新手,并且当它在屏幕上移动时,精灵闪烁/拖动它的图像时遇到了一些问题。我已经在这里阅读了关于获得某个像素的其他答案,你应该改变帧速率和降低像素/帧,但是这个解决方案没有帮助,所以我想知道我是不是没有实现它正确而且这是唯一的解决方案,或者我错过了什么。下面是一些以恒定帧速率运行的游戏代码。谢谢!

pygame.init()
display=pygame.display.set_mode((screen_width,screen_height), pygame.RESIZABLE)
background=pygame.Surface((screen_width, screen_height))
background.fill(background_color)

class Ship(pygame.sprite.Sprite):
    def __init__(self, image_file):
        pygame.sprite.Sprite.__init__(self)
        self.original_image_unscaled=pygame.image.load(image_file)
        self.original_image=pygame.transform.smoothscale(self.original_image_unscaled, (56,70))
        self.image=self.original_image
        self.rect=self.image.get_rect()
        self.xpos=0
        self.ypos=0
        self.rect.centerx=self.xpos
        self.rect.centery=self.ypos
        self.vel=0
        self.acc=.05
        self.brake=.2
        self.turn_brake=1.5
        self.angle=0
        self.max_speed=5

    def getShipPos(self):
        return (self.xpos, self.ypos)

    def getShipVel(self):
        return self.vel

    def getShipAcc(self):
        return self.acc

    def getShipRect(self):
        return self.rect

    def update(self):
        self.rect.centerx=self.xpos
        self.rect.centery=self.ypos

    def rotateShip(self, angle):
        #this rotates the ship by a specified angle
        self.image, self.rect = pygameRotateImage2(self.original_image, self.rect, angle-self.angle)
        self.angle+=angle

    def simpleMove(self, x_final, y_final):
        self.xpos=x_final
        self.ypos=y_final

    def moveShip(self):
        keys=pygame.key.get_pressed()
        xpos_i=self.xpos
        ypos_i=self.ypos
        if keys[K_w]:
            if self.vel>self.max_speed:
                self.vel=self.max_speed
            else:
                self.vel+=self.acc          
        elif keys[K_s]:
            self.vel-=self.brake
            if self.vel<0:
                self.vel=0          

        if keys[K_a]:
            self.rotateShip(-self.turn_brake)
        elif keys[K_d]:
            self.rotateShip(self.turn_brake)

        self.xpos+=self.vel*math.sin(math.radians(self.angle))
        self.ypos+= -self.vel*math.cos(math.radians(self.angle))

display.blit(background, (0,0))
pygame.display.update()

player_ship=Ship('image.png')
player_ship.simpleMove(screen_width/2, screen_height/2)

movement_group=pygame.sprite.Group()
movement_group.add(player_ship)

clock=pygame.time.Clock()
while True:
    clock.tick(60)
    (mousex,mousey)=pygame.mouse.get_pos()
    for event in pygame.event.get():
        if event.type==QUIT:
            pygame.quit()
            sys.exit()
    player_ship.moveShip()

    movement_group.update()
    display.blit(background, (0,0))
    movement_group.draw(display)
    pygame.display.update()

4 个答案:

答案 0 :(得分:0)

双缓冲可能至少会帮助一些人。它是一种用于计算机图形学的技术,用于减少像素变化的次数。它可以实现为:

clock.tick

另一种选择是将@RequestBody从循环开始移动到循环结束。这是我经常看到的地方,它可能会改变图形的结果。

答案 1 :(得分:0)

尝试将行pygame.display.update()更改为pygame.display.flip()

答案 2 :(得分:0)

过去我遇到过同样的问题。 我现在通常在需要在屏幕上显示的类中创建一个方法,该方法将图片(类本身)显示在屏幕上。 我在屏幕更新之前调用该方法。

例如,这是类&#34; Tank&#34;的一种方法,它实际上构建了玩家使用的坦克:

def master_player(self): #calculate and draw the player sprite
    self.posix() # call of a method which calculate the position
    self.image_tank.set_colorkey(PURPLE)
    screen.blit(player.image_tank, player.position_tuple)

正如我之前所说,我在游戏循环结束时和屏幕更新之前调用此方法。

答案 3 :(得分:0)

尝试在 pygame.display.update() <下移动 player_ship.moveShip() / p>

像这样:     player_ship.moveShip()

movement_group.update()
display.blit(background, (0,0))
movement_group.draw(display)
pygame.display.update()