小学生python游戏编程arcade----原码分析

小学生python游戏编程arcade----原码分析
物理引擎
self.physics_engine = arcade.PhysicsEnginePlatformer(

我们正在发送我们的 SpriteList 对于玩家应该碰撞到的东西 walls 物理引擎的参数。正如我们将在后面的章节中看到的,Platform物理引擎有一个 platforms 和 walls 参数。这两者之间的区别非常重要。静态不移动精灵列表应始终发送到 walls 参数,并且移动的精灵应发送到 platforms 参数。确保您做到这一点将对性能有极大的好处。

通过添加静态精灵 platforms 参数大致是一个O(N)运算,这意味着随着您添加更多的精灵,性能将线性下降。如果将静态精灵添加到 walls 参数,那么它几乎是O(1),并且例如100个和50,000个不移动的精灵之间基本上没有区别。

我们还在这里看到了一些与我们的 Scene 对象。您可以像访问Python词典一样访问场景,以便从中获取SpriteList。有多种方法可以访问场景中的SpriteList,但这是最简单、最直接的方法。

class PhysicsEngineSimple:
    """
    Simplistic physics engine for use in games without gravity, such as top-down
    games. It is easier to get
    started with this engine than more sophisticated engines like PyMunk.

    :param Sprite player_sprite: The moving sprite
    :param  Union[SpriteList, Iterable[SpriteList] walls: The sprites it can't move through.
        This can be one or multiple spritelists.
    """

    def __init__(self, player_sprite: Sprite, walls: Union[SpriteList, Iterable[SpriteList]]):
        """
        Create a simple physics engine.
        """
        assert isinstance(player_sprite, Sprite)

        if walls:
            if isinstance(walls, SpriteList):
                self.walls = [walls]
            else:
                self.walls = list(walls)
        else:
            self.walls = []

        self.player_sprite = player_sprite

    def update(self):
        """
        Move everything and resolve collisions.

        :Returns: SpriteList with all sprites contacted. Empty list if no sprites.
        """

        return _move_sprite(self.player_sprite, self.walls, ramp_up=False)

第二种引

class PhysicsEnginePlatformer:
    """
    Simplistic physics engine for use in a platformer. It is easier to get
    started with this engine than more sophisticated engines like PyMunk.

    **Note:** Sending static sprites to the ``walls`` parameter and moving sprites to the
    ``platforms`` parameter will have very extreme benefits to performance.

    **Note:** This engine will automatically move any Sprites sent to the ``platforms``
    parameter between a ``boundary_top`` and ``boundary_bottom`` or a ``boundary_left``
    and ``boundary_right`` attribute of the Sprite. You need only set an initial
    ``change_x`` or ``change_y`` on it.

    :param Sprite player_sprite: The moving sprite
    :param Optional[Union[SpriteList, Iterable[SpriteList]]] platforms: Sprites the player can't move through.
        This value should only be used for moving Sprites. Static sprites should be sent to the ``walls`` parameter.
    :param float gravity_constant: Downward acceleration per frame
    :param Optional[Union[SpriteList, Iterable[SpriteList]]] ladders: Ladders the user can climb on
    :param Optional[Union[SpriteList, Iterable[SpriteList]]] walls: Sprites the player can't move through.
        This value should only be used for static Sprites. Moving sprites should be sent to the ``platforms`` parameter.
    """

    def __init__(self,
                 player_sprite: Sprite,
                 platforms: Optional[Union[SpriteList, Iterable[SpriteList]]] = None,
                 gravity_constant: float = 0.5,
                 ladders: Optional[Union[SpriteList, Iterable[SpriteList]]] = None,
                 walls: Optional[Union[SpriteList, Iterable[SpriteList]]] = None,
                 ):
        """
        Create a physics engine for a platformer.
        """
        self.ladders: Optional[List[SpriteList]]
        self.platforms: List[SpriteList]
        self.walls: List[SpriteList]

        if ladders:
            if isinstance(ladders, SpriteList):
                self.ladders = [ladders]
            else:
                self.ladders = list(ladders)
        else:
            self.ladders = None

        if platforms:
            if isinstance(platforms, SpriteList):
                self.platforms = [platforms]
            else:
                self.platforms = list(platforms)
        else:
            self.platforms = []

        if walls:
            if isinstance(walls, SpriteList):
                self.walls = [walls]
            else:
                self.walls = list(walls)
        else:
            self.walls = []

        self.player_sprite: Sprite = player_sprite
        self.gravity_constant: float = gravity_constant
        self.jumps_since_ground: int = 0
        self.allowed_jumps: int = 1
        self.allow_multi_jump: bool = False
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以帮你使用Python的arcade库来创建一个平台类游戏。arcade库提供了一个简单而强大的API,可以帮助你创建2D游戏。它还有一个文档,可以帮助你开始创建游戏,并且拥有许多示例代码,可以让你学习如何使用这个库。 ### 回答2: 使用Python的arcade库可以很方便地制作平台类游戏。arcade库提供了许多内置函数和类,用于处理游戏循环、精灵、碰撞检测等常见的游戏开发任务。 首先,我们需要创建一个游戏窗口。通过arcade库提供的Window类,我们可以创建一个指定大小的窗口,并设置背景颜色。 接下来,我们可以创建角色或者其他游戏中的物体,这些物体被称为精灵。arcade库提供了Sprite类用于创建精灵。我们可以设置精灵的外观、位置、大小等属性。 在游戏循环中,我们可以监听用户输入,例如键盘按键、鼠标点击等事件。通过事件处理函数,我们可以根据用户的操作来更新精灵的状态。 在平台类游戏中,通常会涉及到角色的跳跃、移动、碰撞检测等功能。arcade库提供了一些内置函数和方法来处理这些功能。例如,我们可以使用移动函数来控制角色的水平和垂直移动。我们还可以使用碰撞检测函数来判断角色是否与其他物体发生了碰撞。 此外,arcade库还可以处理音效、动画等高级功能,以及绘制背景、地图等元素。它还提供了一些内置的工具函数,用于计算距离、旋转等常见操作。 总的来说,使用Python的arcade库可以实现一个简单而又有趣的平台类游戏。通过利用arcade库提供的丰富功能,可以很方便地创建精灵、处理用户输入、实现碰撞检测等游戏开发任务。无论是新手还是有经验的开发者,都可以轻松上手使用arcade库制作自己的平台类游戏。 ### 回答3: 使用Python的arcade库可以很方便地制作平台类游戏。首先,我们需要导入arcade库。然后创建一个继承自arcade.Window的类,作为游戏窗口。 在窗口类中,我们可以定义一些属性,比如玩家的位置和角色模型等。然后,我们可以使用arcade库提供的绘图函数来渲染游戏界面。 接着,我们可以定义一些事件处理函数,比如按键事件或鼠标事件。根据不同的事件,我们可以更新游戏状态,比如移动玩家或触发一些特殊的效果。 在游戏循环中,我们可以使用arcade库提供的定时器函数来设定游戏帧率。每一帧,我们可以调用draw函数来绘制游戏界面,并在需要时更新游戏状态。 此外,我们可以使用arcade库提供的物理引擎功能,比如重力或碰撞检测,来增加游戏的真实性和挑战性。 最后,当玩家达到游戏的胜利条件或失败条件时,我们可以显示游戏结束画面,并提供一些重新开始或退出游戏的选项。 总的来说,使用Python的arcade库可以很方便地制作一个平台类游戏。通过定义游戏窗口、绘制游戏界面、处理事件和更新游戏状态等步骤,我们可以创建一个有趣且具有挑战性的游戏体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

信息化未来

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值