《炉石传说》建筑设计欣赏(6):卡&在执行数据时,组织能力

上一篇文章我们看到了《炉石传说》核心存储卡的数据,今天,我们不断探索卡&身手。

基本的类

通过之前的分析,卡牌&技能涉及到几个类体系:Entity。Actor。Card。Spell,令人十分困惑,特别是前两者。在这里先略带武断的说一下这几个类的基本定位:

  • Entity主要用来做网络数据同步用的;
  • Actor主要处理client的渲染对象的控制,作为Component挂载在资源对象上;
  • Spell是技能Prefab挂载的脚本。
  • Card是卡牌Prefab挂载的脚本。在执行时处于中心地位,处理前3者的联系。

Entity

  • Entity是通过网络数据创建的,主要是Network.PacketID.POWER_HISTORY这个消息。

    详见GameState.CreateNewEntities()函数。由于Entity并非MonoBehavior派生类。所以是new出来的,然后加入到GameState中管理(GameState.AddEntity()),网络传来的Entity数据主要是Tags(每一个Tag是一个name->value对)。然后调用Entity.InitEntity();

Actor

  • Actor也是一种资源,通过AssetLoader.LoadActor()载入;
  • 相应于AssetFamily.Actor。
  • 相应的资源包为“actor?.unity3d”,包内的为GameObject;
  • Actor的载入入口是在:Card.DetermineActorThenTransitionToZone()

Spell

  • Spell的载入入口是在Entity.ProcessCardDefAssetRequest()

Card

  • 在InitEntity中调用了Entity.InitCard(),它做的工作仅仅是创建一个空的GameObject,然后使用AddComponent把Card加入上去。
  • 真正的卡牌Prefab载入是在Entity.LoadCard()中进行的,这个函数是在处理PowerTask时GameState.OnShowEntity()中调用的。
  • 详细的载入操作是通过 DefLoader.LoadCardDef()进行的。其内部再调用AssetLoader.LoadCardPrefab()来进行资源载入。

卡牌&技能的载入流程

Entity的创建,以及Card、Spell的载入,都由网络消息触发;整个过程比較复杂,主要是有非常多异步回调。比較难用文字描写叙述。请见下图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTmVpbDNE/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" >

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-12-13 08:02:24

《炉石传说》建筑设计欣赏(6):卡&在执行数据时,组织能力的相关文章

《炉石传说》架构设计赏析(6):卡牌&技能数据的运行时组织

前一篇文章我们看到了<炉石传说>的核心卡牌数据的存储,今天我们继续探索卡牌&技能. 主要的类 通过之前的分析,卡牌&技能涉及到几个类体系:Entity,Actor,Card,Spell,令人十分困惑,特别是前两者.在这里先略带武断的说一下这几个类的基本定位: Entity主要用来做网络数据同步用的: Actor主要处理客户端的渲染对象的控制,作为Component挂载在资源对象上: Spell是技能Prefab挂载的脚本: Card是卡牌Prefab挂载的脚本,在运行时处于中心

利用浏览器缓存抓取网络资源:【炉石传说】所有卡牌png图片地址

有的时候我们在网络上看到很好的资源,想要抓取,却苦于没有好的手段.今天我就来介绍一下通过chrome浏览器缓存抓取的方法. 大家都知道,浏览器把网页展示给我们看的时候,会先将页面上的所有图片等资源下载到浏览器缓存中,利用这一点,我们就可以抓取了. 我选取的是当下比较流行的卡牌游戏[炉石传说],其游戏性的重要组成部分就是千奇百怪的卡牌. 首先,我们进入官网中的卡牌工具页面(http://hs.blizzard.cn/cards/builder/),在这里我们可以通过查找,找到每一张炉石卡牌.我们当

炉石传说JJC英雄简评 &amp;&amp; JJC combo收集:Ver 1.0

? 1 2 3 4 5 6 7 /*-----------------------------------------------------------------------------  *  author:Rainboy and his GL 南柯CHY  *  wirte date:2014-04-29  * # LastUpdated: 2014-04-29 15:42  * ? Copyright 2014 Rainboy and his GL 南柯CHY.  All Rights

CCF - 201609-3 - 炉石传说

问题描述 试题编号: 201609-3 试题名称: 炉石传说 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: * 玩家会控制一些角色,每个角色有自己的生命值和攻击力.当生命值小于等于 0 时,该角色死亡.角色分为英雄和随从. *

CCF2016093炉石传说(C语言版)

问题描述 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示).游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: * 玩家会控制一些角色,每个角色有自己的生命值和攻击力.当生命值小于等于 0 时,该角色死亡.角色分为英雄和随从. * 玩家各控制一个英雄,游戏开始时,英雄的生命值为 30,攻击力为 0.当英雄死亡时,游戏结束,英雄未死亡的一方获胜. * 玩

炉石传说 C# 开发笔记 (续)

炉石传说山寨的工作一直在进行着,在开发过程中深深体会到,对于业务的理解和整个程序的架构的整理远比开发难得多. 在开发过程中,如果你的模型不合理,不准确,很有可能造成代码的混乱,冗余,难以维护和扩展性比较差等问题. 当然,除去领域专家之外,很少人对于一个新的事物可以在一开始就把握住整个核心业务. 接下来讲讲整个程序的构造: Card类库:将整个业务逻辑封装在里面,包括了服务器和客户端的通信逻辑.通信协议的编码和解码.现在是为了炉石定制的,以后想改写成更加通用的. CardHelper:一个辅助程序

炉石传说 C# 开发笔记

最近在大连的同事强力推荐我玩 炉石传说,一个卡牌游戏.加上五一放一个很长很长的假期,为了磨练自己,决定尝试开发一个C#的炉石传说. 这件事情有人已经干过了,开发了一个网页版的炉石,但是貌似不能玩.... http://cnodejs.org/topic/529c1366a6957a0809485f3d 如果这位同志看到这篇文章,请一定和我联系!! [email protected]或Q我377372779 第一天 开始学习炉石传说的玩法,最好的方法是不停的玩游戏. 一个应用是否逻辑清晰,取决于你

炉石传说 C# 开发笔记(BS上线尝试)

昨天买了一个月的1G 1核的服务器,由于不是新用户,所以没有享受到阿里的6个月免费的优惠. (阿里脑残,为什么不对于续费或者升级免费呢?) 在服务器的通讯上面已经OK了,完全绕过了ASP.NET,就是单纯的服务器和浏览器在通讯,页面也只是静态的页面,纯HTML5 + JS. 通讯是WebSocket,绘图SVG.不知道为什么,对于固定的文字,UC的文字绘制是OK的,对于JSON反序列化的对象,所有的绘制都是有问题的. 初步怀疑是由于使用了汉字,然后没有设置编码,造成了JS的本地反序列化不对. 服

islands打炉石传说&lt;DP&gt;

islands最近在完一款游戏"炉石传说",又名"魔兽英雄传".炉石传说是一款卡牌类对战的游戏.游戏是2人对战,总的来说,里面的卡牌分成2类,一类是法术牌,另一类是随从牌(所谓随从就是怪物). 为了简化问题,现在假设随从牌的作用是召唤一个具有一定攻击力的怪物,法术牌的作用是给某个随从增加一定攻击力.随从牌和法术牌的使用都需要消耗一定的法力值.现在islands有10点法力值,手上有n张牌(islands最多有10张牌,否者他将会被爆牌T_T),有些是法术牌,有些是随