`
magic_seek
  • 浏览: 6343 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

使用XWorker编写战斗模拟器

阅读更多

  还是XWorker的介绍贴,XWorker是免费开源项目,下面是使用XWorker的数据对象技术开发的我们游戏项目的战斗模拟器,希望让大家了解XWorker中开发的方式。另外不建议目前用XWorker开发商业应用,后果自负,因为XWorker还不成熟,所以才希望有人能够加入XWorker的开发。

 

数据对象的使用说明:

    主要是用于编写界面和数据统计,数据对象技术类似于信息化系统那种格式化的CUDI操作,只不过在XWorker数据对象主要用于一般编辑界面,即不限于数据库的操作,主要是对一般的表单、表格的等处理,如示例中的战斗数据的展示和统计等。

 

战斗模拟器的界面:

 

战斗模拟器的详细说明

1. 玩家和怪物界面

XWorker中的代码是:

<Group name="playerGroup" text="玩家">
    <GridData style="FILL_HORIZONTAL" name="playerGroupGridData"/>
    <FillLayout name="FillLayout"/>
    <DataObjectForm formType="edit" name="playerForm" dataObject="tools:dataobjects.PlayerThingDataObject"/>
</Group>
<Group name="monsterGroup" text="怪物">
    <FillLayout name="monsterGroup"/>
    <GridData style="FILL_HORIZONTAL" name="monsterGroupGridData"/>
    <DataObjectForm formType="edit" name="monsterForm" dataObject="tools:dataobjects.Monster"/>
</Group>

以上代码生成了如下界面:

生成以上表单的依据是tools:dataobjects.PlayerThingDataObject和tools:dataobjects.Monster,如Monster的定义是:

<ListDataObject label="Monster" listData="npcList" editCols="4" storeSortDir="ASC" name="Monster" dataClassName="Npc">
    <attribute type="int" propertyPath="id" label="标识" queryEditor="false" viewEditor="false" gridEditor="false" name="id" editEditor="false" createEditor="false"/>
    <attribute propertyPath="name" label="名称" inputtype="label" name="name"/>
    <attribute type="int" propertyPath="level" label="等级" name="level"/>
    <attribute type="int" propertyPath="hpMax" label="气血上限" name="hpMax"/>
    <attribute type="int" propertyPath="mpMax" label="内息上限" name="mpMax"/>
    <attribute type="short" propertyPath="attackMin" label="最小攻击" name="minAttack"/>
    <attribute type="short" propertyPath="attackMax" label="最大攻击" name="maxAttack"/>
    <attribute type="float" propertyPath="hitRateAdd" label="命中率" name="hitRate"/>
    <attribute type="float" propertyPath="hitRateBase" label="基础命中率" name="hitRateBase"/>
    <attribute type="float" propertyPath="hitRateAdd" label="额外命中率" name="hitRateAdd"/>
    <attribute type="float" propertyPath="avoRate" label="躲闪率" name="avoRate"/>
    <attribute type="float" propertyPath="criRate" label="暴击率" name="criRate"/>
    <attribute type="float" propertyPath="destRate" label="破击率" name="destroyRate"/>
    <attribute type="float" propertyPath="harmReduceRate" label="伤害减免率" name="harmReduce"/>
    <attribute type="float" propertyPath="criHarmRate" label="暴击伤害率" name="criHarmRate"/>
    <attribute type="float" propertyPath="desReduceRate" label="破击减免率" name="desReduceRate"/>
    <attribute type="float" propertyPath="hpAbsorbRate" label="气血吸收率" name="hpAbsorbRate"/>
    <attribute type="float" propertyPath="damageReboundRate" label="伤害反弹率" name="damageReboundRate"/>
    <attribute type="int" propertyPath="speed" label="速度" name="speed"/>
    <attribute type="int" propertyPath="skill.id" label="技能" inputattrs="tools:battle.SkillSelector:/@shell" inputtype="openWindow" name="skill"/>
    <attribute type="short" propertyPath="defence" label="防御" name="defence"/>
</ListDataObject>

 

2. 设置和读取表单数据

   表单生成后,填充表单数据和获取表单数据的方法。

   a. 设置表单的数据

   以下是按钮的代码:

<Composite name="buttonComposite">
    <GridData horizontalAlignment="END" style="FILL_HORIZONTAL" name="buttonCompositeGridData"/>
    <RowLayout marginTop="0" name="buttonCompositeRowLayout"/>
    <Button name="selectPlayerBtn" text="选择角色">
        <RowData name="RowData" width="80"/>
        <Listeners>
            <Listener name="selectPlayerBtnSelection">
                <ShellDialog name="selectPlayer" shellPath="tools:battle.PlayerThingSelector:/@shell">
                    <Result condition="_return != null" name="ifOk">
                        <FormSetValues formName="playerForm" name="setPlayer" valueVariable="_return"/>
                    </Result>
                </ShellDialog>
            </Listener>
        </Listeners>
    </Button>
    <Button name="selectMonsterBtn" text="选择怪物">
        <RowData name="RowData" width="80"/>
        <Listeners>
            <Listener name="selectMonsterBtnSelection">
                <ShellDialog name="selectMonster" shellPath="tools:battle.MonsterSelector:/@shell">
                    <Result condition="_return != null" name="ifOk">
                        <FormSetValues formName="monsterForm" name="setMonster" valueVariable="_return"/>
                        <PropertySetter propertyName="monster" dataSource="actionContext.getScope(0)" name="setActionContext" value="_return"/>
                    </Result>
                </ShellDialog>
            </Listener>
        </Listeners>
    </Button>
    <Button name="startBattleBtn" text="开始战斗">
        <RowData name="RowData" width="80"/>
        <Listeners>
            <Listener name="startBattleBtnSelection">
                <GroovyAction code="" name="startBattle"/>
            </Listener>
        </Listeners>
    </Button>
    <Button name="updatePlayerBtn" text="保存角色">
        <RowData name="RowData" width="80"/>
        <Listeners>
            <Listener name="updatePlayerBtnSelection">
                <EventExecutor exceptionMessage="更新角色失败。" name="executeEpdatePlayer" successMessage="更新角色成功。">
                    <actions name="actions">
                        <FormUpdateDataObject name="updatePlayer" formName="playerForm"/>
                    </actions>
                </EventExecutor>
            </Listener>
        </Listeners>
    </Button>
    <Button name="createNewPlayerBtn" text="保存为新角色">
        <RowData name="RowData" width="80"/>
        <Listeners>
            <Listener name="createNewPlayerBtnSelection">
                <EventExecutor exceptionMessage="创建角色失败。" name="eventExecutor" successMessage="创建角色成功。">
                    <actions name="actions">
                        <FormCreateDataObject name="createPlayer" formName="playerForm"/>
                    </actions>
                </EventExecutor>
            </Listener>
        </Listeners>
    </Button>
</Composite>

 

对应的界面是:

 

我们使用选择怪物按钮来解释如何选择怪物并填充怪物表单,选择怪物的按钮的事件处理代码是:

<Listeners>
    <Listener name="selectMonsterBtnSelection">
        <ShellDialog name="selectMonster" shellPath="tools:battle.MonsterSelector:/@shell">
            <Result condition="_return != null" name="ifOk">
                <FormSetValues formName="monsterForm" name="setMonster" valueVariable="_return"/>
                <PropertySetter propertyName="monster" dataSource="actionContext.getScope(0)" name="setActionContext" value="_return"/>
            </Result>
        </ShellDialog>
    </Listener>
</Listeners>

 分解讲解:

<ShellDialog name="selectMonster" shellPath="tools:battle.MonsterSelector:/@shell">

 打开选择怪物的窗口tools:battle.MonsterSelector:/@shell。

<Result condition="_return != null" name="ifOk">

 如果选择的怪物。

<FormSetValues formName="monsterForm" name="setMonster" valueVariable="_return"/>

 把怪物数据填充到怪物表单。

<PropertySetter propertyName="monster" dataSource="actionContext.getScope(0)" name="setActionContext" value="_return"/>

 把怪物数据设置到全局变量中,以备后用。

 

b. 获取表单数据的代码

def mvalues = monsterForm.doAction("getValues", actionContext);

 以上是groovy的脚本代码,获取怪物表单中的编辑的数据。

 

3. 统计数据处理


 以上是模拟战斗后的统计结果,实际上战斗过程是由游戏的代码完成的,XWorker负责把每次的战斗结果汇总并显示出来,在这里介绍如何使用数据对象的统计功能。

统计的代码如下:

 

//计算玩家的统计信息
def attackStaticDObj = world.getThing("tools:battle.AttackInfoStatic");
//玩家统计
def playerAttackStatic = attackStaticDObj.doAction("query", actionContext, ["attackDetails": playerAttackDetails]).get(0);
//怪物统计
def monsterAttackStatic = attackStaticDObj.doAction("query", actionContext, ["attackDetails": monsterAttackDetails]).get(0);    

 playerAttackDetails和monsterAttackDetails是一次战斗的详细信息,是由游戏代码算出来的,attackStaticDObj是统计模块,做统计,

  attackStaticDObj.doAction("query", actionContext, ["attackDetails": playerAttackDetails]).get(0);是执行统计并算出结果。

其中统计的定义是tools:battle.AttackInfoStatic,它的代码如下:

<StatisticsQueryDataObject dataObject="ResultDataObject" editCols="4" storeSortDir="ASC" name="ResultStat">
    <attribute type="int" label="战斗次数" size="10" gridWidth="60" inputtype="label" aggregateExpression="*" name="totalCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="胜利次数" size="10" gridWidth="60" inputtype="label" aggregateExpression="result" name="winCount" queryFieldType="aggregate"/>
    <attribute type="float" aggregateFunction="avg" colspan="2" label="胜率" size="10" inputtype="label" aggregateExpression="result" name="winRate" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="总时间" size="10" inputtype="label" aggregateExpression="time" name="time" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="avg" label="平均战斗时间" size="10" inputtype="label" aggregateExpression="time" name="avgTime" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="avg" label="玩家平均攻击次数" size="10" inputtype="label" aggregateExpression="playerAttackCount" name="avgAttackCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="avg" label="怪物平均攻击次数" size="10" inputtype="label" aggregateExpression="monsterAttackCount" name="avgMonsterAttackCount" queryFieldType="aggregate"/>
    <attribute colspan="4" label="玩家统计数据" inputtype="label" name="playerData" queryFieldType="finalExpression" finalExpression="&quot;&quot;"/>
    <attribute type="int" aggregateFunction="sum" label="攻击次数" size="10" inputtype="label" aggregateExpression="playerAttackCount" name="playerAttackCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="总伤害" size="10" inputtype="label" aggregateExpression="playerAttack" name="playerAttack" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="暴击次数" inputtype="label" aggregateExpression="playerCrickedCount" name="playerCrickedCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="破击次数" inputtype="label" aggregateExpression="playerDestroyedCount" name="playerDestroyedCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="命中次数" inputtype="label" aggregateExpression="playerHitCount" name="playerHitCount" queryFieldType="aggregate"/>
    <attribute type="int" label="平均战斗伤害" size="10" inputtype="label" name="avgPlayerBattleAttack" queryFieldType="finalExpression" finalExpression="playerAttack/totalCount"/>
    <attribute type="float" label="暴击率" inputtype="label" name="playerAvgCrickedCount" queryFieldType="finalExpression" finalExpression="playerCrickedCount/playerAttackCount"/>
    <attribute type="int" label="破击率" inputtype="label" name="playerAvgDestroyedCount" queryFieldType="finalExpression" finalExpression="playerDestroyedCount/playerAttackCount"/>
    <attribute type="float" label="命中率" inputtype="label" name="playerAvgHitRate" queryFieldType="finalExpression" finalExpression="playerHitCount/playerAttackCount"/>
    <attribute type="int" label="平均每次伤害" size="10" inputtype="label" name="playerAvgAttackDamage" queryFieldType="finalExpression" finalExpression="playerAttack/playerAttackCount"/>
    <attribute type="int" aggregateFunction="sum" label="内息消耗" size="10" inputtype="label" aggregateExpression="playerAttackerMpUsed" name="playerAttackerMpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="avg" label="平均战斗内息消耗" size="10" inputtype="label" aggregateExpression="playerAttackerMpUsed" name="avgPlayerAttackerMpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="气血消耗" size="10" inputtype="label" aggregateExpression="playerAttackerHpUsed" name="playerAttackerHpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="气血吸收" size="10" inputtype="label" aggregateExpression="playerHpAbsorb" name="playerHpAbsorb" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="内息吸收" size="10" inputtype="label" aggregateExpression="playerMpAbsorb" name="playerMpAbsorb" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="伤害反弹" size="10" inputtype="label" aggregateExpression="playerDamageRebound" name="playerDamageRebound" queryFieldType="aggregate"/>
    <attribute colspan="4" label="怪物统计数据" inputtype="label" name="monsterData" queryFieldType="finalExpression" finalExpression="&quot;&quot;"/>
    <attribute type="int" aggregateFunction="sum" label="攻击次数" size="10" inputtype="label" aggregateExpression="monsterAttackCount" name="monsterAttackCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="总伤害" size="10" inputtype="label" aggregateExpression="monsterAttack" name="monsterAttack" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="暴击次数" inputtype="label" aggregateExpression="monsterCrickedCount" name="monsterCrickedCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="破击次数" inputtype="label" aggregateExpression="monsterDestroyedCount" name="monsterDestroyedCount" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="命中次数" inputtype="label" aggregateExpression="monsterHitCount" name="monsterHitCount" queryFieldType="aggregate"/>
    <attribute type="int" label="平均战斗伤害" size="10" inputtype="label" name="avgmonsterBattleAttack" queryFieldType="finalExpression" finalExpression="monsterAttack/totalCount"/>
    <attribute type="float" label="暴击率" inputtype="label" name="monsterAvgCrickedCount" queryFieldType="finalExpression" finalExpression="monsterCrickedCount/monsterAttackCount"/>
    <attribute type="int" label="破击率" inputtype="label" name="monsterAvgDestroyedCount" queryFieldType="finalExpression" finalExpression="monsterDestroyedCount/monsterAttackCount"/>
    <attribute type="float" label="命中率" inputtype="label" name="monsterAvgHitRate" queryFieldType="finalExpression" finalExpression="monsterHitCount/monsterAttackCount"/>
    <attribute type="int" label="平均每次伤害" size="10" inputtype="label" name="monsterAvgAttackDamage" queryFieldType="finalExpression" finalExpression="monsterAttack/monsterAttackCount"/>
    <attribute type="int" aggregateFunction="sum" label="内息消耗" size="10" inputtype="label" aggregateExpression="monsterAttackerMpUsed" name="monsterAttackerMpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="avg" label="平均战斗内息消耗" size="10" inputtype="label" aggregateExpression="monsterAttackerMpUsed" name="avgmonsterAttackerMpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="气血消耗" size="10" inputtype="label" aggregateExpression="monsterAttackerHpUsed" name="monsterAttackerHpUsed" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="气血吸收" size="10" inputtype="label" aggregateExpression="monsterHpAbsorb" name="monsterHpAbsorb" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="内息吸收" size="10" inputtype="label" aggregateExpression="monsterMpAbsorb" name="monsterMpAbsorb" queryFieldType="aggregate"/>
    <attribute type="int" aggregateFunction="sum" label="伤害反弹" size="10" inputtype="label" aggregateExpression="monsterDamageRebound" name="monsterDamageRebound" queryFieldType="aggregate"/>
</StatisticsQueryDataObject>

 StatisticsQueryDataObject是一个分组和汇总模块,可以对List数据或数组等分组和汇总。

  • 大小: 150.6 KB
  • 大小: 83.6 KB
  • 大小: 20.1 KB
  • 大小: 58.9 KB
分享到:
评论

相关推荐

    Ogame战斗模拟器URL

    除了使用战斗模拟器外,加入Ogame的相关社区也是一个不错的选择。通过与经验丰富的玩家交流心得,可以获得宝贵的建议和技巧,进一步提升游戏体验。此外,许多社区还会分享自制的工具和资源,这些都是宝贵的学习资料...

    Excel战斗模拟器(1 VS N)V1.0

    用Excel开发的战斗模拟器,用于模拟玩家面对1个及以上的怪物时的战斗过程,并输出过程与结果

    简述如何制作战斗模拟器.rar

    8. **文档编写**:良好的文档可以帮助用户理解模拟器的工作原理和使用方法,也可以方便团队协作。包括用户手册、开发者指南和技术规格书。 9. **版本控制**:使用Git或其他版本控制系统进行代码管理,便于跟踪更改...

    EXCEL战斗模拟器

    EXCEL战斗模拟器,宏代码很简单,即使看不懂也可以手动修改

    使用JavaScript编程语言编写的模拟器列表

    以下是一些关键知识点,涉及使用JavaScript编写模拟器: 1. **JavaScript基础**:首先,理解JavaScript的基本语法和数据类型至关重要,包括变量、函数、对象、数组等。熟悉DOM操作和事件处理也是必要的,因为模拟器...

    自己编写的FC模拟器

    在本例中,模拟器使用了freeglut库来输出图像。freeglut是一个开源的OpenGL实用程序工具包,它提供了窗口管理和图形渲染的功能,使得开发者无需关注底层细节,就能创建图形用户界面。这意味着这个FC模拟器依赖于...

    使用java编写的MIPS模拟器

    国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。...

    用C编写的汇编模拟器

    本文将详细介绍如何使用C语言编写一个汇编模拟器,这一过程涉及到多个关键知识点。 首先,让我们理解汇编模拟器的作用。汇编模拟器是一种软件,它能够读取、解析和执行汇编语言程序,使得程序员可以在没有实际硬件...

    使用ros节点编写的模拟器,用于模拟轮式机器人行走、相关传感器、场景等。___下载.zip

    本项目“使用ros节点编写的模拟器”显然是一个基于ROS的机器人模拟环境,专用于模拟轮式机器人的行走、传感器以及各种场景。以下将详细介绍该模拟器可能涉及的关键知识点: 1. **ROS节点**:ROS中的基本工作单元是...

    MissionScriptingTools:用于数字战斗模拟器的任务脚本编写工具

    用于数字战斗模拟器的任务脚本编写工具 作者:Grimes(mrSkortch),速度 论坛主题: : 文献资料 MIST Wiki页面可以位于以下地址: : 下载中随附了附件pdf“ mist gude.pdf”。 描述 MIssion脚本工具(Mist)是...

    AS安卓开发-使用外部模拟器-mumu模拟器,调试运行程序

    ### AS安卓开发-使用外部模拟器-mumu模拟器,调试运行程序 在Android开发过程中,除了使用Android Studio自带的模拟器之外,还可以选择其他第三方模拟器来提高开发效率。其中,MuMu模拟器因其良好的性能表现及较低的...

    战斗模拟器(By雨尽天空).xlsm

    战斗模拟器(By雨尽天空).xlsm

    Go-使用Go编写的MIPS模拟器包含一个Web界面

    标题中的“Go-使用Go编写的MIPS模拟器包含一个Web界面”表明这是一个用Go语言实现的MIPS架构计算机模拟器,并且具有一个基于Web的用户界面。这为我们提供了两个主要的知识点:Go语言编程和MIPS指令集模拟。 1. Go...

    plato-x86-simulator 使用php编写的x86模拟器.zip

    本文将深入探讨一个名为“plato-x86-simulator”的项目,这是一个使用PHP编写的X86架构模拟器。在C#等其他编程语言广泛应用于系统级编程的背景下,PHP可能并非首选,但这一独特的实现方式展示了PHP在处理复杂计算...

    Excel VBA 实现简单的英雄1v1的战斗文字模拟

    通过Excel 内置的vba 实现简单的英雄1v1战斗的文字模拟,可以自定义英雄的基础属性,包括: 名称 生命 物理攻击 物理防御 魔法攻击 魔法防御 攻击速度 攻击范围 移动速度 可以打印出每一回合的战斗状态。方便在设计...

    C#编写的MIPS汇编模拟器

    C#编写的基于MIPS指令集的一个汇编模拟器 MIPS是五级流水线的体系结构,该模拟器支持将汇编源码转译成二进制的机器码,可带设置断点。模拟器模拟机器码的执行,可以单步执行,多步执行到断点处,完全可视化的模拟...

    文字战斗机:基于回合的角色扮演战斗模拟器

    【文字战斗机:基于回合的角色扮演战斗模拟器】 在IT领域,游戏开发是一项充满挑战和创新的任务,而“文字战斗机”就是一个独特的例子,它是一个基于回合制的角色扮演游戏(RPG)战斗模拟器。这款游戏的设计旨在...

    简易的cache模拟器

    **简易的Cache模拟器** 在计算机系统中,Cache是一种高速数据存储部件,它用于暂时存储处理器频繁访问的数据,以减少主存与处理器之间的数据传输时间,从而提高整体系统的性能。本项目旨在通过模拟器的形式,帮助...

    DnD-battler:为我自己的娱乐而编写的5e D&D战斗模拟器,用于测试某些假设

    欢迎使用D&D 5e Encounter模拟器。 撰写该文章是为了确定胜利概率并检验一些假设。 。 注意该服务器经常停机,因为它是Openshift上的一个低CPU应用程序,尽管有一分钟的超时,但它仍使使用配额最大化,因此我必须...

    又一个vc和c语言编写的NES/FC模拟器游戏机

    标题中的“又一个vc和c语言编写的NES/FC模拟器游戏机”指的是使用Microsoft Visual C++(简称VC)和C语言开发的一款软件,该软件能够模拟任天堂 Entertainment System(NES,也被称作FC,Family Computer)游戏机的...

Global site tag (gtag.js) - Google Analytics