使用pyglet.window.key.KeyStateHandler,能
跟蹤鍵盤上每一個鍵的狀態:修改上一節中的Player類,如今能夠從類中刪除on_key_press()和方法on_key_release()方法,交給KeyStateHandler()處理,將其推送到事件堆棧中。函數
# 將其推送到事件堆棧中 game_window.push_handlers(play_ship.key_handler)
修改後的player類:spa
"""鍵盤輸入""" import math from let import physicalobject, resources from pyglet.window import key class Player(physicalobject.Physicalobject): """玩家操控""" def __init__(self, *args, **kwargs): super().__init__(img=resources.player_image, *args, **kwargs) self.thrust = 300.0 # 速度 self.rotate_speed = 200.0 # 角度調整度數 self.key_handler = key.KeyStateHandler() def update(self, dt): super(Player, self).update(dt) if self.key_handler[key.LEFT]: # 向左轉 self.rotation -= self.rotate_speed * dt # rotation爲角度 if self.key_handler[key.RIGHT]: # 向右轉 self.rotation += self.rotate_speed * dt if self.key_handler[key.UP]: # 向前行 angle_radians = -math.radians(self.rotation) # 度轉換爲弧度,radians參數是弧度 force_x = math.cos(angle_radians)*self.thrust*dt force_y = math.sin(angle_radians)*self.thrust*dt self.velocity_x += force_x self.velocity_y += force_y
# 火焰圖像,將火焰圖像的旋轉中心向右移動,通過圖像的末端 engine_image = pyglet.resource.image("engine_flame.png") engine_image.anchor_x = engine_image.width * 1.5 engine_image.anchor_y = engine_image.height / 2
在Player類的構造函數在加載火焰,並設置默認不可見
# 建立和繪製火焰 self.engine_sprite = pyglet.sprite.Sprite(img=resources.engine_image, *args, **kwargs) self.engine_sprite.visible = False # 默認不可見
並修改update的[key.UP]:
# 火焰精靈顯示在玩家的位置,跟隨玩家旋轉 self.engine_sprite.rotation = self.rotation self.engine_sprite.x = self.x self.engine_sprite.y = self.y self.engine_sprite.visible = True
else:
self.engine_sprite.visible = False
刪除精靈操做:code
當玩家死亡須要刪除玩家與火焰blog
def delete(self): self.engine_sprite.delete() # 刪除火焰精靈 super(Player, self).delete() # 調用Sprite本身的delete()方法刪除玩家
修改後的完整Player類:事件
"""鍵盤輸入""" import math import pyglet from let import physicalobject, resources from pyglet.window import key class Player(physicalobject.Physicalobject): """玩家操控""" def __init__(self, *args, **kwargs): super().__init__(img=resources.player_image, *args, **kwargs) self.thrust = 300.0 # 速度 self.rotate_speed = 200.0 # 角度調整度數 self.key_handler = key.KeyStateHandler() # 建立和繪製火焰 self.engine_sprite = pyglet.sprite.Sprite(img=resources.engine_image, *args, **kwargs) self.engine_sprite.visible = False # 默認不可見 def update(self, dt): super(Player, self).update(dt) if self.key_handler[key.LEFT]: # 向左轉 self.rotation -= self.rotate_speed * dt # rotation爲角度 if self.key_handler[key.RIGHT]: # 向右轉 self.rotation += self.rotate_speed * dt if self.key_handler[key.UP]: # 向前行 angle_radians = -math.radians(self.rotation) # 度轉換爲弧度,radians參數是弧度 force_x = math.cos(angle_radians) * self.thrust * dt force_y = math.sin(angle_radians) * self.thrust * dt self.velocity_x += force_x self.velocity_y += force_y # 火焰精靈顯示在玩家的位置,跟隨玩家旋轉 self.engine_sprite.rotation = self.rotation self.engine_sprite.x = self.x self.engine_sprite.y = self.y self.engine_sprite.visible = True else: self.engine_sprite.visible = False def delete(self): self.engine_sprite.delete() # 刪除火焰精靈 super(Player, self).delete() # 調用Sprite本身的delete()方法刪除玩家