我是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()
答案 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()