- 博客(25)
- 收藏
- 关注
原创 虚幻FPS开发 day02:开枪以及光线追综
首先设置音效资产变量,在蓝图中动态的设置音效资产绑定开火事件,在输入事件中设置鼠标左键按下事件在代码中设置当鼠标左键按下时对应的槽函数,绑定输入事件和槽函数之间的关系获取开火资产GitHub - DruidMech/UE4-CPP-Shooter-Series: Unreal Engine C++ Shooter Series Project创建音效蓝图在BP_Character中设置资产至此,开火音效已经实现首先创建开火粒子特效变量以动态绑定资产,在我看来蓝图类就像是配置文件在鼠标左键点击开火时调用的回调
2025-03-13 19:36:17
464
原创 DAY09
此时将叔叔结点和父亲节点都设置为黑色,将祖父节点设置为红色,将祖父节点设置为当前结点,一直向上递归,直到祖父节点是红色(当前节点)。红黑树有一条性质是不能有两个连续的红色结点,因为插入的新结点是红色,所以其父亲结点不能是红色结点,如果是红色结点就需要做调整,而黑色结点不需要。其次保证当前指向结点的指针不能是黑色,因为插入的结点是红色的,如果当前的结点是黑色的,就意味着不会影响黑高也就没必要再网上递归了。// 将当前结点设置为祖父节点,下面的两层已经检查完毕,需要递归的向上检查。// 将祖父结点染成红色。
2024-09-30 22:25:32
786
原创 DAY08
创建了监听端口的socket,并将其作为事件添加到红黑树上监听以后,当epoll监听到连接请求,就往socket_server中添加新的socket,此时socket线程会通知gate服务的次级消息队列,插入一个消息,告诉它有新的连接建立。这个消息队列有两级,二级消息队列是供用工作线程调用的,一般工作线程会出队一个消息队列,然后从这个消息队列中出队一个消息(根据工作线程的权重来出队消息的个数),并找到该次级消息队列的所属服务,将消息当作该服务的callback函数的参数,来执行指定业务。
2024-09-27 20:22:46
787
原创 DAY07
还是利用了先划分服务的特性。离谱,长记性了,下次面试之前,先问一下公司的产品和规模,不能再这么傻乎乎的过去了。大致逻辑是这样子的,重要的是熟悉lua定义的一些常用的数据结构,然后明白这些表中到底是存放什么信息,可以将整个代码赋值给gpt让gpt分析每个数据结构包含的信息和作用,然后自己再根据这个数据结构去看代码,会更加的清爽。猜数字的逻辑也是在room中进行实现的,因为a玩家猜的数字要在b玩家和c玩家的界面上显示,所以就需要有一个服务拥有这三个服务的信息然后将某个服务的操作统一的投射到输出缓冲区上。
2024-09-26 22:28:55
233
原创 DAY06
大致的思想就是在.lua文件中调用socket.start传递的两个函数参数,都会加入到虚拟栈中,由于c和lua共用虚拟栈,所以c的代码中就需要从这个虚拟栈中获取两个元素,就是616和617的函数,这个L就是虚拟栈(暂时可以这么理解)。暂时没有什么好的学习方法,只有死磕,将一小段代码拿出来,写个test.lua文件测试一下,看看效果,再根据效果去推理每个代码的意思,再让gpt生成一下注释,就大致明白了。之前的框架自己已经清楚了,但是最重要的还是要使用这个框架来写代码。这就是在lua中调用c的大致逻辑。
2024-09-25 22:09:26
316
原创 DAY05
一般绑定的是读事件,重点是第二个data种void* ptr可操作空间很大,可以针对客户建立连接的事件创建一个结构体来操作这个专属连接,在这个结构体可以设置一个回调函数,当事件被触发就可以执行回调。由于已经建立的客户端连接的事件是一个比较宽泛的概念,所以再这个事件到来时可以在这个逻辑里面进行类型判断,在对这个事件进行细分,例如上传文件,下载文件之类的。所以说要想看懂一个网络模型,重点是注册了几个事件已经对事件的处理,在事件的处理中有哪些是进行了线程池添加消息的操作,就能有个比较大致的思路了。
2024-09-24 22:12:53
165
原创 DAY04
今天的重头戏还是skynet的架构,该架构的核心actor模块,其包含三个数据结构,虽然源码中有10个数据成员,但是真正核心的只有消息队列,回调函数以及lua虚拟机。今天学到了一个看skynet架构的思路,先从线程池的入口函数看起,然后看线程都执行那些类型的消息,再从消息回溯看actor结构,然后去看actor是如何和事件进行绑定的,即客户端的连接绑定一个actor,进而到epoll监听到事件然后到注册了哪些事件类型,再去main.lua看哪些事件被执行了,这样看下来整个架构会清晰很多。
2024-09-23 22:07:10
355
原创 DAY03
后面就是算法,二叉树的前序遍历,中序遍历,后序遍历,都是采用栈的形式,前序和后序差不多将根节点先入栈,然后调用一个while循环判断栈不为空,出栈,将该结点添加到vector中。层次遍历说起来更符合人的思维,即用一个队列,将第一层的结点添加到队列,再while中先获取队列的长度,出队列将结点的左右孩子依次添加,第一层出队完毕,就到了第二层,依次往下。然后又看到了几个有意思的面试题,互斥锁和自旋锁的区别,一个需要上下文切换,一个不需要,因为太晚了有些着急回去了,还有TCP和UDP以及函数重载的原理。
2024-09-22 22:17:05
439
原创 DAY02
有复习了一些,new和malloc的区别,只记了两个应该够用一个new能返回有类型的指针,但malloc只能返回void*,另一个是new能调用构造函数,创建对象,例如再堆上创建对象以及delete调用析构函数,说到析构函数,它是可以也必须要当作虚函数的,如果用基类指针指向派生类对象,不设置虚函数就无法事件派生类的析构函数的覆盖,调用派生类的析构函数进而能调用基类的析构函数不会出现内存泄漏的情况。c++11的新特性,范围for循环,auto,智能指针,移动语义,bind和function用于回调。
2024-09-21 19:20:00
319
原创 DAY01
现在我的c++代码量接近2w行左右,八股文和一些简单的STL容器能用的熟练,能根据业务场景将代码磨出来。一直在找工作,由于是应届生的原因,工作不是特别好找,现在身处广州,游戏服务器方向的岗位还是蛮多的。还有快排,二分查找,一些常用的数据结构,都要掌握,虽然我都实现过,但现在难免有些稀松,一定要达到随写随敲的程度。从现在开始,不要再焦虑,不要再陷入无效的忙碌,踏实下心来从头学点东西吧。之前一直用BOSS投简历,一点学习的状态都没有,总是消耗在无效的忙碌上面,基本上上午的时间都莫名奇妙的消失掉了。
2024-09-20 13:44:50
228
原创 即将迈入社会的应届生非科班转码学习心得
值得强调的是格式中第一个类看你想要的返回值类型而确定,而括号中的类视实际情况而定,我目前做题目只遇到过相同的类的对象A与B相加和相乘的运算。每个非静态成员函数只有一份函数实例,上文也提到了静态是大家共享的,非静态一段时间只能有一个对象访问,也就是多个同类型的对象公用这一份代码。this指针指向被调用的成员函数所属的对象,它是隐含在每一个非静态成员函数中的一种指针,不需要定义直接使用。class A和class B这两个类,在A中调用B,直接使用你定义的类“B”这个名称,声明一个新的变量。
2024-03-25 09:47:53
1232
原创 关于做题遇到的新知识点的分享
1.妙用除号(%)与模(/):在一些生成随机数的场景下,可以用除号来控制生成的随机数的范围,例如你创建一个一维数组(arr[10]={1,2,3,4,5,6,7,8,9,10};顾名思义,将新结点插入当前链表的表头(每创建一个结点,就插入头节点的后面),所以读入数据的顺序与生成单链表的元素顺序是相反的。由上知,无论我们输入的什么,我们想要他输出的是字符,我们输入的数字在系统的加工下会自动转化为我们想要的字符,反之亦然。2:输入的是整形(%d)输出的是字符类型(%c)也可以得到想要的结果。
2024-03-17 15:18:12
463
原创 记录,2024/3/13入坑以来的编程问题
第二,最简单的也就是我选择的方法把scanf改为scanf_s,但是这种耍滑头的方法给我带来了一个弊端,就是在你想试图通过使用strcam来比较输入的字符串与代码中已存在的字符串时,会出现异常警告。幸好通过博客知道了有同样遭遇的好友的具体解决方案,只需要在使用scanf_s("%s\n",arr,20)在需要输入的字符串后点个逗号再添加所使用的字符串长度即可。希望日后我打开我的博客,看到我人生中犯的第一个错误时面对错误的态度,也能让我燃起生活的勇气,加油。现在我要去修改我的输入函数了。
2024-03-13 20:28:39
185
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人