自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

大坡3D软件开发

自主操作系统和CPU--用软件和芯片来改变世界

  • 博客(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

WiX3.10版本安装工具

WiX3.10版本安装工具

2017-06-19

GOOGLE的TPU论文

GOOGLE公开TPU的论文

2017-04-06

深度强化学习论文

DQN的论文

2017-03-17

书《深度学习》

2015年,深度学习三大牛Yann LeCun、Yoshua Bengio和Geoffrey Hinton在最新的《Nature》杂志首次合作的发表综述文章《Deep Learning》。本文为该综述文章的中文译文,深入浅出地介绍了深度学习的基本原理,核心优势和未来展望。

2017-03-13

手写识别的训练数据

MNIST训练数据

2017-03-10

俄罗斯方块游戏开发

俄罗斯方块游戏开发培训里的可执行文件,让大家可以查看相关的结果。以便是否参加培训。

2016-11-30

duilib界面库20161116

更新为VC2015编译的duilib,持续重构代码,使用最新的C++14的语法。

2016-11-16

duilib界面库20161017

duilib 界面库

2016-10-17

duilib界面库

duilib界面库,长期维护的界面库,在WIN10和VS2012上编译和开发、测试通过。

2016-10-10

国产8051模拟器

一款国产的8051模拟器(全部源代码) 本软件是一款8051模拟器,他的特点是可以模拟多处理器平台,在简单的多工作区间的界面上可以很方便的模拟8051处理器, 最重要的是这个单片机系统可以完全由你自己订制,你甚至可以随意创建自己的多单片机系统,什么SMP 基于串行总线的分布式系统,集群式系统,只要你能想到的,都可以办到,充分发挥你的想象力。现在1.0版本已经基本体现出了这种思想,在以后的版本中将使这一特性变的 更加强大!

2016-09-10

mysql开发管理工具

mysql数据库的开发管理工具。

2016-07-12

mysql-5.5.50-64

windows下的64位MYSQL的版本。

2016-07-10

python-3.4.4

python 3.4的32位的windows版本

2016-07-01

tinyxml2配套源码

在软件开发过程中,为了使软件有灵活的配置,特别像界面这样的配置,同时为了减轻重复开发的任务,需要把客户的个性化需求可以通过配置文件来修改,比如像界面的颜色配置,就可通过配置文件来修改,这时就可以采用XML文件来保存和修改这些参数配置。在不同软件之间进行通讯时,也可以采用XML协议来进行数据交换,特别像WEB服务的调用时,采用传送XML格式是基本的数据交换方式。基于这些任务的需求,需要软件开发人员会在C++里使用xml格式。

2016-06-27

protoc2.5执行文件

protoc执行文件

2016-06-24

protobuf 2.5

protobuf 2.5库代码和工具

2016-06-24

selenium的浏览器驱动

目前有很多的银行网站,还是以IE为标准的浏览器,因此这里主要采用IE为测试的例子,在这里可以下载不同版本的浏览器驱动,可以是32位的,也可以是64位的,根据自己的需要下载不同的版本。在本文章里,下载的是2.35.3版本:IEDriverServer.exe,把它放在目录f:\temp\里面。

2016-06-14

WIX制作C#应用程序安装包

WIX制作C#应用程序安装包

2016-05-26

pythoncn-3.4.3

1. 使用VS2012编译。 2. 修改在VC11.0的库下运行pythonw.exe出错误的BUG。

2015-05-04

milang 1.0.5

本项目主要开发 学习 讨论小语 milang 编程语言 它是以python语法为基础 然后改进它语法 增加直接生成机器码 混合C++的优点 增加基于寄存器的虚拟机实现

2014-08-03

使用WeifenLuo.WinFormsUI.Docking的简单例子

使用WeifenLuo.WinFormsUI.Docking的简单例子,演示了简单地使用这个窗口布局库。

2021-12-10

hui_test_form.rar

H-ui.admin_v3.1.3.1的学习和测试例子,前端代码的经典。

2021-08-17

python_example.rar

pybind11的安装和编译的例子,可以快速地生成安装包。

2021-06-24

Mysql_20210615_1.rar

演示访问Mysql库的C++类库QTL

2021-06-15

TestSel1.rar

爬虫日记(28):scrapy使用中间件调用浏览器 相关代码

2021-03-29

ItemDemo_ua.rar

爬虫日记(25):Scrapy 中设置随机 User-Agent 二 的配套代码

2021-03-26

爬虫日记 Imgfn1.rar

爬虫日记(23):用scrapy快速地爬取蜂鸟网图片 相关的项目代码

2021-03-24

ImgDemo1.rar

爬虫日记(22):最简单地抓取图片,仅5行代码 相关配套代码。

2021-03-23

ItemDemo3.rar

爬虫日记(21):使用Pipeline模块写入文件二 的配套代码。

2021-03-23

ItemDemo2.rar

爬虫日记(20):使用Pipeline模块写入文件 的例子

2021-03-22

ItemDemo.rar

实例使用Item对象,适用初学者,《爬虫日记》配套源码。

2021-03-21

svm_hog_data.rar

使用到LineSVC里进行机器学习的训练数据,用来训练手写识别。 配套专栏文章使用,https://blog.csdn.net/caimouse/article/details/104599920。

2020-03-02

实现numpy的C++库扩展

使用C++来扩展numpy里的数据计算,这时就需要使用numpy的扩展库功能了,下面就来提供一个使用C++编写numpy扩展库的模板,这样大家就要减少很多弯路,减少跌入坑里的成本。这个扩展库的模板是从mahotas库里抽取出来的,经过最大化的简化,这样更加容易理解,更方便学习。

2019-11-24

STM32F407VET6工程模板

玩转STM32里文章配置的代码,这里学习的第一个工程代码,可以作为后继开发的模板工程。

2019-03-14

python web py入门配套源代码

python web py入门- 实现论坛,开发技术:后端采用Python+web.py+MySQL,前端采用HTML+CSS+JavaScript+jQuery+RequireJS。

2018-02-23

webpy演示例子1

webpy演示例子1, 用于配套文章相关资源。python web py入门(9)- 论坛首页的模板中模板 前面已经提到一个模板中可以套用另外一个模板,现在就来看看这个论坛基本布局模板是怎么样的?

2018-02-21

胶囊模型的代码

胶囊模型的代码在以下论文中使用: “Dynamic Routing between Capsules” by Sara Sabour, Nickolas Frosst, Geoffrey E. Hinton. 要求 TensorFlow ( 访问 http://www.tensorflow.org 了解如何安装和升级) NumPy (详见http://www.numpy.org/) GPU

2018-02-02

C++读写json文件

https://github.com/nlohmann/json 最好用的C++读写json库

2017-12-09

python抓取天气并分析 实例源码

Python代码抓取获取天气预报信息源码讲解。这是一个用Python编写抓取天气预报的代码示例,用python写天气查询软件程序很简单。这段代码可以获取当地的天气和、任意城市的天气预报,原理是根据url找到网站截取相应的数据展现。 python抓取广州天气并分析 实例源码

2017-08-28

wix3.11版本安装工具

wix3.11版本安装工具

2017-06-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除