03.鍵盤狀態跟蹤與精靈刪除

使用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

增長髮動機火焰:resources.py

# 火焰圖像,將火焰圖像的旋轉中心向右移動,通過圖像的末端
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()方法刪除玩家
相關文章
相關標籤/搜索