caimouse
在IT行业有20多年的经验。拥有20多年的C和C++开发经验,5年以上Python开发经验,资深数据库开发、上百G数据库优化经验。曾经任职嵌入式工程师、P2P开发工程师、银行信用卡交易系统工程师、全自动化电池测试部门经理。
展开
-
C#开发的OpenRA游戏之属性SelectionDecorations(14)
构造函数,传入物品对象actor,显示内容区域大小decorationBounds,是否显示健康状态条displayHealth,是否显示额外信息displayExtra。这个函数后面有两个参数,displayHealth是判断是否显示生命值,displayExtra是判断是否显示额外状态。通过这里分析,就理解了怎么样在角色选中时显示健康状态条和额外信息状态条。计算状态条的边框颜色和状态条中间颜色,以及边框相对位置。如果显示值与角色生命值不一样,进行入这里显示状态条。这个函数主要用来显示额外信息的状态条。原创 2023-11-30 11:11:09 · 277 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性SelectionDecorations(13)
autoBounds一般只会保存一个对象,比如物品对象就是使用WithSpriteBody类对象,因此这里的调用s.AutoMouseoverBounds函数,其实就是调用WithSpriteBody类对象的函数,主要实现物品大小变换到屏幕坐标里的大小和位置。在这里最重要的就是两个属性:Bounds和DecorationBounds,Bounds属性提供了这个物品的外形大小,占用地图空间大小,以及物理碰撞检测等等。如果用户有定义对象的大小,就使用用户定义的,如果没有就使用物品固有区域大小。原创 2023-11-29 17:56:41 · 491 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性SelectionDecorations(12)
在a.Trait.RenderAnnotations(a.Actor, this)调用里,就是调用了前面的接口RenderAnnotations函数。DrawDecorations函数先判断这个物品是否被选中,如果包含选中的列表中,那么就可以进行下一步的动作,就是调用函数RenderSelectionBox,也就是SelectionDecorations类的函数,这个函数是重写了基类SelectionDecorationsBase的函数RenderSelectionBox。里调用,主要参数是角色对象。原创 2023-11-28 12:05:59 · 307 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性SelectionDecorations(11)
然后,函数遍历所有相邻的点对,计算每个线段的顶点坐标,并使用parent.DrawRGBAVertices方法绘制线段。这行代码里,就是批量把顶点坐标vertices进行绘制,绘制的方式是按PrimitiveType.TriangleList的方式。不过隐藏在这个函数后面,会有更加复杂的内容。上面语句里可以使用三个坐标来画线,还有线的宽度和颜色,最后的那个参数是连接在一起的意思。如果线段闭合,则需要计算与前一个顶点相交的点,以便正确地绘制闭合的线段。函数首先检查输入的点的数量,如果少于2个,则不进行绘制。原创 2023-11-28 11:14:19 · 177 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性SelectionDecorations(10)
这段代码定义了一个名为SelectionBoxAnnotationRenderable的类,该类这段代码定义了一个名为SelectionBoxAnnotationRenderable的类,该类实现了IRenderable和IFinalizedRenderable接口。当用玩家选择地图上一个物品,或者士兵,或者坦克时,就会在周边画上一些指示标记,并且有一个状态条。前面分析了选择属性,继续分析前面的内容,不过这里不再是选择,而是选择相关的属性。AsDecoration():返回当前对象,不改变任何属性。原创 2023-11-27 12:40:29 · 270 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性Selectable(9)
这段代码定义了一个名为Selectable的类,该类继承自Interactable类并实现了ISelectable接口。Selectable类包含一个只读的字符串属性selectionClass和一个只读的SelectableInfo类型的属性Info, SelectableInfo类就是前面定义的信息类。在构造函数中,首先判断传入的info.Class是否为空或者为null,如果是,则将selectionClass设置为self.Info.Name,否则将其设置为info.Class。原创 2023-11-23 10:00:53 · 586 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性RenderSprites(8)
本文开始学习RenderSprites属性,这个属性是跟渲染有关的,因此它就摄及颜色相关的内容,所以我们先来学习一下调色板,这是旧游戏的图片文件保存的格式,如果放在现代来看,不会再采用这种方法,毕竟现在存储空间变大,便宜了,并且内存空间也便宜了。就是保存在后面这两字典里面,如果后面遇到要使用调色板,只需要通过名称就可以在这里找到调色板的数据,因此调色板的名称是一个很重要的数据。在这里类里,还定义上面的函数来先获取派系的图片来显示,如果没有定义派系的图片,就直接采用角色名称默认的图片来显示。原创 2023-11-22 18:36:10 · 286 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性QuantizeFacingsFromSequence(7)
通过特性字典就会找到IQuantizeBodyOrientationInfo接口,因此就可以调用上面的类QuantizeFacingsFromSequence,因为它是继承接口IQuantizeBodyOrientationInfo的,这样就可以通过它来找到角色的方向。这个类继承了ConditionalTraitInfo接口,IQuantizeBodyOrientationInfo接口,以及RenderSpritesInfo接口,它是用来描述显示角色动画的信息。这个类用来从动画序列来找到角色的方向。原创 2023-11-20 11:38:12 · 252 阅读 · 0 评论 -
C#开发的OpenRA游戏之属性BodyOrientation(6)
SpriteActor是用来定义角色的基本属性,它的第一个属性就是BodyOrientation,这个属性主要用来描述角色的身体的方向。这个函数是计算角色方向,它是通过orientation.Yaw角度和角色拥有多少个朝向来决定采用哪一个朝向。这个主要保存了使用哪一个方向来角色方向。这里保存摄像机的角度,默认是偏移40度的方向来投影。这个函数采用延时方向来计算角色的朝向问题。这个函数是根据旋转角度和朝向来决定方向。根据角度和多个朝向来选择合适的朝向。这里保存方向的信息类对象。根据角度来找到合适的朝向。原创 2023-11-17 19:40:33 · 329 阅读 · 0 评论 -
C#开发的OpenRA游戏之世界存在的属性RenderDebugState(5)
前面分析过一个调试的属性,在这里分析另外一个属性,这个属性就是RenderDebugState,它就是用来显示渲染的信息。从上图可以看到,采矿车被玩家选中之后,就会显示一串红色的文本,第一行是这个物品的名称和ID号,第二行是行动的名称和状态。如果这个角色有当前的行动,就把行动的内容添加到后面显示,中间采用句号分隔。如果调试模块不存,或者没有调试参数没有设置,都不进行显示角色的标签。跟前面的分析规则可知,属性都是有一个信息类和操作类组成。这个类主要用来在地图上显示Actor的类型和ID名称。原创 2023-11-15 19:19:12 · 305 阅读 · 0 评论 -
C#开发的OpenRA游戏之世界存在的属性GivesExperience(4)
又有于它被杀之后会有经验值,所以它要继承INotifyKilled,这样才能响应被杀的事件。在这个函数首先获取经验值,经验值主要有两个来源,一个是从用户里设置的YAML文件,一个是没有设置,直接从创建物品的花费来计算。最后是从IGivesExperienceModifier来获取经验的修改器,可以使用一个修改器来改变所有经验的计算。如果没有经验,或者没有攻击者,又或是对象自己卖掉的,都不要计算经验值。这里就实现了经验属性的分析,如果还有别的问题,可以在留言里提问。这里提供修改器,可以定制自己的规则。原创 2023-11-14 17:47:45 · 194 阅读 · 0 评论 -
C#开发的OpenRA游戏之世界存在的属性CombatDebugOverlay(3)
比如一个士兵要向这些建筑物开火,怎么样知道他在这个射程范围之内,就是计算他的中心点与这些点的长度是否在武器的射程范围之内,如果在这个范围之内,才能进行射击,不在范围就不能射击。这个类继承接口IRenderAnnotations,这个接口主要用来实现RenderAnnotations(Actor self, WorldRenderer wr)函数,这个函数用来显示炮口、命中区域的标注。这里保存了调可视化的全局变量,因为它是附在world对象,这是一个全局变量,所有地方都可以访问。原创 2023-11-10 12:24:29 · 623 阅读 · 0 评论 -
C#开发的OpenRA游戏之延时初始化Lazy<T> 类
Lazy 是一个类,用于实现延时加载(Lazy Initialization)。延时加载是指对象的创建被推迟,直到第一次被使用时。Lazy 允许你在第一次访问对象时进行初始化,这对于大型或资源密集型对象的性能优化非常有用。你可以通过提供一个委托(Delegate)来延迟初始化对象,Lazy 确保所有线程使用同一个延时加载对象的实例,并且丢弃未使用的实例,从而优化内存使用。原创 2023-11-09 11:36:47 · 298 阅读 · 0 评论 -
C#开发的OpenRA游戏之游戏设计思路
6)许多玩家层次或者全局层次的游戏行为抽象属性,会在玩家和世界的Actor里实现。5)不影响游戏性的东西,或者(越来越多)只是短暂的东西,都被实现为IEffect,而不是真正的Actors。mod游戏定义了一个文件mod.yaml来描述游戏的内容,在那里列出了游戏图片资源(.mix文件),yaml也定义Actor的属性。4)对于更为复杂的界面上发送命令的情况,比如界面上变卖、维修等按钮,采用IOrderGenerator 接口来实现。其它的修改器可以实现移动的速度、受到的伤害、武器火力大小等等。原创 2023-11-09 10:48:06 · 357 阅读 · 0 评论 -
C#开发的OpenRA游戏之世界存在的属性UpdatesPlayerStatistics(2)
从这里可以看到,这个类继承了四个接口,第一个接口INotifyKilled是当对象被杀了的通知;在文件OpenRA\mods\cnc\rules\ defaults.yaml里,可以看到这个配置,它的作用就是让这个单元可以被观察者查看到相关的信息。从上面的内容来看,UpdatesPlayerStatistics属性就是用来配合进行统计使用的,每一个物品拥有这个属性,就可以被统计。在这里主要就是更新玩家统计数据的值,这个变量才是关键,它保存了大量统计信息在这里。这个用来计算对象删除的统计。原创 2023-11-08 17:31:55 · 248 阅读 · 0 评论 -
C#开发的OpenRA游戏之世界存在的属性(1)
这里先调用基类的创建函数,然后调用TraitsImplementing函数创建这个颜色变换器,主要是创建RadarColorFromTerrain类,实现不同物品根据地图类型定义来显示不一样的颜色。在游戏里,由于存在雷达,那么每个物品就可以在雷达上显示出来,但是雷达上显示不同的部分物品时,会采用不同的颜色来显示,那么它又是怎么样实现这种不同物品进行不同的颜色显示呢?判断是否使用转换器来查看物品的颜色,如果是地图上的树,就需要通过地图类型来查找对应显示的颜色。原创 2023-11-08 10:17:56 · 207 阅读 · 0 评论 -
C#开发的OpenRA游戏之生命值
caimouse写于深圳 2023.11.6。原创 2023-11-06 18:40:07 · 367 阅读 · 0 评论 -
C#接口多继承的写法
INotifyCreated.Created和INotifyOwnerChanged.OnOwnerChanged就是两个不同接口,这种情况下,由于接口众多,那么出现接口函数命名重复的机率就会增多,导致编译不通过。这时就需要改写接口时,把接口名字也要写上去。由于接口继承比较多,那么在写代码的时候要注意什么呢?在这里看到这个类,它总共继承了5个接口。在函数的前面都写上了接口的名称。原创 2023-11-06 17:47:00 · 285 阅读 · 0 评论 -
C#开发的OpenRA游戏之步兵射击(2)
但是在定义M16的值是1000,经过计算之后是300,说明这里还跟攻击的目标类型有关系。第一个参数victim是攻击的目标,第二个参数firedBy是发起攻击的对象,第三个参数shape是HitShape对象,第四个参数args是弹头参数。类Bullet也是由它的信息类BulletInfo来创建的。武器装备信息类定义了武器的种类,也就是定义了WeaponInfo类,在这里定义的武器为M16,那么M16的信息又来源于哪里?到这里就完成了整个子弹创建,并且进行攻击,计算攻击结果,最后把伤害落到攻击目标上。原创 2023-11-03 12:11:36 · 272 阅读 · 0 评论 -
C#开发的OpenRA游戏之步兵射击(1)
前面已经分析了步兵训练的过程,知道步兵是怎么样训练出来的,有了步兵之后,就是控制一群步兵去攻击对方了,那么这个攻击的过程又是怎么样实现的呢?这里判断target是否有效的攻击对象,比如地图的上的石头,就不能攻击它,target在这里是表示正攻击对方的电厂,所以判断是有效的。这个传入第一个参数self是士兵对象,第二个参数facing是Mobile对象,第三个参数target是攻击对象,在例子里是对方的电厂。这个排序的字典类,第一个元素是物品的ID,第二个元素是物品本身,比如步兵对象。原创 2023-11-02 19:29:03 · 246 阅读 · 0 评论 -
C#开发的OpenRA游戏之步兵训练
前面已经分析过建造物品的窗口,在这里步兵训练也是一样的过程,不过还是有一点区别,那就是步兵会自己走去,而建造的物品是不会自己行动的。训练一个普通步兵是需要花费100金币,训练的要求是有兵营,移动的速度为54,生命值为5000,配备武器为M16。训练一个步兵也是从右边的面板点击一下对应的兵种,就可以进行训练,前面的响应过程与建造物品是一样的,这里只来分析后面阶段。其它步兵也是这样定义,主要差别是花费不一样,武器不一样,作用也不一样。是表示兵营对象,在NOD里表示是HAND,在GDI里表示是PYLE;原创 2023-11-01 12:26:18 · 226 阅读 · 0 评论 -
C#开发的OpenRA游戏之选择建筑物显示状态信息
actor是表示当前建筑物,decorationBounds是表示建筑物所在的位置大小,displayHealth是表示是否显示健康状态,displayExtra是表示是否显示额外状态,一般是生产进度状态。计算健康进度条所在位置,如果当前值health.HP只剩下80%,那么health.HP / health.MaxHP计算出来的值就是80%,z的值返回就是从start到end的80%。在这个显示的主要函数里,先判断建筑物是否在本世界里,是否销毁,如果不符合就会继续进行绘制。原创 2023-10-31 11:15:22 · 186 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(6)
前面已经分析怎么样找到最近并且采矿车数量不超过设定值的精炼工厂,但是没有分析怎么样移动过去,也没有分析怎么样显示采矿车进行倒矿的过程,目前就来分析相关的代码,这样对于整个游戏的实现就会更加清晰,修改起来也会得心应手。先判断是否找到合适的精炼工厂,如果没有找到,就创建一个等待对象,过一段时间再去查找精炼工厂,如果找到了就会执行后面的代码,也就是移动采矿车到精炼工厂的过程。在这里就会调用采矿车的TickUnload函数,在这里就会执行采矿车倒出矿产的过程,并且进行金币增加。当然这里采用的算法也是A*寻路算法。原创 2023-10-28 16:11:25 · 363 阅读 · 0 评论 -
C#开发的ToLookup接口
Enumerable.ToLookup 方法是为了从 IEnumerable 生成一个泛型 Lookup。这是为了提高搜索的速度,因为它是建立一个类似字典的数据结构,但与字典又有区别,主要是它的值可以多个元素。Lookup又有什么用呢?在这个例子里,先采用select来生成一个集合,这样根据键就可以快速找到对应的所有对象。原创 2023-10-28 12:37:35 · 342 阅读 · 0 评论 -
C#开发的IEnumerable接口
接着下来,我们来学习一个更加复杂一点的例子,比如想把整个文件当作一个迭代器来访问,可以使用更加复杂的LINQ查询,这样就需要给读取文件加入IEnumerable 接口,并且采用这种方式可以减少内存的占用,假如你有一个10G的文件,全部加载到内存是不太好吧,所以需要采用这种迭代的方式进行读取了。先要声明一个类StreamReaderEnumerator,这个类实现打开文件,并且实现IEnumerable 接口的函数,这样才能迭代访问。下面这个属性变量,获取当前一行内容,并且进行判断。原创 2023-10-26 10:23:46 · 227 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(5)
玩家当然希望采矿车找到最近的精炼工厂,这样提高采矿的速度,也就增加了金钱的来源,也是打赢游戏的关键之一。到这里已经知道它是怎么样接受采矿计数,并且计数到达采矿车的容量时,就会寻找送到最近的精炼工厂。这里通过对字典contents的值进行统计,就是利用函数Sum进行求和,这样计算到所有接受矿产资源的数量,当等于运载的最大数量时,就会判断已经装满。它是实现判断采矿车是否采满矿,如果满了就会进入处理,准备把矿产运送到精炼工厂,而实此相关的功能是通过类DeliverResources来实现的。原创 2023-10-24 18:30:51 · 365 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(4)
在这行代码里,就会创建一个收割资源的类HarvestResource,放到前面FindAndDeliverResources的子对象里,而FindAndDeliverResources会先运行所有的子对象,再运行自己的功能处理。前面已经分析怎么样找到资源收割的位置,接着下来就是怎么样移动到资源的坐标,以及怎么样进行收割资源。第一步先要调用claimLayer来声明采矿车已经占用这个资源,资源位置为targetCell,这样别的采矿车再想采集这个就不会成功了。这段代码是判断采矿车是否可以收割这种类型的资源。原创 2023-10-23 11:36:07 · 258 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(3)
前面已经说到通过类FindAndDeliverResources来实现找到矿场,以及最近的精炼工厂,这样采矿车才能源源不断地从矿场采集大量的资源,运往工厂,才能换回来大量的金钱,这样才能维持整个游戏的开销。先要从类Harvester里分析开始,这个类我们知道它就是管理采矿车,采矿车是一个智能体,它是可以移动的,所以由它负责寻找它的采矿位置和精炼工厂位置。这段代码处理是否玩家自定的采矿位置,如果玩家控制了采矿车指定的位置,那么就会优先处理这种情况,只作简单判断一下是否可以开采即可。原创 2023-10-18 18:57:12 · 348 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(2)
先定义了Actor的名称,接着用SpawnOffset来描述这个物品与建筑物左上角坐标的相对位置,这个位置是描述物品的出生地点,在这里就是说明采矿车在建成精炼工厂后所在位置。FreeActor就是标记为免费的物品,在这里是一台采矿车,因为它的名称是HARV,而这个名称在前面我们已经看到过它的定义,如果你已经忘记了,就返回前面的文章来查看一下。同理,我们也可以通过属性定义规则,就可以找到类HarvesterInfo,这个类定义采矿车的相关属性,并且设置了缺省值,最后可以调用创建接口。原创 2023-10-17 10:58:39 · 250 阅读 · 0 评论 -
C#开发的OpenRA游戏之金钱系统(1)
在OpenRA里,就是使用矿产资源。所以在地图上分布几个矿场,玩家就需要相互争夺矿场,谁开采多谁就更有钱,谁有钱了就可以升级更好的科技,以及造更好的战车,造更多的战士。游戏里要获得金钱,就是通过采矿来实现的,这时候需要一个精炼工厂(Tiberium Refinery),建造一个这样的工厂,就会附带有一辆采矿车,采矿车就会自动找到最近的矿场进行采矿。从上面要求来看,建造一个精炼工厂需要花1500金币,它的生命值比较大,有10万这么多,变卖出去的价值是400金币,电力消耗为40点。原创 2023-10-13 12:06:57 · 364 阅读 · 0 评论 -
C#开发的OpenRA游戏之电力系统之二
在这里主要使用字段Amount来保存电力消耗或产生的数量,这个值就是从yaml文件里加载,而yaml文件是从地图编辑器里产生的,也就是有游戏设计者来修改这个值,这样就可以产生不同难度的游戏环境。继续前面的电力系统分析,在OpenRA游戏里,每一个建筑物都会有一个电力描述字段,说明这个建筑物是消耗电力,还是产生电力的。如果这个建筑物是产生电力的,那么这个字段就会是正值,如果这个建筑物是消耗电力的,就会是负值。第二种是电力过低状态,当电力提供大于电力消耗一半时,就是这个状态;从上面函数就得到提供电力的总数量。原创 2023-10-09 10:53:35 · 253 阅读 · 0 评论 -
C#开发的OpenRA游戏之电力系统之一
定义了POWERBAR_PANEL的容器,然后这个容器窗口是使用IngamePowerBarLogic类来进行逻辑处理,在容器上再定义一个窗口ResourceBar@POWERBAR来显示电力字符串,以及定义一个图像窗口Image@POWERBAR_PANEL来显示电力数量的指示。在Label显示时,就会调用上面的类构造函数进行设置,这样就可以绑定显示电力的字符串power.GetText,显示颜色是power.GetColor,显示提示字符串是power.GetTooltipText。原创 2023-10-05 12:58:35 · 1123 阅读 · 0 评论 -
C#开发的OpenRA游戏之雷达地图
这段代码,主要设置RADAR_FADETOBLACK窗口,当雷达将要关闭时候,就需要一个动画,慢慢地把雷达窗口关闭到黑色,即是什么也看不见。如果雷达在上一次没有打开,这一次打开,就会播放Up的声音,否则会播放Down的声音。通过定义可知,这里雷达逻辑处理是类IngameRadarDisplayLogic,窗口显示处理是Radar@RADAR_MINIMAP,也即是类RadarWidget窗口实现雷达内容显示。从雷达地图来看,可以清楚地看到全局的动态,自己的兵力分布,还有自己的建筑分布,矿产分布等等。原创 2023-09-26 12:13:39 · 453 阅读 · 0 评论 -
C#开发的OpenRA游戏之调试菜单2
先从窗口上获取DISABLE_VISIBILITY_CHECKS的CheckBox控件,这个控件是控制是否允许雾存在,如果把这个选项勾选上,就会导致整个地图所有物品都可以看到,知道敌人的建筑物,以及矿场所在的地方。这个按钮的名称叫做SHOW_UNIT_PATHS,也是一个CheckBox,它是用来控制是否显示移动物品的路径,用来调试寻路算法,这样把整个路径进行可视化,就可以很容易看出来寻路算法是否出问题。这段码是查找BUILD_ANYWHERE,主要作用是不限制建造物品的位置,这样可以在任意地方建造物品。原创 2023-09-15 18:39:58 · 833 阅读 · 0 评论 -
C#开发的OpenRA游戏之调试菜单1
从上面定义可以看到选项的内容,它的第一个是标识ID,第二个是名称,第三个是描述,第四个是选项值,第五项是默认值,第六项是是否锁住,第七项是是否可见,第八项是显示顺序。在开发一个游戏里,经常需要提供一些调试设置,以便快速地达到需要测试的阶段,否则按正常游戏的进程,就会需要比较久的时间,这样浪费开发人员的时间。这个菜单叫做 Debug Menu,当玩家点击之后,它就会产生一个命令,这个命令发送出去,然后再解释这个命令,就可以在游戏里打开调试模式。添加到游戏启动参数里,这样游戏就会打开调试内容的界面了。原创 2023-09-12 11:19:03 · 468 阅读 · 0 评论 -
C#开发的OpenRA游戏之系统参数选项按钮
这段代码是设置选项按钮按下时的操作响应,主要就是打开选项窗口,就是前面显示的窗口,这个窗口是通过调用函数,在这里要注意它的参数,initialPanel是表示要初始化,IngameInfoPanel.AutoSelect是表示自动选择显示内容。在这里定义了可以显示参数TAB页,从上面的图片显示,可以看到它只是显示OBJECTIVES_PANEL和MAP_PANEL窗口。从上图可以看到弹出选项的界面,第一个是用来设置游戏的目标和查看游戏玩家,第二个是游戏一些设置,比如游戏刚开始时应该发放多少金币等等。原创 2023-09-07 17:32:11 · 662 阅读 · 0 评论 -
C#开发的OpenRA游戏之信标按钮
前面已经分析了两个按钮:变卖和维修,接着下来就是分析信标按钮,这个按钮使用是比较少,但是对于多人游戏时,使用这个信号就很方便同盟军过来查看和帮助了,相当于一个朋友之间共同查看的地址。当你经过同盟标记的标志时,就会听到beacon detected,检测到信标,这就是你的盟友设置的地图导航标记,听到声音后按空格键就能跳到相应的位置。通常会在开局的时候,就在自己主基地设置信标,让盟友知道自己的位置。更高级的玩法,就是提示盟友进攻的位置或者敌方的薄弱环节等等,总之这个功能就是为了方便配合,以便大家共同对付敌人。原创 2023-09-05 10:34:51 · 963 阅读 · 0 评论 -
C#开发的OpenRA游戏之维修按钮
跟前面的分析一样,同样是使用OrderButtonsChromeUtils.BindOrderButton来绑定按钮的处理,使用RepairOrderGenerator来创建修理的命令,RepairOrderGenerator类里需要判断什么情况下可以产生修理命令,什么情况不产生。前面分析物品的变卖按钮,如果理解这个流程,再看其它按钮的流程,其实是一样的,所以前面的文章是关键,只有理解通透的基础之上,才能继续往下。也即是下图的扳手图标的按钮。可见修理的按钮,跟前面变卖的按钮是一样的处理过程。原创 2023-07-14 11:07:07 · 1035 阅读 · 1 评论 -
C#开发的OpenRA游戏之变卖按钮
也就是调用上面的函数ResolveOrder(Actor self, Order order),在这里判断是否是Sell的命令,如果是就会执行Sell函数,在这个函数里会创建一个类Sell的对象来执行。所以当玩家点击按钮时,就会执行这个函数的代码,然后在里面就会判断一下,如果是第一次点击,就会创建对应的类T,在这里是变卖命令,如果是第二次点击就会变成取消。第二个是维修的按钮;到这里就把变卖物品的过程分析完成了,从右边的变卖按钮点击,再到命令发送到服务器,再接收回到物品的响应,然后收到金币到账户。原创 2023-07-14 09:07:02 · 701 阅读 · 0 评论 -
C#开发的OpenRA游戏之建造物品的窗口11
这样就会执行到PlaceBuildingOrderGenerator对象的Order函数,把在地图上点击的事件放到类PlaceBuildingOrderGenerator对象里面处理了。这个命令最后会通过world.IssueOrder(o)函数发送给服务器,再从服务器返回来,然后才能创建相应的建筑物。前面分析了预览物品放置的过程,接着下来就是当物品放到合适的位置,玩家就会点击一下左键,这时物品就在这个位置上建造起来。在这里先判断鼠标是否有按键按下,如果有按键按下才会执行内部的命令函数。原创 2023-07-12 10:11:34 · 657 阅读 · 0 评论