zoukankan      html  css  js  c++  java
  • 03.键盘状态跟踪与精灵删除

    使用pyglet.window.key.KeyStateHandler,能跟踪键盘上每个键的状态:

    修改上一节中的Player类,现在可以从类中删除on_key_press()和方法on_key_release()方法,交给KeyStateHandler()处理,将其推送到事件堆栈中。

    # 将其推送到事件堆栈中
    game_window.push_handlers(play_ship.key_handler)

    修改后的player类:

    """键盘输入"""
    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

    删除精灵操作:

    当玩家死亡需要删除玩家与火焰

       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()方法删除玩家
  • 相关阅读:
    类图的基本知识
    设计模式——单例模式
    解决phpcms V9 推荐位无法排序
    PHPCMS 多站点管理切换问题
    天天团购系统-简单的目录结构
    php的时间输出格式
    天天团购--源码目录结构
    天天团购系统--部分模板语法
    PHP json数据格式化方法
    PHP json_encode中文乱码解决方法
  • 原文地址:https://www.cnblogs.com/fly-book/p/11775153.html
Copyright © 2011-2022 走看看