zoukankan      html  css  js  c++  java
  • 02.基本动作

     

    玩家控制的小船:

    def play_lives(num_icons, batch=None):
        """
        小船图标
        :param num_icons: 数量
        :param batch: 批处理
        :return:
        """
        play_lives = []
        for i in range(num_icons):
            new_sprite = pyglet.sprite.Sprite(img=resources.player_image, x=785 - i * 30, y=585, batch=batch)
            new_sprite.scale = 0.5  # 比例
            play_lives.append(new_sprite)
        return play_lives

    运动类physicalobject:

    """运动类physicalobject"""
    import pyglet
    
    
    class Physicalobject(pyglet.sprite.Sprite):
        """
        存储对象的速度
        """
    
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.velocity_x, self.velocity_y = 0.0, 0.0
    
        def update(self, dt):
            """
            每个对象都需要在每一帧进行更新
            :param dt: “增量时间”或“时间步长”
            :return:
            """
            self.x += self.velocity_x * dt
            self.y += self.velocity_y * dt
            self.check_bounds()
    
        def check_bounds(self):
            """对象是否在屏幕一侧出去会移动到屏幕的另一侧"""
            min_x = -self.image.width / 2
            min_y = -self.image.height / 2
            max_x = 800 + self.image.height / 2
            max_y = 600 + self.image.height / 2
            if self.x < min_x:
                self.x = max_x
            elif self.x > max_x:
                self.x = min_x
            if self.y < min_y:
                self.y = max_y
            elif self.y > max_y:
                self.y = min_y

    修改小行星让它动:

    def asteroids(num_asteroids, play_position, batch=None):
        """
        随机位置小行星精灵
        :param num_asteroids: 生成小行星数量
        :param play_position: 玩家的位置
        :param batch 批处理
        :return: 返回小行星精灵
        """
        asteroids = []
        for i in range(num_asteroids):
            asteroid_x, asteroid_y = play_position
            while distance((asteroid_x, asteroid_y), play_position) < 100:
                asteroid_x = random.randint(0, 800)
                asteroid_y = random.randint(0, 600)
            # new_asteroid = pyglet.sprite.Sprite(img=resources.asteroid_image, x=asteroid_x, y=asteroid_y, batch=batch)
            new_asteroid = physicalobject.Physicalobject(img=resources.asteroid_image, x=asteroid_x, y=asteroid_y, batch=batch)
            # rotation:Sprite的旋转
            new_asteroid.rotation = random.randint(0, 360)  # 随机旋转
            # 速度
            new_asteroid.velocity_x = random.random()*40
            new_asteroid.velocity_y = random.random()*40
    
            asteroids.append(new_asteroid)
        return asteroids

    编写游戏更新功能:

    # 游戏对象列表
    game_objects = [play_ship] + asteroids
    def update(dt):
        for obj in game_objects:
            obj.update(dt)  # 调用Physicalobject的更新
    if __name__ == '__main__':
        # 每秒调用update函数120次
        pyglet.clock.schedule_interval(update, 1 / 120.0)
        pyglet.app.run()

    运行发现以前静止的小行星在屏幕上平静地漂移,当它们滑出边缘时又重新出现在另一侧。

    玩家对象响应键盘输入:player.py

    """键盘输入"""
    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.keys = dict(left=False, right=False, up=False)
    
        def on_key_press(self, symbol, modifiers):  # 键盘按下
            if symbol == key.UP:
                self.keys['up'] = True
            elif symbol == key.LEFT:
                self.keys['left'] = True
            elif symbol == key.RIGHT:
                self.keys['right'] = True
    
        def on_key_release(self, symbol, modifiers):  # 键盘释放
            if symbol == key.UP:
                self.keys['up'] = False
            elif symbol == key.LEFT:
                self.keys['left'] = False
            elif symbol == key.RIGHT:
                self.keys['right'] = False
    
        def update(self, dt):
            super(Player, self).update(dt)
            if self.keys['left']:  # 向左转
                self.rotation -= self.rotate_speed * dt  # rotation为角度
            if self.keys['right']:  # 向右转
                self.rotation += self.rotate_speed * dt
            if self.keys['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

    主函数调用玩家调用:

    play_ship = player.Player(x=400, y=300,batch=main_batch)
    # 将其推送到事件堆栈中
    game_window.push_handlers(play_ship)

    现在,能够运行游戏并使用箭头键移动玩家

  • 相关阅读:
    Web实现大文件分片上传的方法
    kinova环境配置
    c++ stl list
    echarts饼图
    js函数
    飞浆测试日志
    IfcRevolvedAreaSolidTapered
    matlab一元二次方程求根
    运行日志
    常用的sql
  • 原文地址:https://www.cnblogs.com/fly-book/p/11772308.html
Copyright © 2011-2022 走看看