- 博客(2796)
- 资源 (44)
- 收藏
- 关注

原创 爬虫日记(1):为什么需要爬虫
随着时代的发展,从远古时代的刀耕火种迅速地进入现代的信息时代,既然称为信息时代,显然信息才是关键的东西,才是唯一最有价值的东西。好像说一个原子里,原子核不重要了,重要的是原子核外面的电子。因为电子可以自由地移动,而原子核一直留在原来的地方,除非通过物流系统才能移动。自从发现电子可以自由地移动,人们就慢慢地通过电子来传送信息。最开始发明的是电报,电报能传送的东西很简单,就是长和短,而通过长和短的组合来构造信息的基石,再从长和短中还原信息出来。在这段时间里,电报是通信的方式,但是它的爬虫并不缺少,那就是第三方破
2021-03-03 17:42:51
1272
4

原创 深入浅出matplotlib(1):为什么要使用matplotlib
第一次工业革命是蒸汽时代,第二次工业革命是电气时代,第三次工业革命是信息时代,马上要迎来第四次工业革命—智能时代。我们知道整个世界主要有三大元素组成:物质、能源和智慧。前两次的工业革命都是则重于物质和能源的进步,后两次的工业革命却是智慧的进步。在信息化时代,已经把世界改造得天翻地覆,那么随着智能时代的到来,将是现在无法想像的。比如所有汽车都具有自动驾驶之后,会不会汽车就是一种机器人的化身?这时马路上所有汽车都是能相互说话,相互配合,像一群蜜蜂一样相互配合之后,做出来的成就远远超出一个蜜蜂的能力。如果汽车真的
2020-11-07 18:51:59
1227
2
原创 C#开发的OpenRA游戏之基地工程车移动11
到这里,就把游戏对象移动的代码分析完成了,我们理解从界面上点击鼠标,再发送命令到服务器,再从服务器收到命令,然后再进行A*的寻路算法找到路径,最后根据路径一步一步地执行移动的动作。可见在游戏里游戏对象的移动是一个复杂的操作,这里需要花费更多的时间来理解,因为这是游戏的基本功能,缺少了游戏对象的移动是不可能开发出这样的游戏。这段代码是获取路径中将要运行的下一步,PopPath函数将会返回路径列表里最后的一项,如果返回的是空元素,说明没有可移动的位置。这段代码判断是否取消执行移动,如果取消了就删除移动的路径。
2023-06-06 18:25:45
207
1
原创 C#开发的OpenRA游戏之基地工程车移动10
这个函数定义了双向搜索路径的功能,第一个参数fromSrc是一个搜索路径对象,就是PathSearch类对象,第二个参数fromDest也是一个搜索路径对象,也是PathSearch类对象。这一段是从起点搜索到目标的路径,所以从相遇点开始回溯到起点,就是一个倒序的过程,跟前面路径是一个方向,所以直接添加队列里就可以了。这个函数输入三个参数,第一个参数a是从终点到起点的路径搜索,第二个参数b是从起点到终点的路径搜索,第三个参数是相遇到的位置坐标。如果两个搜索相遇,那么整个路径就搜索通了。
2023-06-05 10:17:28
134
原创 C#开发的OpenRA游戏之基地工程车移动9
因为当这个节点已经关闭,说明所有节点已经遍历完成了,不过要注意的是,这里代码采用双向搜索的方法,同时构造两个A*对象,一个从起点搜索到终点,一个从终点搜索到起点,这两个对象是单独进行搜索的。函数参数传入的就是起点位置,然后计算这点的启发函数值,保存在cost里,接着保存当前位置的信息,主要有当前节点状态,默认是开放状态CellStatus.Open,然后就是移动到达该点的移动成本、到达目标位置的估值成本。a. 遍历 open list ,查找 F 值最小的节点,把它作为当前要处理的节点。
2023-06-02 17:51:15
268
原创 C#开发的OpenRA游戏之基地工程车移动8
cellCost相当于D,straight相当于(dx + dy), diagonalCellCost相当于D2,diag相当于min(dx, dy)。这样简单地就实现了A*算法的启发函数,如果你想修改这个函数进行不同的试验,就可以修改这里的代码,然后在游戏里查看游戏对象的移动轨迹是否更加合理。对于这段代码的理解,就会比较困难了。建议你先进行阅读,后面我们再来分析A*算法的代码实现。这行代码,就是上面的公式,不过增加了一个百分比计算,可以通过游戏里设置。这行代码计算当前位置离目的地的直线距离。
2023-05-31 17:55:20
615
原创 游戏中的A*算法使用python实现
但是要理解这样的算法,还是需要有一个简单的例子代码来不断地操作,不断地变换参数,才能更加深入地了解它的过程。游戏中的算法少不了大明明鼎鼎A*算法,算法的过程如上所述。
2023-05-31 17:21:24
36
原创 C#开发的OpenRA游戏之基地工程车移动7
当A*算法计算f(n)=g(n)+h(n)时,距离的平方将远高于成本g函数,并且最终会得出过高的启发函数结果。或者,在游戏地图的安全区域拥有最短的路径并不那么重要,但当偷偷经过敌人防守的村庄时,安全和快速是至关重要的。3)如果h(n)函数等于从n移动到目标的成本,那么A*查找一条好的路径,不会搜索更多节点,速度比较快。这时使用曼哈顿距离表示,那就会有8XD种情况,但是我们可以进行简化,只需要四种情况代替,那么启发函数只要有一项 4XD2就可以了,这里的D2是对角线移动的成本。
2023-05-31 16:53:19
784
原创 C#开发的OpenRA游戏之基地工程车移动6
然而,A*是建立在启发式之上的,尽管启发式本身不能保证最短的路径,但A*算法可以保证最短的路径。在这段代码的注释里,可以看到一个网络连接,我们打开这个网络地址,就可以看到这个算法的介绍,因此我们先来把这个网址上的内容进行查看和翻译,然后再回过头来分析相关代码实现。如果游戏里的游戏对象位置经常发生改变,那么先搜索大面积区域就变得不合算了,因为每次搜索很长时间之后得到的路径,由于地图上物品又发生了改变,导致计算的路径失效了。在游戏地图里,我们可以认为地图的一个格子为一个顶点,而相邻格子之间的连接为一条边,
2023-05-29 12:33:17
597
原创 C#开发的OpenRA游戏之基地工程车移动5
前面已经分析到寻路算法,这个是RPG游戏的必经之路,因为角色的移动都是根据鼠标点击来实现,而点击的鼠标位置就是角色将要到达的目标位置。主要通过此函数来查找路径,输入参数world是游戏世界对象,locomotor是动力系统,self是当前将要移动的游戏对象,from是游戏对象出发的坐标,target是游戏对象终点的坐标,check是之前分析的4种遍历条件。先来看一下PathSearch类的构造函数,它需要传入一个IGraph<CellInfo>的对象,这是一个保存路径查找过程中的信息。
2023-05-27 11:53:18
745
原创 C#开发的OpenRA游戏之基地工程车移动4
在这里使用前面变量evaluateNearestMovableCell,它表示是计算目标位置邻近可以移动到的位置,由于地图上有山地,如果点击的位置是不能到达的,就会计算目标位置最近可移动到的位置。比如一个建筑物围起来的地图,你往中间一点,车是可以往移动过去的,但是周围有阻挡,就让车进不去了,这时候就需要计算目标位置邻近最可能到达的位置。从前面可知,基地工程车移动的过程,就是一个寻路的过程,由于路径上时时刻刻发生变化,比如将要移动的位置,突然建起了一个建筑物,那么这个车是不能从这个地方通过的。
2023-05-26 12:01:19
694
原创 C#开发的OpenRA游戏之基地工程车移动3
主要向这个函数设置游戏对象当前位置,将要移动到目标的位置,以及忽略的对象,以及游戏对象周边物品的状态,比如是否可以移动、是否固定等等。在这里先判断移动是否有额外的操作,moveWrappers是一个IWrapMove接口的数组,在这里由于它为空,所以没有处理,直接调用后面return inner,所以本函数没有起作用。从前面可以知道,基地工程车移动的过程是鼠标点击,然后查找对象的命令,接着把命令发送给服务器,服务器再收到命令,最后把命令放到当前活动执行队列。这行代码是保存游戏对象将要移动到的目标位置。
2023-05-26 08:51:42
633
原创 C#里使用关键字做临时变量的方法
/ 如果不加 @,编译会提示无法识别的转义序列。// 如果不加 @,编译会提示无法识别的转义序列。1. 加在字符串前面,字符串中的 \ 失去转义符的作用,直接写字符串而不需要考虑转义字符。在这里发现使用一个变量它是关键字from,它是LINQ的一个关键字,2. 加在字符串前面,字符串中的 " 要用 "" 表示。所以不能直接声明使用,需要在它前面使用@的定义,// 如果不加 @,可以写成如下。// 如果不加 @,可以写成如下。// 不加 @,可以写成。// 不加 @,可以写成。就可以采用下面的方法。
2023-05-26 08:22:30
894
原创 一个比较C# 1.0版本与C# 3.0版本的代码区别
这样需要开发人员熟悉它的过程,而熟悉它的过程,就需要不断地编写代码,并且注意比较两者之间的差别,就会体会到代码为什么这样写,这样设计,就会更好地理解代码的功能。不过刚看到C# 3.0代码,就会发现代码是短了,但是看起来难度增加了,因为它省略太多东西,在之前C# 1.0版本代码,看起来是比较符合旧式编程习惯,看起来比较顺眼,这个例子比较简单,就是一个产品有名称和价格两个属性,然后对于它进行抽象。但是代码的长度就有点多了,
2023-05-24 10:12:02
29
原创 C#开发的OpenRA游戏之基地工程车移动2
通过命令里的对象,就会找到基地工程车,与前面查找部署命令是一样的。基地工程车的表示是使用类Actor来表示的,所以执行移动的命令又回到Actor类。在这里看到self.QueueActivity就比较熟悉了,前面部署的动作也是放到这个队列,所以执行动作跟前面是一样的。从上面看到order.OrderString时,当它等于Move时,就是表示移动命令。下次再来分析类WrapMove的功能,以便分析寻路功能的代码。
2023-05-22 21:49:37
370
原创 C#开发的OpenRA游戏之基地工程车移动1
前面分析了基地工程车的变形后进行部署的功能,现在接着下来分析基地工程车是怎么样进行移动的,因为游戏里的很多对象都是可以进行移动的,由于移动就涉及到寻路的问题,而寻路又是一种比较复杂的算法,但是移动还是游戏里最基本的功能。在这个函数里调用OrderForUnit根据当前位置情况来生成合适的命令,在这里由于当前是选中基地工程车,并且由于目标位置只是地图,没有别的物品,所以根据基地工程车所有命令列表,遍历一轮就可以得到移动命令。由上可见,这个移动命令的对象Actor是mcv 90,当前命令是move命令。
2023-05-21 12:33:47
497
原创 C#开发的OpenRA游戏之基地工程车变基地过程3
到此,我们明白了基地工程车变形基地,或者基地变形基地工程车的过程,都是通过yaml定义来描述,并且在游戏初始化时就全部加载这些定义,当需要的时候再从游戏对象缓存里取出来放到游戏世界里,就可以使用了。由于程序里是不可能直接写死这样的变换过程,因为它是可以适应多种游戏模型,如果代码写死了就难以改变,所以肯定是在配置文件里定义的。这个基地的定义,如果你在文件vehicles.yaml里查找,是找不到的,因为这里是车的定义。上面这段就是基地工程车的定义,看来属性很多,如果不了解它,还是无从下手。
2023-05-18 19:59:15
376
原创 C#开发的OpenRA游戏之基地工程车变基地过程2
通过前面一大堆的准备,终于可以把基地工程车变形基地的参数值准备好了,这样就来到了创建基地对象的环节,这里调用CreateActor函数,ToActor是将要变成物品的对象,init是前面准备的初始化参数。这两行代码是保存当前物品的选中状态和包含状态,以便变形后创建新的物品,也需要让它维持这个选中状态,这样达到变形之前与变形之后操作动作一致性,不需要让玩家再操作一次选中,无疑是上乘的思想。如果基地工程车受到别人的攻击,已经损伤了,变形基地之后也不能再拥有100%的健康值。
2023-05-17 12:38:02
286
原创 C#开发的OpenRA游戏之基地工程车变基地过程
在这里主要调用游戏行为对象的TickOuter函数,这个函数就会执行行为的过程操作,在这里是基地工程车变换行为。前面已经分析过基地工程车收到部署命令,然后就创建一个类Transform来表示变换的过程,并且这个类是继承Activity,这个类是表示一个行为的类。里创建这个变换类,从而得到类Transform对象,得到这个对象之后,就会在游戏界面执行类Transform对象。这个时候并不会执行这个对象,它是等到游戏世界的Tick()函数运行时,才会运行这个对象的变换动作行为。
2023-05-16 21:38:37
348
原创 C#开发的OpenRA游戏之基地工程车执行部署命令
Transform类是继承类Activity,类Activity是抽象游戏对象的动作行为,因此有很多动作行为都是定义在OpenRA.Mods.Common/Activities里。在上面函数里,先判断是否不能执行部署命令,如果是不能执行,就播放一下不能操作的声音,就返回了。可见,网络游戏里的对象操作,都是通过网络发送给服务器,再从服务器返回消息来执行对象的动作,通过命令对象进行遍历,最终会在比较部署命令的类里相同,从而执行部署命令。而不是直接执行游戏对象的动作,这与本地游戏是有区别的。
2023-05-15 18:32:13
495
原创 C#开发的OpenRA游戏之网络接收后找到游戏对象
而这个队列是在创建这个游戏对象时组件,因为一个游戏对象有很多特性,当发现创建游戏对象时有IResolveOrder继承接口的对象,就添加到这个数组。在这里先检查一下命令是否有效的,接着就调用命令的执行对象,即是游戏对象来执行这个命令了。order.Subject就是上面解释游戏对象ID,并从游戏世界里找到的游戏对象,再从各个字段里找到对应的信息,再把这个动作交给游戏世界里的对象执行。从前面分析可知,要找到游戏世界里的对象,就需要游戏对象的ID,因此, 我们来分析游戏对象的ResolveOrder函数。
2023-05-15 15:48:18
549
原创 Windows磁盘空间不够,发现DriverStore文件夹特别大
显示为红色了,这样不能安装。只好找一下C盘的空间为什么不足了,后来发现有一个目录特别大,这个目录就是DriverStore文件夹。终于找到一个方法,就是采用命令行的方式,然后执行这几条命令之后,发现磁盘瞬间少了占用了10几G空间。对于以前的电脑来说,这么大的空间是非常可观的,基本上就可以安装一个VS2022的空间了。正想安装一个新的VS2022,但是发现C盘的空间已经不足,发现了这一个有价值的目标之后,就想各种办法,以及进行度娘。这么好用的方法,一定要告诉大家的,避免磁盘空间不足的问题。
2023-05-14 12:36:20
323
原创 C#开发的OpenRA游戏之部署基地工程车命令接收
在这个函数里,调用ProcessOrders()函数来处理命令,它就会从之前介绍pendingOrders字典里获取所有玩家的命令队列。从上面代码就可以看到,发送的时候,会放队列sentOrders.Enqueue((frame, o))保存一份,那就是本地发送给服务器的命令数据,先在本地缓存一份,这样服务器就不用把命令再从服务器发送完整的数据回来了,因为游戏里有多个玩家,每个玩家的命令队列是分离的,这样每个玩家都有命令队列。但是也还有优化的空间,比如发送给服务器的命令可以是很长的数据结构,
2023-05-12 17:37:41
479
原创 C#开发的OpenRA游戏之服务器数据接收
OpenRA.Network.NetworkConnection.OpenRA.Network.IConnection.Receive(OpenRA.Network.OrderManager orderManager) 调用网络接收对象,从队列里出列数据。ConcurrentQueue队列是一个高效的线程安全的队列,是Net Framework 4.0,System.Collections.Concurrent命名空间下的一个数据结构。
2023-05-12 10:23:08
325
原创 C#开发的OpenRA游戏之部署命令发送给服务器的流程
在函数SendOrders()再调用Connection.Send(NetFrameNumber, localOrders),就可以把命令放到连接里打包。OrderPacket(orders.ToArray())实现对一个命令打包过程,也就是序列化过程,这样所有命令内容就变成一个byte数组,localImmediateOrders队列的命令是立即进行发送,而localOrders命令是按顺序发送。OpenRA游戏里,前面已经分析怎么样产生部署命令,以及部署命令又是怎么样打包,
2023-05-11 16:33:21
322
原创 Winforms不可见组件开发
那我们又如何来开发一个Component呢?其实很简单,只要我们把一个类从System.ComponentModel.Component(下面简写Component)继承下来即可。2、Component是贴在容器Container上的,而Control则是贴在Windows Form或者Web Form上的。把 ClassLibrary4.dll文件拖动红色的地址,这样上面的组件就可以在这个工程里使用了。这些属性,就是在类库代码里的设置,有一些可见,并能设置,有一些只能可见不能设置,有一些不可见。
2023-05-11 14:01:36
366
原创 C#开发的OpenRA游戏之网络协议打包和解包
既然要使用到打包和解包,在这里使用MemoryStream、BinaryWriter和BinaryReader来实现整个打包和解包的过程。服务器再发送给所有玩家,那么就在所有玩家的游戏里创建了基地,这样整个游戏世界就同步起来了。有这三个类的基础,再来看OpenRA里的打包和解包类Order, 就会变得异常轻松了。OpenRA游戏里,由于这是一个网络游戏,那么与服务器通讯就缺少不了,既然要通讯,那么就需要协议,有协议就需要对数据进行打包和解包,游戏里很多命令都需要发送给服务器,以便服务器同步给其它玩家,
2023-05-10 17:58:21
550
1
原创 C#开发的OpenRA游戏之网络客户端连接
如果不成功就不用添加。另外,如果有一些连接已经提前添加到队列,并且调用CompleteAdding函数,那么后来才连接到服务器的连接,就会导出抛出异常,不能再添加到队列。从而实现对多个成功连接的服务器,但是只有最快连接成功的添加到队列头,也就实现了对最空闲的服务器进行选择。比如它实现多线程连接多个服务器,只要任何一个连接成功,就可以断掉其它服务器的连接。这是值得我们学习的地方,如果你的软件也有这方面的需求,就可以立即使用这些代码,由于游戏的服务器一般有多个服务器,因为游戏服务器需要连接太多游戏客户端了,
2023-05-10 14:54:05
615
原创 C#开发的OpenRA游戏之基地工程车部署命令产生过程
紧接着就是调用最为重要的命令生成函数orders = world.OrderGenerator.Order(world, cell, worldPixel, mi).ToArray()。在这个函数里,先获取鼠标所在的格子,也即是调用cell = worldRenderer.Viewport.ViewToWorld(mi.Location)。接着world.ActorMap.GetActorsAt(cell).ToList()运行找到格子里所有物品,在这里也是基地工程车,没有别的物品。
2023-05-09 14:34:39
397
原创 C#开发的OpenRA游戏选中物品后鼠标移动产生消息的过程
最后调用World.OrderGenerator.GetCursor(World, cell, worldPixel, mi),这是游戏世界里处理命令生成的。world.ActorMap.GetActorsAt(cell)是从当前格子里获取所有物品,这个范围获取到的物品就比鼠标上一点获取范围就大很多了。就会不断地调用窗口光标处理函数OpenRA.Widgets.Widget.GetCursorOuter(OpenRA.int2 pos),因此鼠标的移动,就需要不断监视,在这里就来分析一下,
2023-05-09 11:42:41
768
原创 C#开发的OpenRA游戏使用SelectMany语句查询
将序列的每个元素投影到 IEnumerable,并将结果序列合并为一个序列,并对其中每个元素调用结果选择器函数。所以在这里需要注意两级函数的转换关系,才能理解SelectMany语句,这样就可以把第一级函数当作第一次循环,第二级函数当作第二个循环了。将序列的每个元素投影到 IEnumerable,并将结果序列合并为一个序列,并对其中每个元素调用结果选择器函数。因此要搞懂OpenRA的代码,就必先搞懂LINQ的语句,而LINQ语句里最难搞懂的就是SelectMany语句。才能明白代码的意思。
2023-05-08 18:04:02
432
原创 C#开发的OpenRA游戏使用匿名类
匿名类型提供了一种方便的方法,可用来将一组只读属性封装到单个对象中,而无需首先显式定义一个类型。类型名由编译器生成,并且不能在源代码级使用。每个属性的类型由编译器推断。匿名类型通常用在查询表达式的 select 子句中,以便返回源序列中每个对象的属性子集。在这里使用匿名类new { Trait = trait, Order = x },这个类没有名称,有两个成员,一个是Trait,另一个是Order。可通过使用 new 运算符和对象初始值创建匿名类型。C#开发的OpenRA游戏使用匿名类。
2023-05-08 11:41:43
460
原创 C#开发的OpenRA游戏的游戏界面内鼠标处理窗口
在代码的最后,就是调用worldRenderer.World.Selection.SetRollover(rollover)来设置所有选中的物品,改变颜色,以便区分不同的组合选中方式,所以需要设置一种颜色,普通选中框使用的颜色是normalSelectionColor。如果可以选中,那么就执行整个屏幕里所有相同的种类的物品进行全部选中,这样可以快速选中同一兵种,执行相同的操作。这里判断是否是有效的拖动,首先拖动的标志有效,并且拖动的距离大于设置选择的距离,避免误操作,因为鼠标按下时,
2023-05-05 17:18:26
612
原创 C#开发的OpenRA游戏的鼠标触发基地工程车部署
第六步,渲染游戏一帧结束,因为游戏都是按照一帧一帧来显示的,因为所有游戏玩家都需要与服务器进行同步,在本文将要研究的,就是玩家是怎么样通过鼠标来选中基地工程车,并且触发它转换为基地状态。到这里就完成了基地工程车部署消息响应流程,从上面可以看到,这是一个漫长复杂的调用过程,通过这样的学习,就可以了解OpenRA是怎么样通过鼠标来操控游戏界面里的物品,那么玩家第一件事情,就是触发基地工程车进行部署,这样才能进行下一步游戏,OpenRA游戏里,玩家第一时间,基本上就是先看到基地工程车,
2023-05-04 10:37:48
489
1
原创 C#开发的OpenRA游戏的创建基地工程车
上面的Info.TraitsInConstructOrder()函数,就可以获取到所有类继承TraitInfo的对象列表,当加载地图的时候,就会加载这8个位置的对象,在地图里抽象为类StartingUnitsInfo。在这个类里,关键的一个属性是BaseActor,它是用来描述出生点的物品,在这里是mcv,如果地图是大的,有8个位置,其实只有两个玩家,那么这两个玩家就会随机出现在这8个位置上。从前面知道,每个地图都有出生点,大一点的地图共有8个位置,小一点的地图共有2个位置。
2023-04-28 16:06:53
700
原创 C#开发的OpenRA游戏的加载快捷键
当玩家按下H键时,系统就会把消息传送到这个子窗口,然后查找handlers里的处理函数,从这里看到,快捷键的定义是分成很多文件的,在这个函数,判断是否有选择的对象,如果没有选中的对象,就会让屏幕中间返回到基地。OpenRA游戏里,由于这是一个即时战略游戏,这样的游戏是比较注意时间的节省,在这里就对OpenRA的快捷键进行一个初步的介绍,以便对快捷键的实现进行了解。其实上面这段定义,不但定义了消息处理关系,也定义了消息处理的窗口,因为玩家操作速度越快,各种部署,以及工厂里生产武器的速度就越快,
2023-04-27 14:26:45
532
1
原创 C#开发的OpenRA游戏的加载地图流程
由此可见,地图加载完成之后,才能根据地图里对象类型进行对象创建,因为OpenRA是动态加载类的方式,是根据地图里的数据来找到对应的类来创建对象。在OpenRA里,需要把地图目录:OpenRA\mods\cnc\maps 里所有的文件进行加载,PrepareMap函数就会根据地图里布局数据进行加载所有对象,包含地图里玩家的出生点,接着在游戏开始之前,显示所有地图,让玩家对地图进行选择。这两种不同的布局,对于不同的玩家有很大的影响,有些玩家倾向前期竞争有优势,前者是玩家的定义,后者是地图里所有相关对象总定义。
2023-04-27 10:41:11
726
1
原创 C#开发的OpenRA的游戏用户的添加
在这里把所有玩家信息保存到orderManager.LobbyInfo.Clients里,后面就可以通过这里来获得所有玩家信息到界面显示,并判断是否有效的玩家。这时候客户端里的代码,就会运行这个事件函数,通过foreach来遍历orderManager.LobbyInfo.Slots所有选择的玩家,因此,游戏玩家的加入是一个客户端与服务端同步的问题,多了这个交互过程,就让代码变得有点复杂了。后面客户端就拿到所有玩家的信息,就可以在游戏世界里创建所有玩家表示对象,以更新玩家状态信息。
2023-04-26 13:38:33
385
原创 C#开发的OpenRA的游戏侧边界面
接着服务器就会评估是否符合开始游戏的条件,如果满足了条件,就会向客户端发送一个开始游戏的信息,加载窗口容器到root里,从而可以不断地更新界面,并从界面获取到用户操作的内容。通过这个游戏界面,可以查看游戏状态、执行一些特殊的命令,以及雷达显示,这个游戏界面,就是给玩家提供一个操作平台,因此它的作用是非常强大的,前面已经研究过点击开始游戏之后,就会向服务器发送一个开始游戏的信息,OpenRA游戏开始之后,会在右边提供一个游戏侧边界面,这个信息收到之后,就会加载游戏侧边界面,正常进入游戏。
2023-04-26 08:29:47
396
原创 C#开发的OpenRA的单人游戏点击之后
OpenSkirmishLobbyPanel()函数就是实现显示用户进入游戏房间的界面,在这里可以查看到有多少个玩家,设置每个玩家的属性,同在一个房间里的玩家实现相互竞争。在文件里可以看到这段的描述,然后我们通过按钮的名称:START_GAME_BUTTON,就可以找到这个按钮的处理代码,这样就知道它是在那个源文件里进行控制游戏房间的逻辑。当点击按钮Skirmish之后,就会进入一个界面,然后在这个界面里有两个玩家,一个是用户,一个是NPC。如果选择设置之后,就可以点击开始游戏按钮,进入游戏战斗状态。
2023-04-24 11:22:00
353
书《深度学习》
2017-03-13
国产8051模拟器
2016-09-10
tinyxml2配套源码
2016-06-27
selenium的浏览器驱动
2016-06-14
milang 1.0.5
2014-08-03
svm_hog_data.rar
2020-03-02
实现numpy的C++库扩展
2019-11-24
python web py入门配套源代码
2018-02-23
webpy演示例子1
2018-02-21
胶囊模型的代码
2018-02-02
python抓取天气并分析 实例源码
2017-08-28
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人