自定义博客皮肤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--用软件和芯片来改变世界

  • 博客(2954)
  • 资源 (44)
  • 收藏
  • 关注

原创 C#开发的OpenRA的游戏主界面逻辑

在这里通过mainmenu.yaml定义的文本名称VERSION_LABEL来找到对应的标签控件,然后再设置文本显示。这行代码是用来设置主菜单是否显示出来,如果菜单显示的类型为MenuType.Main,就显示出来,其它类型不显示。比如点击了按钮,就需要有正确的反应,比如显示另外一个菜单,或者显示一段文字。其它的控件也是通过这样的方式来找到对应的控件,然后进行设置。可见游戏主界面,就是设置按钮显示,并设置按钮的响应的动作。前面介绍了主界面的布局,以及界面内容的显示,C#开发的OpenRA的游戏主界面逻辑。

2023-04-19 09:58:37 321 1

原创 C#开发的OpenRA的游戏主界面怎么样创建8

接着显示是一个单人玩的游戏按钮,显示的内容为Singleplayer。这是定义扩展菜单的内容,当用户点击上面扩展菜单时会显示这些菜单内容。这是定义游戏管理内容按钮,显示内容为Manage Content。这里定义这个菜单的标题,显示的内容为Main Menu。这是多人玩的游戏按钮,显示内容为Multiplayer。接着下来,就剩最下面的功能了,但是也是最复杂的一部分,因为这是实现整个游戏的交互功能,比如单人玩游戏的选择,这是定义游戏切换到另外的按钮,显示内容为Extras。继续游戏主界面创建的主题,

2023-03-12 13:55:16 481

原创 C#开发的OpenRA的游戏主界面怎么样创建7

这里先定义一个容器Container,容器相当于一个窗口,容器的名称叫做SHELLMAP_DECORATIONS,图片的来源,跟前面那篇文章是一样的,都是来源于集合logos,名称分别是nod-load、gdi-load。在文件mainmenu.yaml定义了一个版本显示标签,通过这个标签就可以显示当前正在运行游戏的版本,然后在这个容器里添加两个子图片控件,一个用来显示NOD图片,一个用来显示GDI图片。所以在版本里显示DEV_VERSION,没有写任何的版本信息。继续游戏主界面创建的主题,

2023-03-09 16:49:50 648

原创 C#开发的OpenRA的游戏主界面怎么样创建6

来源位置为图片字典,查找的键是logos,这时就找到上面的字典对象,再根据名称eva来找到对应的较图片,这里使用的图片,都是来源于文件chrome.png,因此我们只需要定义使用那一个图片的坐标位置即可。最右边就是显示EVA的图片和版本号,本文就来介绍图片EVA和版本号的显示。要想显示图片EVA,那么就得搞懂图片的来源,才能显示出来。我们发现所有图片的显示,都是基于纹理的,所以这里显示也不例外。所以这些坐标位置,都定义在文件chrome.yaml里,有了图片的基础,再来显示EVA这个图标,就相对容易了。

2023-03-09 15:03:30 553

原创 C#开发的OpenRA的游戏主界面怎么样创建5

这里定义了一个滚动显示面板ScrollPanel,包含了一个新联显示的模板NEWS_ITEM_TEMPLATE,一个标签显示新闻状态NEWS_STATUS。这行代码是用来加载已经创建布局的对话框, NEWS_PANEL并不是在文件mainmenu.yaml里定义的,由于这部分UI,还是基于主游戏界面,那么它的组成部分,必然在mainmenu.yaml里有所体现,第二个参数就是显示新闻的窗口newsBG,它就是前面创建的窗口“NEWS_BG”。当点击这个按钮时,就会弹出一个对话框窗口来显示对应的新闻。

2023-03-08 13:51:49 710 1

原创 C#开发的OpenRA的游戏主界面怎么样创建4

这行代码的第二个参数"LOCAL_PROFILE_PANEL",它是一个id参数,说明它已经在其它地方定义过这个窗口。其它的相关逻辑功能,就比较简单了,它的逻辑功能定义在类LocalProfileLogic里。因为在这里所有UI的显示,都是需要我们自己动手实现,操作系统的UI已经没有任何关系。前面加载窗口时,就使用到这个id,可见这个窗口是在前面的代码进行预先加载,在这里非常简单,只是定义它显示的X轴和Y轴的坐标,其它参数都没有。显然不可能是在这里定义的,需要我们继续分析后面的代码,

2023-03-07 14:58:33 658

原创 C#开发的OpenRA的游戏主界面怎么样创建3

widgetType是传入子部件的类型,比如Label@VERSION_LABEL,表示使用标签。widgetType.Split('@')[0],这行代码就是把字符串Label@VERSION_LABEL进行拆分,并且获得最前面的字符串,那么就是Label,然后在第二行代码里组合,也就是与"Widget"字符串组合,就生成新的字符串LabelWidget,由此可见,在yaml文件里定义子控件时,前面都是类型的名称,后面窗口名称。在这个类里,主要调用Draw()函数来实现显示,计算字符串显示位置和颜色,

2023-03-06 11:21:12 767 1

原创 C#开发的OpenRA的游戏主界面怎么样创建2

这行代码是对窗口最后初始化进行处理,比如创建逻辑处理类,并进行初始化,这样窗口就可以进入显示和响应消息操作了。这段代码是找到这个窗口的逻辑处理类,比如游戏主界面就是通过yaml文件里找到MainMenuLogic类。这种方式有点像先把对象参数保存在文件里,然后创建一个空白的对象,再从文件里把这个对象的数据恢复过来。这段代码是找到所有已经初始化的类对象,然后进行遍历,其中就有主界面的初始化。继续游戏主界面创建的主题,前面已经说明了怎么样找到游戏主界面的入口,这就是使用到前面提到的成员变量从文件加载的功能。

2023-03-04 15:15:01 2193

原创 C#开发的OpenRA的游戏主界面怎么样创建

这样就加载了mod.yaml的Rules定义,接着就可以找到world.yaml文件。其实在mod.yaml的Rules里定义文件world.yaml的字段World,都是需要在程序里创建所有属性,这些属性是通过文件来定义,然后动态地创建。现在就来解决这个问题,其实整个游戏都是可以通过yaml文件进行配置的,通过前面加载界面布局数据,可以把整个界面逻辑的数据加载到内存,当加载界面在完成加载数据之后,就会关闭,接着出现游戏的主界面,world.yaml文件是定义整个游戏世界配置的文件,

2023-03-04 10:41:45 744

原创 C#开发的OpenRA的界面布局数据加载

在这个节点里,经过var key = w.Key.Substring(w.Key.IndexOf('@') + 1)的处理,就会得到MENU_BACKGROUND为键,modData.Manifest.ChromeLayout是保存所有界面布局的文件列表,它主要保存文件mod.yaml里下面的键:ChromeLayout。widgets用来保存所有文件里的键值对,方便后面使用时,只要给出键,就可以找到对应的值。包含所有UI的布局文件参数,它是比较多内容的,所以加载时间会比较长一些。然后再处理时间长的加载。

2023-03-02 13:42:39 515

原创 C#开发的OpenRA的加载游戏UI绘制

这段代码前面三行,直接调用DrawSprite函数来显示图标出来,并没有像边框那样进行切分,因为整个图标是一个整体,进行切分显示是不可能的。loadingPos是用来保存加载字符串显示位置,这里计算是屏幕的X轴中间位置,Y轴位置是barY,也就是屏幕的底部。总共有16块,分成两段,左右各8块,两边显示的位置是一样的。到这里就完成了加载界面的分析,从纹理的加载,再到OpenGL着色器初始化,再到顶点数据到着色器的处理,因为字符串是一个文本串,也就是一个编码代号,并没有图像信息,所以是不能直接显示到显示卡的。

2023-03-02 09:19:13 215

原创 C#开发的OpenRA的纹理图片显示到顶点缓冲区

vertices是保存所有需要显示顶点坐标的缓冲区,它是Vertex类的数组,默认创建的大小是8K个顶点,如果空间不足,它就会立即把这些顶点进行显示,并清空才能写入下一批显示内容。这里调用的函数是属于类SpriteRenderer的函数,它主要实现像素图进行显示,也就是实现纹理图片显示,在这里是显示UI的内容。来显示加载游戏界面的边框,bounds整个屏幕的大小,border是9个边框的纹理数组。因为每一个边框的长度,可能都大于纹理图片的尺寸,如果使用整个纹理,就会需要插值,

2023-03-01 15:01:33 356

原创 C#开发的OpenRA的Shader加载、编译和设置使用

也即开发人员写的短小的自定义程序,他们是在图形卡的GPU (Graphic Processor Unit图形处理单元)上执行的,然后调用函数glCreateShader来创建一个着色器对象,调用函数glShaderSource来替换当前着色器对象的代码,在这个类Shader的构造函数里,首先是加载编译Vertex Shader(顶点着色器)和Fragment(片断着色器),通过上面的设置,就可以设置好着色器,可以在后面的代码里调用它来显示相应的纹理和顶点数据,并且设定了交互数据的接口。

2023-03-01 10:15:22 414

原创 C#开发的OpenRA的GLSL介绍

因此,接着下来需要编写一个GLSL程序,GLSL使用类型限定符而不是通过读取和写入操作来管理输入和输出。所有这些动作,都需要OpenRA里实现,所以要理解这个,涉及到的知识就非常多。有了上面两个文件,还不能直接使用,需要对这两个文件进行加载、编译、连接、检查是否出错,这个结构决定了程序里向显示卡输入数据的格式,所有数据格式都需要定义为这个数组的形式,如果没有学习过这门语言,要写一个着色程序又是一个大工程,幸好这里有一个简单的例子,需要设置界面的纹理,然后再创建三角形顶点,这样由两个三角形组成一个平面,

2023-02-28 11:19:14 394

原创 C#开发的OpenRA的加载界面边框的细节

Top, Left, Bottom, Right是纹理坐标UV值,在-1.0到1.0之间,用在物体渲染时,纹理图片贴图怎么样放置。在这行代码里,第一个参数是显示对象,第二个参数是Sheet对象,它就是纹理图片管理的对象,第三个参数是图片的大小倍数。density是图片的大小倍数,用来计算纹理图片在图片里的像素的位置。(129, 129)是原来加载纹理图片里的坐标位置,32是X轴方向的大小,另外一个32是Y轴方向的大小。切分时,就可以得到四边形的坐标,然后把这个四边形显示在坐标(x,y)的地方。

2023-02-26 15:19:47 598

原创 C#开发的OpenRA的OpenGL渲染显示

我们可以指定一个矩形的剪裁窗口,当启用剪裁测试后,只有在这个窗口之内的像素才能被绘制,其它像素则会被丢弃。换句话说,无论怎么绘制,剪裁窗口以外的像素将不会被修改。接着调用函数Flush(),这个函数就会触发SpriteRenderer类进行Flush运行,最后调用OpenGL的。DisplayInner()负责创建当前UI界面显示的内容,比如按钮,文本显示等等。首先判断是否是UI类型RenderType.UI的显示,如果不是就会报错,并返回。由于图象的数据已经绘制,最后就是压入到显示缓存了。

2023-02-26 11:08:44 580

原创 C#开发的OpenRA的管理FBO(Framebuffer Object)

如果纹理是立方体贴图纹理,则GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE的值设置为textarget;GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME的值设置为0. GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL和GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE分别设置为默认值0和GL_TEXTURE_CUBE_MAP_POSITIVE_X。

2023-02-22 08:55:15 274

原创 C#开发的OpenRA的NextPowerOf2

0000 0000 0000 0001 1000 0000 0000 0000 //与原值或 ,1的位数翻倍。0000 0000 0000 0001 1110 0000 0000 0000 //与原值或,1的位数再翻倍。0000 0000 0000 0000 0000 0000 0000 0001 //右移16位。0000 0000 0000 0000 1000 0000 0000 0000 //右移1位。0000 0000 0000 0000 0110 0000 0000 0000 //右移2位。

2023-02-21 10:07:04 634

原创 C#开发的OpenRA的OpenGL创建纹理流程

在这里设置了纹理被缩小(GL_TEXTURE_MIN_FILTER)情况,采用线性插值(OpenGL.GL_LINEAR)还是近邻插值(OpenGL.GL_NEAREST)。GL_TEXTURE_BASE_LEVEL表示纹理最小使用级别为0, GL_TEXTURE_MAX_LEVEL表示纹理最大级别也为0,不做多级纹理优化。当超过纹理坐标时,GL_TEXTURE_WRAP_S表示X轴方向采用GL_CLAMP_TO_EDGE边缘颜色扩展。纹理被放大(GL_TEXTURE_MAG_FILTER)情况也是一样。

2023-02-20 17:38:24 610

原创 C#开发的OpenRA游戏高性能内存访问的方法

可以看到A是放在高位,B是放在低位。由于INTEL的内存是小端格式,所以就是BGRA了。由于这里是采用垃圾回收的方式语言C#,那么在不优化的情况下,它是使用管制的内存。(1).单纯的图像文件是无法被我们直接用来在Scene视图中看见或则进行操作的。不管来源的格式是什么样的,最终都需要转换为ARGB的格式,即是32位表示的颜色。比如王者荣耀里,一个大招是否及时地放得出来,就会影响到一场比赛的关键。虽然这样会比危险一些,但是为了性能的提升,这些冒险是值得的。而这个大招的释放,又取决于游戏运行在手机上的性能。

2023-02-20 11:14:06 527

原创 C#开发的OpenRA游戏加载界面的实现

BlankLoadScreen实现了显示一个空白的界面,SheetLoadScreen实现显示一个带有纹理的界面。Image是不放大的图片,它是1024X512的大小png图片。在这里是通过后面的值:CncLoadScreen,这个值决定了加载那个类的界面,它是mod.dll里的类名称,通过这个名称,就可以找到这个类,并且创建类实例。但是游戏的UI都是自己处理的,不能使用像Windows自带的UI。这样游戏的UI,其实也是使用游戏的方式来显示的,游戏的界面有很多,先从一个简单的加载界面开始。

2023-02-17 17:45:52 984

原创 C#开发的OpenRA游戏帧计时的实现

这样就可以降低CPU和GPU的运算,让电脑少费点电,多多节能,这样也能社会起到很好的环保作用。所以游戏帧速度,就需要使用一个时间来计数,如果超过60帧之后,就要增加延时,一般情况下,人的眼睛只有超过24帧每秒,就已经感觉不出来画面是否不连续了。特别游戏的界面渲染时,可以把帧率降到很低,每秒钟几帧就可以了。也就是说非常费电的,如果这个不控制好,使用最高的帧率,因此,软件开发人员也是为社会的能源消耗作出很大的贡献。下面用一个简单的例子演示类Stopwatch的使用。游戏里显示每个画面,都是通过实进渲染进行的。

2023-02-17 09:45:39 390

原创 C#开发的OpenRA使用自定义字典的比较函数

比如一个盒子的大小,不能通过对象的HASH值来认为它们是相等的,因为盒子的大小是通过长宽高来决定。由于字典是采用HASH算法,所以它的查找时间是非常快,并且索引类型也没有太多限制,只要认值地理解后面的例子,就可以熟悉相关的内容,才可以看懂OpenRA里的代码。默认的情况可能是采用对象的HASH值,但是这种情况在普通的对象是可以使用的。这是比较困难的,如果有一个模板,再从这个模板上进行扩展,可以适用的类型就普通数据的范围就大得多了。字典由于键的唯一性,如果自定义的类作为键,后面提供的例子,就是这样的作用。

2023-02-16 11:53:18 478

原创 C#开发的OpenRA加载文件的管理

并且这些文件各种各样,也有很多小文件,为了避免过多的小文件,发行时会把众多的小文件合并成一个大文件。一个游戏里,文件管理是一件比较常见的事情,因为很多游戏图片、动画都是基于文件的方式保存。在前面我们分析了mod.yaml文件,发现里面有很多文件列表,这些文件是主要的资源文件,所以需要提前打开,并缓存起来。这个函数,就是为从缓存文件里获得对应文件而准备的。后面就可以通过上面的容器来访问所有这些文件。C#开发的OpenRA加载文件的管理。因此还会涉及到文件压缩和解压的需求。

2023-02-16 09:55:46 326

原创 C#开发的OpenRA动态加载插件DLL里的类实现

比如Mix类型文件,就需要使用类MixLoader来加载,它是定义在文件MixFile.cs里,通过上述的方式,就可以通过加载不同的DLL,从而实现加载不同的类,就可以读取不同格式的文件。要实现上述的目的,就需要先加载DLL的程序集信息,这个在前面的文章里有讨论过。意思就是说,每个类定义一定的接口,然后把这些类写在不同的DLL里,并且游戏里有很多资源类型的文件,不同的文件采用读取算法不一样,那么每个人实现的代码是不一样的,算法也是不一样的。所以实现的代码也不一样,这时候就有多个类。

2023-02-15 10:31:02 618 1

原创 C#开发的OpenRA的只读字典IReadOnlyDictionary实现

但是在OpenRA里大量使用这种方式,可见这个特性使用起来还是有一点难度的。因为要实现IReadOnlyDictionary接口,需要实现比较多的接口。但是如果在一个大型的代码,或者要求比较严格的代码里,就需要考虑这个问题了。我们其实可以学习OpenRA里的代码,这样就可以很方便使用这个功能了。这是一个高级的实现方式,一般情况下,开发人员不会考虑这个问题的。毕竟代码里,只要小心地使用,还是不会出问题的。不仅可以实现字典的迭代访问,还可以只读的方式。在普通的教科书,也没有提到这个功能的实现。

2023-02-14 17:30:02 508

原创 C#开发的OpenRA的mod配置文件的容器Manifest类

这些内容就会通过List保存,然后保存在Dictionary结构里。由于一个游戏里有多个mod可能,所以采用字典Dictionary来保存多个mod的配置。最后通过函数MiniYaml.FromStream()返回整个文件mod.yaml的内容,因此,最后所有mod.yaml文件的内容都会保存类Manifest里,最后通过这个结构来访问所有mod.yaml的内容。

2023-02-14 11:04:51 501

原创 C#开发的OpenRA的yaml文件读取和分析

在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。它使用空白符号缩进和大量依赖外观的特色,特别适合用来表达或编辑数据结构、各种配置文件、倾印调试内容、文件大纲(例如:许多电子邮件标题格式和YAML非常接近)。类MiniYamlNode是用来描述每一个节点的键和值,由于值可以是yaml文件,所以的值可能是类MiniYaml。从前面分析整个mod.yaml文件可以知道,它是一个键值对的描述文件。

2023-02-13 14:08:08 572

原创 C#开发的OpenRA使用TrimExcess方法

所以在这里为了减少内存的占用,就调用了方法TrimExcess来进行压缩列表刚好等于列表里元素的实际数量。在上面代码里遍历整个节点列表,把所有节点都调用TrimExcess方法处理一下,对于平时的应用来说,创建List对象是比较少的,所以不用关心浪费内存的空间。要回答这个问题,就需要了解List类型存储的内存分配机制。它会分配一个适合内存管理大小的内存,当你只保存一个元素时,这样做的意义就是提高整个代码的运行速度,不过有一个缺点,由于保存的节点较多,那么这样浪费的内存就非常可观了。

2023-02-13 10:47:06 545

原创 C#开发的OpenRA的扩展方法

但是我们也没有Stream的代码,所以不能采用继承的方法来实现,只能采用扩展方法。扩展方法的第一个参数必须包含关键字this,并且在后面指定扩展的类的名称。2)如果扩展方法和该类型中定义的方法具有相同的签名,则扩展方法不会被调用。在OpenRA游戏里,由于需要读取大量的图片文件,为了减少内存的操作,1)扩展方法必须为静态方法,但可以向扩展类型上的实例方法一样进行调用。对一个类进行扩展方法,只有继父类,然后在子类里创建新的内容。在后面的例子里,演示了扩展方法,也演示了怎么样减少内存操作。

2023-02-10 17:02:13 1742 1

原创 C#开发的OpenRA的mod.yaml文件

这个标签是列出一个或多个yaml文件,这些文件定义游戏UI界面的颜色、字体大小、字体种类等等。这个标签是列出一个或多个yaml文件,这些文件定义地图可用的贴图,例如雪、温带地区、内陆等。这个标签是列出一个或多个yaml文件,这些文件定义游戏里可放置的物品,比如人、汽车、房等等。可见这个文件的重要性是非常高的,如果这个游戏目录下不存在这个文件,说明根据不用会加载资源。这个标签是列出一个或多个yaml文件,这些文件定义游戏UI界面的贴图。由此可见,这个文件是一个资源描述文件,是一个所有游戏文件的描述清单。

2023-02-10 13:35:54 387

原创 C#开发的OpenRA的读取文件的函数

而当下的游戏,都是每周进行热更新,并且数据量越来越大,就是因为需要更多的图片。在读取这些文件时,需要注意的只能读取,不要去更改它,因为这些图片不容修改。因为游戏跟电影是一样,就是不断地展示场景,以及人物的动作。其实游戏的大部分工作都不是在开发上,而是在美工方面。很久以前,我以为开发游戏的主要功能是在程序开发上,在OpenRA游戏里,读取文件是必备的功能。C#开发的OpenRA的读取文件的函数。它是打开一个文件,返回只读的流对象。这里的函数都是上一个文章里类函数。也有可能是一个压缩的ZIP文件。

2023-02-10 09:11:07 732

原创 C#开发的OpenRA的判断文件是否存在和目录文件读写

这行代码创建一个目录管理类Folder,这个类Folder主要作用是对一个目录进行管理,比如获取整个目录的文件列表、文件读取、文件删除、文件更新。Directory.GetFiles方法获取整个目录的文件列表, Directory.GetDirectories方法获取整个目录的子目录列表,在这个类里,有一个函数实现是比较经典,它主要用来获取整个目录里文件和子目录的列表,并且排序。在这个函数里,先用Directory.Exists函数来判断游戏资源的目录是否存在,就根据用户选择来打开指定的目录的游戏。

2023-02-10 08:37:49 308

原创 C#开发的OpenRA的Enumerable.Concat方法应用

这行代码,是把一个字符列表都遍历一遍,然后每一项路径取出最后的目录名称和路径组成一个新的元组(Id, Path).在这里调用GetCandidateMods(searchPaths).Concat方法,这里需要注意关注的。从搜索目录searchPaths里返回的结果,再拼接到指定搜索目录explicitPaths里。它是采用了Enumerable.Concat方法,实现两个列表的结果集进行合并。在OpenRA游戏里,可以让用户指定搜索目录,也可以搜索应用程序所在的目录。

2023-02-09 15:16:01 556

原创 C#开发的OpenRA实现目录搜索

在这行代码里,subdir.Name表示目录的名称,subdir.FullName表示整个路径的名称。可以把所有目录生成一个列表,比如像 List 类型。在这里目录的名称作为不同游戏的名称,路径作为游戏资源所在的目录。这样就可以记住了游戏所需要加载的资源,以及对应不同游戏的种类。而进行目录搜索的关键,就是熟练地使用系统的目录相关的API,说明输入的搜索的目录,也是一个路径列表,可以搜索多个目录。那么就需要对整个游戏的目录进行搜索,它对应的是(游戏id, 路径)。

2023-02-09 13:28:17 291

原创 C#开发的OpenRA实现应用程序目录的获取

当调用一次这个函数之后engineDirAccessed就会设置为true,后面就不再调用前面获取应用程序目录的函数了。在这里,modSearchPaths就会获取Platform.EngineDir + "mods"的目录。在OpenRA里,通过函数EngineDir来获取OpenRA\mods的目录。现在就来说说怎么样使用应用程序来定位,通过定位就可以获取游戏资源的目录,一般来说有两种方法,第一种是由安装程序来写入安装的目录,由于用户会安装在不同的目录,不同的盘符上,

2023-02-09 08:57:44 402

原创 C#里动态加载插件的信息收集

要找到这样的项目是一件不容易的事情,经过反复比较,感觉还是OpenRA这个游戏项目比较值得学习。其实可以向开源项目学习,毕竟开源的项目可以拿到代码,这样就可以编译,修改和运行。即使写出来了,也是一个难懂的项目,还需要数年的修改,才会有让别人学习的可能。要找一个中型的项目,又要比较有趣,又有比较好的设计,还是C#的项目。而在实践的过程中,如果只写100多行的代码,只会学会某个知识点,比如一个游戏可以有不同的版本,但是每一个版本写在不同的DLL里。因为自己是刚学习的,想写一个大型项目出来,也是写不出来。

2023-02-08 11:28:43 369

原创 C#里使用UdpClient和线程来创建UDP网络通讯

UDP是无法发送大量的数据,如果要发送大量的数据,需要自己控制重发机制,需要自己重发丢包的数据包。虽然UDP是无连接的协议,比TCP要差那么一些,但是对于简单的数据读取,又是很方便的。如果只是用来不断地读取数据,那么丢掉几个数据包是不会影响应用,那么就可以使用。又或者与PLC通讯,而PLC采用UDP的协议,而不是使用TCP协议。打开两个程序,然后修改为不同的端口,就可以在同一台电脑上测试了。作为一个软件开发人员,所以必须要熟练地使用UDP进行通讯,在开发的过程中,时不时就需要使用到UDP通讯。

2023-02-06 13:56:10 1301

原创 C#里最简单向文件追加文本的方法AppendAllText

在开发的过程中,经常会碰到这样的问题,就是当一个文件没有创建时,就需要创建。但是文件已经创建了,就直接追加数据。这个函数使用比较方便,只要给出文件路径,把写入的内容放到函数里,就可以实现追加,每天都在固定的时间去记录一下这个温度,那么就需要在这个文件后面追加数据。最新添加的内容2023/2/3 10:22:03。最新添加的内容2023/2/3 10:22:07。最新添加的内容2023/2/3 10:22:34。最新添加的内容2023/2/3 10:22:37。不用自己去打开文件,以及关闭文件的过程。

2023-02-03 14:03:42 2798

原创 C#里error CS0136: 无法在此范围中声明名为“e”的局部变量或参数

又有于我们经常把异常的Exception,也定义为e,如果这时候不关注到参数里已经定义这个变量,说明函数参数的定义的变量,与后面自己声明的变量重复了,就会导致这个出错信息。特别在一些按钮函数里,当你写的代码比较长时,更加容易出现,这是为什么呢?因此发现这个出错码之后,主要检查是否重复定义了相同的变量。在开发的过程中,一不小心,就会碰到这个出错CS0136。这时候只需要修改任何一个参数不为e,就可以了,比如把异常。那么就会提示这个出错,就会一直找不到错误的地方。修改为上面代码之后,就可以编译通过。

2023-02-02 16:29:21 1852

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

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

2017-08-28

wix3.11版本安装工具

wix3.11版本安装工具

2017-06-19

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

开源鸿蒙4.0不能进入桌面的补丁

系统启动后进入不到桌面 当前系统有 bug,当出现此种问题时,需要执行 killall com.ohos.launcher。 里面的hap文件替换applications\standard\hap\下的同名文件。 目录 oh/applications/standard/hap

2024-03-17

开源鸿蒙 4.0 RK3566开发板配置

开源鸿蒙 4.0 RK3566开发板配置 https://mysoft.blog.csdn.net/article/details/136779805

2024-03-17

使用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

空空如也

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

TA关注的人

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