自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

东方猫的博客

代码改变世界

  • 博客(74)
  • 资源 (10)
  • 收藏
  • 关注

原创 文件下载和指南

这将开始下载基本客户端所需的所有数据。您可以创建所需的怪物和物品来正确清除错误,这是通过将相关数据添加到数据库来完成的,或者您可以关闭数据库检查。如果没有任何形式的数据库,服务器默认不会运行(启动时您会收到各种错误,指示服务器无法启动的原因)。尽管这现在并不重要,但如果您要使用服务器,这会阻止人们使用修改后的客户端连接到您的服务器。下面的文件和指南只是简单的下载,其中包括启动您自己的 Mir 服务器所需的所有文件。一旦您完成了所有 3 个错误阶段中的步骤,您的服务器现在将启动,不会标记任何错误!

2023-12-27 15:40:21 864

原创 韩版传奇 2 源码分析与 Unity 重制(五)地图对象的行为处理

总的来说,用户的当前行为取决于 CurrentAction,当行为队列为空时,CurrentAction 会被设置为 Idle 类状态,否则会从队列中依次取出行为执行,那么哪些行为会引起 ActionFeed 被消费(即调用 SetAction)呢?对于移动逻辑本身而言,Walking 只是沿着瓦片地图的 X 或者 Y 方向行走步长 Step 个 Cell,但对于客户端渲染而言,行走是一个帧动画,我们需要将行走过程连贯的渲染出来,否则角色的移动就像是在地图上进行瞬移。

2023-12-27 15:35:42 563

原创 韩版传奇 2 源码分析与 Unity 重制(四)服务端地图对象管理

通过上述分析我们了解了瓦片地图的加载过程,其中包含动态部分和静态部分,静态部分包含了地图尺寸和瓦片类型,动态部分上面只涵盖了安全区、刷怪点、传送点和道具限制等这些基础属性,除此之外,地图上的玩家, 怪物和 NPC 等对象才是地图的核心数据。这里再补充一点,上述基于 Timer 和 Tick 的刷怪点有哪些不同呢?到这里我们已经分析完了地图的加载和基础的地图对象维护逻辑,但其中还有很多细节没有深入,例如人物和怪物的移动,技能的释放,物品的掉落等,这些内容会在接下来的文章中一一分析。

2023-12-27 15:34:25 440

原创 韩版传奇 2 源码分析与 Unity 重制(三)客户端渲染管线

需要注意的是循环中的 x, y 实际上是 Tile 坐标,在绘制时我们需要将其换算为屏幕坐标,换算的过程很简单,只需要将 Tile 坐标乘以 CellWH 即可。在上一篇文章中我们提到,客户端的事件循环会逐帧调用 UpdateEnviroment 和 RenderEnvironment,其中前者用于处理网络数据包和更新状态,后者用于渲染,在这里我们重点来看 RenderEnvironment 的实现。在接下来的文章中我们将继续深入客户端渲染,分析装备、技能和动画的渲染方式。

2023-12-27 15:31:42 1094

原创 韩版传奇 2 源码分析与 Unity 重制(二)客户端启动与交互流程

数据完整性检查与 Connected 数据包类似,首先客户端发送 hash 到服务端,服务端校验后将结果返回到客户端,这是一个初级的逆向对抗策略,可通过修改发送的 hash 或忽略返回的错误跳过。到这里整个客户端的启动流程就分析完了,接下来的逻辑主要集中在服务端向客户端同步状态和客户端发送角色行为,在接下来的文章中我们将深入分析这些交互的处理过程。因此上面的 Draw 方法其实会将登录页面绘制出来,我们这里先跳过 GUI 相关的部分,直接来看一下当用户输入完账号密码后是如何建立连接和发起登录的。

2023-12-25 10:01:58 1560

原创 韩版传奇 2 源码分析与 Unity 重制(一)服务端 TCP 状态管理

该专题将会分析 LOMCN 基于韩版传奇 2,使用 .NET 重写的传奇源码(服务端 + 客户端),分析数据交互、状态管理和客户端渲染等技术,此外笔者还会分享将客户端部分移植到 Unity 和服务端用现代编程语言重写的全过程。本文重点介绍了服务端的启动链路、网络初始化和连接处理这三个过程,并简要分析的游戏循环的实现与数据包处理,在下一篇文章中,我们会从客户端角度分析从游戏启动、登录、游戏开始和基础游戏交互的全流程。

2023-12-25 09:47:26 1437

原创 Git分支教程:详解分支创建、合并、删除等操作

分支是Git中用于开发和管理代码的重要概念之一。每个分支都是一个独立的代码版本,可以在分支上进行修改和提交,而不影响主线(通常是master分支)上的开发工作。本篇博客详细介绍了Git中分支的创建、合并、删除等操作。分支是Git中非常强大的功能,它可以提高团队的协作效率,使代码管理更加灵活和可控。通过学习和掌握分支的使用,你将能够更好地进行代码开发和管理。希望本篇博客对你有所帮助,如果你有任何问题或建议,请在评论区留言。

2023-12-24 17:56:55 1095

原创 C# -- static 关键字

静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。静态字段不属于任何对象,只属于类,必须要用 类名.静态字段名 进行访问,反过来通过 对象名.静态字段名 的方式是访问不到静态字段的。这样的字段属于类,不属于类的实例。通过static关键字修饰,是属于类,实例成员属于对象,在这个类第一次加载的时候,这个类下面的所有静态成员会被加载。被 static 修饰的成员称之为“静态成员”,被修饰过的成员分别称为:静态字段,静态属性,静态方法,静态构造方法。

2023-12-22 10:25:48 811

原创 mysql中的Varchar(255)可以放多少个汉字

MySQL | ver < 4.1: VARCHAR以字节为单位存储,所以假设全部为常用汉字(UTF-8。VARCHAR以字符为单位存储,假设输入仍然为常用汉字,则VARCHAR(255)可以存放255个汉字。3字节编码长度),则VARCHAR(255)共可存放约85个汉字;

2023-02-26 17:47:13 5187

原创 VS2019 安装成功:安装程序要求重新启动计算机,然后才能运行visual studio

安装完成 VS2019 后需要重新启动计算机,然后才能运行visual studio,这安装在我们自己电脑上就可以通过重启计算机来正常使用。但在学校电脑带有还原卡的情况下重启数据就没了,可以通过修改注册表的方法避免需要重启才可以运行VS。修改注册表里的数据值为 0 即可: \HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\VisualStudio\Setup\Reboot...

2021-04-01 17:12:04 2732

原创 C++中 DWORD和int的区别

INT 代表int,DWORD 代表 unsigned longint会随着机器位数的不同而发生变化,比如在16位机上为16为,在32位机上为32位,在64位机上为64位。看看最原始的定义就知道了。DWORD是无符号的,相当于unsigned long ,它是MFC的数据类型。而int是有符号性的,而且他所占的字节数不一定是4个,主要和你的IDE有关,像在Turbo C中就是2个字节,VC6.0中就是4个字节切忌把 int 看成 32 位书中早就说了long 32位有符号整数int

2020-12-10 19:15:37 274 1

原创 C/C++预处理指令#ifdef,#ifndef

#ifdef如果宏已经定义,则编译下面代码#ifndef如果宏没有定义,则编译下面代码#ifdef _SOCKET_ASYNC_IO if ((WSAAsyncSelect(s, g_hMainWnd, nMsgID, lEvent)) == SOCKET_ERROR) return FALSE;#else#ifdef _SOCKET_OVERLAPPED_IO if ((WSAAsyncSelect(s, g_hMainWnd, nMsgID, lEvent)) == SOCKET_

2020-12-06 10:56:41 232

原创 如何优雅的统计c++代码行数

b*[:b#/]+.*$

2020-12-05 09:01:46 545

原创 新版mysql CMD登录 之 巨坑

从MySQL 8.0.4开始,他们将MySQL服务器的默认身份验证插件从mysql_native_password更改为 caching_sha2_password。你可以运行以下命令来解决此问题。sample username / password => student / pass123ALTER USER ‘student’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘pass123’;有关详细信息,请参见官方页面:MySQ

2020-12-04 10:26:28 109

原创 sz前缀表示的意思

Windows 程序变量前的sz表示“以零结尾的字符串”(String Terminated with a Zero)

2020-12-02 15:39:32 2033

原创 VOID和void的区别

在Visual Studio开发环境下若包含了WinNT.h,则两者是相同的。头文件WinNT.h中有一句:#ifndef VOID#define VOID voidvoid是标准的,你看到VOID可能是windows下开发可能是一个宏定义,每个公司会将C的标准类型封装起来我们公司原来还有VOS_VOID...

2020-11-28 11:33:34 566

原创 静态(s_)、成员(m_)、全局(g_)变量在c++中有什么含义、作用?

s_ m_ g_ 等前缀仅仅是我们的习bai惯的命名规则,与语法无关du.是为了方便我们在定义了变量zhi以后使用的时候dao直观的区分这些变量.C++不是完全面向对象的开发语言,同C语言一样,它有全局变量,这个变量不属于任何一个类.这些全局变量,在你的程序任何地方都可以访问到这个变量静态变量:声明变量的时候加static关键字,其意义是指定在其中声明一个或多个局部变量的过程终止后,这些已声明的局部变量继续存在并保留其最新值。void fun(){ static int i = 0;i++;

2020-11-27 15:47:52 1389

原创 WSASocket()函数 和 Socket()函数

创建一个与指定传送服务提供者捆绑的套接口,可选地创建和/或加入一个套接口组。此函数为socket()的扩展版本,其功能都是创建一个原始套接字。使用时需要包含winsock2.h 头文件和链接ws2_32.lib库。定义SOCKET WSASocket (  int af,  int type,  int protocol,  LPWSAPROTOCOL_INFO lpProtocolInfo,  GROUP g,  DWORD dwFlags  );参数说明:af:[in]一个地

2020-11-26 15:05:53 1624

原创 CreateIoCompletionPort()函数

创建输入/输出(I / O)完成端口并将其与指定的文件句柄相关联,或创建尚未与文件句柄相关联的I / O完成端口,从而允许以后进行关联。将打开的文件句柄的实例与I / O完成端口相关联,可使进程接收有关该文件句柄的异步I / O操作完成的通知。注意此处使用的术语文件句柄是指表示重叠的I / O端点的系统抽象,而不仅仅是磁盘上的文件。任何支持重叠I / O的系统对象(例如网络端点,TCP套接字,命名管道和邮件插槽)都可以用作文件句柄。有关更多信息,请参见“备注”部分。句法HANDLE CreateI

2020-11-26 14:45:31 402

原创 C++中 DWORD和int的区别

INT 代表int,DWORD 代表 unsigned longint会随着机器位数的不同而发生变化,比如在16位机上为16为,在32位机上为32位,在64位机上为64位。看看最原始的定义就知道了。DWORD是无符号的,相当于unsigned long ,它是MFC的数据类型。而int是有符号性的,而且他所占的字节数不一定是4个,主要和你的IDE有关,像在Turbo C中就是2个字节,VC6.0中就是4个字节切忌把 int 看成 32 位书中早就说了long 32位有符号整数int

2020-11-26 11:30:49 1766

原创 WSARecv()函数

WSARecv()是从一个套接口接收数据的程序。主要用于在重叠模型中接收数据。#include <winsock2.h>int WSAAPI WSARecv ( SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPINT lpFlags, LPWSAOVERLAPPED l

2020-11-26 11:27:38 4173

原创 c++类成员函数中调用多线程函数_beginthreadex()

#include "stdafx.h"#include#include#includeusing namespace std;class A { public: int n; A(int n) { this->n = n; } void static run1(A &a); void static run2(A &a); void static run(A &a);};void A::run1(A &a) { for (in

2020-11-26 11:17:15 1324

原创 D3DCAPS9结构

typedef struct D3DCAPS9 { D3DDEVTYPE DeviceType; UINT AdapterOrdinal; DWORD Caps; DWORD Caps2; DWORD Caps3; DWORD PresentationIntervals; DWORD CursorCaps; DWORD

2020-11-25 11:54:34 305

原创 typedef 关键字

typedef是在计算机编程语言中用来为复杂的声明定义简单的别名,它与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。用法总结如何创建平台无关的数据类型,隐藏笨拙且难以理解的语法:使用typedef为现有类型创建别名,定义易于记忆的类型名typedef int size;void measure(size*psz);size array[4];size len=file.getlength(

2020-11-24 20:50:56 490

原创 stdlib.h头文件

stdlib 头文件即standard library标准库头文件。stdlib.h里面定义了五种类型、一些宏和通用工具函数。 类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等; 常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。 具体的内容可以打开编

2020-11-24 16:26:50 1924 1

原创 WSADATA

WSADATA,一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。结构原型摘自<winsock.h>typedef struct WSAData { WORD wVersion; WORD

2020-11-24 15:13:04 3027

原创 linux 如何让程序后台执行

$ (./test.sh &)$ setsid ./test.sh &$nohup./test.sh &具体的转自:http://digdeeply.org/archives/06281192.html在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:Example 1 2 3 4 5 $ ./tes...

2020-11-23 11:18:55 1230

原创 fgets,fputs,fputc,fgetc总结

总结如下:fgets:从文件中每次读入一行。函数原型char *fgets(char *str,int n,FILE *fp),str是存放将要读入字符型数据的存放地址,n是数目变量,fp是文件指针。该函数表明从文件fp中读入n-1个字符放在以str为起始地址的空间,因为系统会在最后加上一个‘\0’。读入过程中:若该行字符数不超过n-2个(2代表该行本身的换行符‘\n’和系统自动加上的'\0'), 则函数读完该行就结束,文件指针移动到下一行,再进行文件读入操作时,从下一行开始读入。...

2020-11-23 10:56:16 588

原创 connect()函数

connect()用于建立与指定socket的连接。头文件: #include <sys/socket.h>函数原型: int connect(SOCKET s, const struct sockaddr * name, int namelen);参数:s:标识一个未连接socketname:指向要连接套接字的sockaddr结构体的指针namelen:sockaddr结构体的字节长度connect() 函数用来建立连接,它的原型为[1]: 1...

2020-11-23 10:54:28 10524

原创 C语言中exit(0)与exit(1)有什么区别

今天天气有点冷,当我在写消息队列的程序的时候,遇到了结束进程的这个问题,突然脑海里有点混乱,我是用_exit(),还是用exit(1),还是用exit(0)呢,然后自己度娘了一下,整理了一下稍微做了一个总结吧。_exit();和exit()主要区别是一个退出进程会清理I/O缓冲区,一个直接结束进程进入到内核中。下面我就举个例子说明下吧,int main(){printf("is ok\n");printf("I am a chinese people");_exit(0);}

2020-11-23 10:42:14 553

原创 WSADATA 数据结构

WSADATA,一种数据结构。这个结构被用来存储被WSAStartup函数调用后返回的Windows Sockets数据。它包含Winsock.dll执行的数据。摘自<winsock.h>typedef struct WSAData { WORD wVersion; WORD wHighVersion;#ifdef _WIN64 unsigned short

2020-11-23 10:25:03 2263

原创 strcmp函数

strcmp函数是string compare(字符串比较)的缩写,用于比较两个字符串并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。externintstrcmp(constchar*s1,constchar*s2);规则当s1<s2时,返回为负数;当s1=s2时,返回值= 0;当s1>s2时,返回正数。[2]...

2020-11-23 10:13:02 6816

原创 vs中能编译通过,但是会有红色下划线提示未定义标示符问题

项目能编译通过,但是代码中会有红色下划线提示未定义标示符。就连BOOL TRUE FALSE等都会有下划线。这通常是该代码文件包含在项目文件夹的子文件夹中。解决办法是配置包含项目目录即可:打开项目属性-》配置属性-》C/C++常规-》附加包含目录-》填入:$(ProjectDir)...

2020-11-22 15:44:12 382

原创 对Socket通信中BeginReceive方法的一些理解

在学习Unity的网络通信的时候,客户端和服务器端使用Socket通信。其中用到了不少Socket的方法。先看看Receive方法,Receive方法的主要参数是传入一个接受数据的byte数组。查看文档可以得知:如果没有可读取的数据,则Receive方法将一直处于阻止状态,直到数据可用,除非使用Socket::ReceiveTimeout设置了超时值。如果超过超时值,Receive调用将引发SocketException。再看看BeginReceive方法,该方法主要参数也有...

2020-11-13 15:19:56 601

原创 c#中value是什么意思

这是c#中的“属性”假如某个类中有一个成员变量(字段),一般是不允许外部访问的,为了安全性如果要访问它,必须通过“属性”来访问,例如:private int id; //这是一个成员变量,private表示是私有的,外部不可访问public int ID{get { return id; } //当外部访问“属性”ID时,返回id的值set { id = value; }//当外部...

2019-10-25 14:23:51 5608

原创 Control.ImeMode

设置控件初始状态时的默认输入法NoControl = 0ON = 1OFF = 2Hiragana = 40 无(缺省设置)。该值表明“无 IME 控制”。当 IMEMode 属性被设置为 0 时,可以使用IMEStatus函数确定当前的 IME 状态。1 IME 打开。该数值表明 IME 已经被打开,可以输入汉字或日文字符。该设置仅对日文、简体汉字和繁体汉字 IME ...

2019-10-06 15:50:16 224

原创 C# winform 窗体怎么隐藏标题栏,不显示标题栏啊

//没有标题this.FormBorderStyle = FormBorderStyle.None;//任务栏不显示this.ShowInTaskbar = false;//不知道你要哪样,都写给你了

2019-10-05 02:09:57 4696

原创 c#窗体怎么不让它拉伸

你可以设置这个窗体的MaximumSize和MinimumSize,等于你开始时显示的窗体,这样他就不可以拉伸了!!比如当前你的窗体的Size是1000,600就设置MaximumSize和MinimumSize也等于1000,600就可以了!...

2019-10-05 02:09:24 2378

原创 C#中如何去除窗体默认的关闭按钮

很多时候,在winform的设计下,会遇到新建窗体时不需要用到默认的关闭按钮的情况,而是用另外设置关闭 button或其他控件来控制窗体的关闭。之前我遇到这个问题时,问了很多朋友,都没找到方法,VS的窗体属性里也没那一项,在MSDN里也没有相关的资料。 但后来偶然发现,原来办法是很简单的,只需要在初始化窗体的时候不显示那关闭按钮就可以了。具体方法是,加上一句 “ this....

2019-10-05 02:08:42 2199

原创 TabControl设置选项卡的大小

今天在使用Winform下的TabControl控件时,发现选项卡大小的调整不仅仅是设置宽度和高度那么简单,下面对TabControl选项卡大小的设置进行总结(以显示在顶部的选项卡为例):设置选项卡大小的第一步就是设置TabControl的SizeMode属性,SizeMode属性返回枚举TabSizeMode,TabSizeMode有三个值,分别是Normal,FillToRight,Fix...

2019-10-05 02:07:50 2412

算法技术手册.mobi

算法技术手册.mobi

2018-12-11

21天学通C++第7版.mobi

21天学通C第7版.mobi

2018-12-11

30天自制操作系统.mobi

30天自制操作系统.mobi

2018-12-11

iOS应用逆向工程:分析与实战.azw3

iOS应用逆向工程:分析与实战.azw3 iOS应用逆向工程:分析与实战.azw3 iOS应用逆向工程:分析与实战.azw3

2018-04-23

智能时代 .mobi

智能时代 .mobi 智能时代 .mobi 智能时代 .mobi 智能时代 .mobi

2018-04-23

Linux就是这个范儿图灵原创.mobi

Linux就是这个范儿图灵原创.mobi Linux就是这个范儿图灵原创.mobi Linux就是这个范儿图灵原创.mobi Linux就是这个范儿图灵原创.mobi

2018-04-23

Chrome扩展及应用开发.mobi

Chrome扩展及应用开发.mobiChrome扩展及应用开发.mobiChrome扩展及应用开发.mobiChrome扩展及应用开发.mobi

2018-04-22

空空如也

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

TA关注的人

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