- 浏览: 6343 次
- 性别:
最近访客 更多访客>>
文章分类
最新评论
-
magic_seek:
有问题我一定会详细解答的。
开源项目XWorker介绍帖,希望能有开发者参与或使用XWorker -
deadguy:
好像网站不太稳定,我再去就好了。目前正在研究这个项目,看看应用 ...
开源项目XWorker介绍帖,希望能有开发者参与或使用XWorker -
magic_seek:
我知道是什么情况了,eclipse插件的链接已经取消了,因为这 ...
开源项目XWorker介绍帖,希望能有开发者参与或使用XWorker -
deadguy:
什么时候试的?
开源项目XWorker介绍帖,希望能有开发者参与或使用XWorker -
magic_seek:
应该可以的吧,我试过eclipse3.5,3.6,3.7,安装 ...
开源项目XWorker介绍帖,希望能有开发者参与或使用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=""""/> <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=""""/> <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数据或数组等分组和汇总。
相关推荐
除了使用战斗模拟器外,加入Ogame的相关社区也是一个不错的选择。通过与经验丰富的玩家交流心得,可以获得宝贵的建议和技巧,进一步提升游戏体验。此外,许多社区还会分享自制的工具和资源,这些都是宝贵的学习资料...
用Excel开发的战斗模拟器,用于模拟玩家面对1个及以上的怪物时的战斗过程,并输出过程与结果
8. **文档编写**:良好的文档可以帮助用户理解模拟器的工作原理和使用方法,也可以方便团队协作。包括用户手册、开发者指南和技术规格书。 9. **版本控制**:使用Git或其他版本控制系统进行代码管理,便于跟踪更改...
EXCEL战斗模拟器,宏代码很简单,即使看不懂也可以手动修改
以下是一些关键知识点,涉及使用JavaScript编写模拟器: 1. **JavaScript基础**:首先,理解JavaScript的基本语法和数据类型至关重要,包括变量、函数、对象、数组等。熟悉DOM操作和事件处理也是必要的,因为模拟器...
在本例中,模拟器使用了freeglut库来输出图像。freeglut是一个开源的OpenGL实用程序工具包,它提供了窗口管理和图形渲染的功能,使得开发者无需关注底层细节,就能创建图形用户界面。这意味着这个FC模拟器依赖于...
国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。国外大学实现的MIPS模拟器,使用Java编写。...
本文将详细介绍如何使用C语言编写一个汇编模拟器,这一过程涉及到多个关键知识点。 首先,让我们理解汇编模拟器的作用。汇编模拟器是一种软件,它能够读取、解析和执行汇编语言程序,使得程序员可以在没有实际硬件...
本项目“使用ros节点编写的模拟器”显然是一个基于ROS的机器人模拟环境,专用于模拟轮式机器人的行走、传感器以及各种场景。以下将详细介绍该模拟器可能涉及的关键知识点: 1. **ROS节点**:ROS中的基本工作单元是...
用于数字战斗模拟器的任务脚本编写工具 作者:Grimes(mrSkortch),速度 论坛主题: : 文献资料 MIST Wiki页面可以位于以下地址: : 下载中随附了附件pdf“ mist gude.pdf”。 描述 MIssion脚本工具(Mist)是...
### AS安卓开发-使用外部模拟器-mumu模拟器,调试运行程序 在Android开发过程中,除了使用Android Studio自带的模拟器之外,还可以选择其他第三方模拟器来提高开发效率。其中,MuMu模拟器因其良好的性能表现及较低的...
战斗模拟器(By雨尽天空).xlsm
标题中的“Go-使用Go编写的MIPS模拟器包含一个Web界面”表明这是一个用Go语言实现的MIPS架构计算机模拟器,并且具有一个基于Web的用户界面。这为我们提供了两个主要的知识点:Go语言编程和MIPS指令集模拟。 1. Go...
本文将深入探讨一个名为“plato-x86-simulator”的项目,这是一个使用PHP编写的X86架构模拟器。在C#等其他编程语言广泛应用于系统级编程的背景下,PHP可能并非首选,但这一独特的实现方式展示了PHP在处理复杂计算...
通过Excel 内置的vba 实现简单的英雄1v1战斗的文字模拟,可以自定义英雄的基础属性,包括: 名称 生命 物理攻击 物理防御 魔法攻击 魔法防御 攻击速度 攻击范围 移动速度 可以打印出每一回合的战斗状态。方便在设计...
C#编写的基于MIPS指令集的一个汇编模拟器 MIPS是五级流水线的体系结构,该模拟器支持将汇编源码转译成二进制的机器码,可带设置断点。模拟器模拟机器码的执行,可以单步执行,多步执行到断点处,完全可视化的模拟...
【文字战斗机:基于回合的角色扮演战斗模拟器】 在IT领域,游戏开发是一项充满挑战和创新的任务,而“文字战斗机”就是一个独特的例子,它是一个基于回合制的角色扮演游戏(RPG)战斗模拟器。这款游戏的设计旨在...
**简易的Cache模拟器** 在计算机系统中,Cache是一种高速数据存储部件,它用于暂时存储处理器频繁访问的数据,以减少主存与处理器之间的数据传输时间,从而提高整体系统的性能。本项目旨在通过模拟器的形式,帮助...
欢迎使用D&D 5e Encounter模拟器。 撰写该文章是为了确定胜利概率并检验一些假设。 。 注意该服务器经常停机,因为它是Openshift上的一个低CPU应用程序,尽管有一分钟的超时,但它仍使使用配额最大化,因此我必须...
标题中的“又一个vc和c语言编写的NES/FC模拟器游戏机”指的是使用Microsoft Visual C++(简称VC)和C语言开发的一款软件,该软件能够模拟任天堂 Entertainment System(NES,也被称作FC,Family Computer)游戏机的...