如何在python中使用eval

2024-09-30 16:41:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个游戏我已经做了一段时间了。核心是C++,但是我用Python编写脚本,用于攻击/状态效应/项目等。

我想把自己的行为规范化。它是如何产生的:

我有一个xml文档,用于规范攻击,如下所示:

<Attack name="Megiddo Flare" mp="144" accuracy="1.5" targetting="EnemyParty">
    <Flags>
        <IgnoreElements/>
        <Unreflectable/>
        <ConstantDamage/>
        <LockedTargetting/>
    </Flags>
    <Components>
        <ElementalWeightComponent>
            <Element name="Fire" weight="0.5"/> 
        </ElementalWeightComponent>
        <ConstantDamageCalculatorComponent damage="9995" index="DamageCalculatorComponent"/>    
    </Components>
</Attack>

我用python解析这个文件,并构建我的攻击。每种攻击都由任意数量的组件组成,以实现不同的行为。在本次攻击中,我实现了一个DamageCalculatorComponent,告诉python使用ConstantDamage变量。我在脚本文件中实现了所有这些组件。这对我将要经常使用的组件类型很好。在某些攻击中,该攻击将是唯一使用该特定组件变体的攻击。我希望能够在xml文件中指定组件类,而不是将组件添加到脚本文件中。在

例如,如果我要实施《最终幻想》中的经典白风攻击(根据攻击者的生命值恢复团队生命)

^{pr2}$

我想知道有没有更好的办法?我能看到的唯一另一种方法是将每个可能的组件变量定义放入python文件中,然后展开组件创建者来检查附加的变量。对于一次性使用的组件来说似乎有点浪费。对于动态生成类型,是否有更好/更安全的替代方法,或者可能是我没有看到的另一种解决方案?在

提前谢谢


Tags: 文件方法name脚本游戏类型核心components
1条回答
网友
1楼 · 发布于 2024-09-30 16:41:05

内联Python很糟糕,因为

  • Python源代码编辑器无法理解您的源代码文件,您将错过语法突出显示

  • 所有其他可用于lint和验证源代码的工具(如pylint)也将失败

备选方案

在元素<CustomComponent index="DamageCalculatorComponent">

。。。添加参数script

<CustomComponent index="DamageCalculatorComponent" script="damager.py">

然后在文件系统的某个地方添加文件damager.py。在

按如下所述加载:What is an alternative to execfile in Python 3?

在主游戏引擎代码中,使用加载的系统模块构造类,如下所示:

 damager_class = sys.modules["mymodulename"].my_factory_function()

所有Python模块都必须共享某种约定的类名/入口点函数。在

如果您想要真正的可插入的体系结构,请使用Python eggs和setup.py入口点

示例

相关问题 更多 >