使用OpenGL渲染一个立方体
本文将介绍如何使用最为常用的图形 API —— OpenGL 来渲染一个立方体,代码部分来自于《Computer Graphics Programming in OpenGL with C++》,并加入了自己的理解。
基本过程环境配置在编写程序之前,需要先配置好一些有助于程序编写的第三方库,本次实验需要用到的库有三个:用于窗口管理的 GLFW 库,扩展功能的 GLEW 库,以及用于数学运算的 GLM 库。
IDE 使用的是 Visual Studio 2019,并安装了 GLSL Language Integration 插件来实现 glsl 语言的代码高亮和自动补全。
具体的环境配置过程在此不过多赘述,本文主要聚焦于代码的实现。
窗口的创建要将渲染的图像显示出来,就需要创建一个特定的显示窗口,首先通过 glfwWindowHint() 指定 OpenGL 的版本号,再使用 glfwCreateWindow() 创建 GLFW 窗口。由于创建 GLFW 窗口并不会自动将它与当前 OpenGL 上下文关联起来,因此还需要调用 glfwMakeContextCurrent().
为了防止 ...
LeetCode周赛总结 第276场
本次周赛相对比较简单,前三题花的时间比较短,但无奈最后一题还是没思路。。。
将字符串拆分成若干长度为 k 的组题目链接将字符串拆分成若干长度为 k 的组
解题思路遍历字符串 s 的每个字符并加入到一个临时字符串中,当此临时字符串长度为 k 时,加入到结果数组中并清空此字符串。若此时遍历到字符串的最后一个字符且此时临时字符串长度没有达到 k 时,则向其末尾填入字符 fill 直到临时字符串长度达到 k,再加入到结果数组中。
解题代码class Solution {
public:
vector<string> divideString(string s, int k, char fill) {
vector<string> res;
string newStr;
for (int i = 0; i < s.size(); i++) {
newStr += s[i];
if (newStr.size() == k) {
...
2021年游戏总结 下
本文承接上文,继续聊聊 2021 年我所体验的一些游戏。
伊苏8:丹娜的陨涕日今年玩过最喜欢的 jrpg 作品,几乎满足了我对于一款优秀 jrpg 的全部幻想。
战斗方面爽快而又不失深度。伊苏系列向来以高速的即时制战斗著称,本作也不例外,角色与敌人的动作都相对较快,技能无冷却加之技能槽的回复速度很快,因此本作的战斗与大部分 jrpg 讲究策略的慢节奏战斗有很大不同。但这并不意味着本作战斗就十分无脑,弹反、极限闪避、弱点属性等机制的加入很好的提升了战斗系统的深度。
本作的剧情也很优秀。剧情悬念设置十分得当,给予玩家很强的故事驱动力,人物塑造极佳,进一步增强代入感。
本作最值得夸赞的还是地图探索方面的体验。本作采用的是一个非常典型的“银河恶魔城”式的地图设计,玩家需要探索地图的各个角落,从而解锁新的能力,再次进行更深一步的探索。同时本作探索不光局限于对于物品的获取,还包括了 npc 的发现,这一切与 jrpg 的强故事驱动相结合,使得探索欲望进一步上升。
最后讲讲我对于本作不满的地方。首先是本作的保卫战部分,这部分实属多余,不仅不有趣,还很大程度破坏了地图探索的连贯性与叙事节奏,纯粹 ...
2021年游戏总结 上
转眼间 2021 年已经过去,这一年间也体验了很多不同平台、不同类型的作品。本文将对此做一个小小的总结,内容主要是个人对 2021 年玩过的游戏的一些个人想法。此外,由于篇幅受限,因此并不会包含所有的游戏,部分体验不够深入的或者无话可聊的游戏将不会出现。
双人成形这算是今年玩过的最开心的游戏了,和两个室友花了大概 15 小时通关。
游戏在本身的关卡设计就很优秀,在融合了双人机制下更加显得精妙。且游戏对于资源的利用可谓毫不吝啬,每一大关就完全舍弃掉之前机制,完全变成“另一个游戏”。虽然这样各种机制浅尝辄止的设计理念可能会带来所谓的游戏深度不足,但这并不是本作所追求的,本作就是想给玩家一个极为丰富的一周目流程。仔细想想现在很多游戏的流程越来越长,但很多内容都是注水的,玩家在这些重复劳动的过程中可能会对游戏失去兴趣,最终导致游戏烂尾。而双人成形就是一个每个关卡细节精心编排打磨,每种机制总能在玩家感到无聊之前及时结束,从而转向新的机制。我在实际游戏过程中的感受也是如此,对之后关卡机制的期待是我在现在大部分游戏中所体会不到的。
还有一点值得提的就是本作的箱庭式关卡设计,几乎每个关 ...
记一次CTF校赛
本文记录一下刚刚结束的CTF校赛,感觉本次校赛题目出得实在有点坑,但也算学到了不少东西。
Cryptoeasy_ECC问题描述已知椭圆曲线加密Ep(a,b)参数为
p = 15424654874903
a = 305423748
b = 315284355172
G(15079176652031,83237376468)
私钥为
k = 655321
求公钥K(x,y)
思路常规的椭圆曲线加密问题,直接根据加密原理编写解密程序,得到两个结果。根据问题提示,考虑 flag 为两数的异或结果。
解密脚本def add(A, B):
if A == (0, 0):
return B
if B == (0, 0):
return A
x1, y1 = A
x2, y2 = B
if A != B:
λ = (y2 - y1) * pow((x2 - x1), p - 2, p)
else:
λ = (x1 * x1 * 3 + a ...
C++比较函数cmp
本文将简单介绍C++比较函数 cmp.
排序函数sort()sort函数是我们常用的库函数,它的参数如下:
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare cmp);
通过传入容器的迭代器(或指针),我们可以对指定位置进行排序:
vector<int> nums = { 1,3,2,4,5 };
sort(nums.begin(), nums.end()); //排序得到nums = { 1,2,3,4,5 }
可见,sort 函数的比较函数 cmp 默认参数为升序排列,当然也可以自定义函数来实现不同的排序方法。
比较函数cmp()自定义比较函数首先编写一个示例用以解释:
struct MyStruct {
int weigth;
string str;
};
bool cmp(const MyStruct& ms1, const MyStruct& ms2) {
retu ...
位运算基础及应用
计算机中的数据以二进制的形式存储,即0、1两种状态。位运算就是直接对整数在内存中的二进制位进行操作。本文将介绍位运算的各操作符以及常见应用。
操作符&(与)参加运算的两个数据,按二进制位进行与运算。(两位都为1时才为1,否则为0)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行与运算得:0100 = 4. 即 12 & 5 = 4.
|(或)参加运算的两个数据,按二进制位进行或运算。(两位都为0时才为0,否则为1)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行或运算得:1101 = 13. 即 12 | 5 = 13.
^(异或)参加运算的两个数据,按二进制位进行异或运算。(相同为0,不同为1)
例如 12 和 5 两个数,二进制形式分别为 1100、0101. 逐个按位进行异或运算得:1001 = 9. 即 12 ^ 5 = 9.
~(取反)参加运算的数据,其各二进制位进行取反运算。(0变成1,1变成0)
例如 5,对于一个 int16 型数据,它的二进制形式为 0 000 0000 0000 0 ...
链表连接出错
太久没接触数据结构了,导致链表这一块的内容有点生疏了,这两天在做一道链表相关的题时出现了一点问题,在此记录一下以免之后再犯。
问题描述题目链接两数相加
链表定义struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
ListNode(int x, ListNode *next) : val(x), next(next) {}
};
解题思路本题很常规,两链表相应位相加得到新链表对应位的值。首先要创建两个个空指针,一个作为新链表的头节点,指向两数相加结果的第一位;一个用以指向链表的子节点,并为其赋值两链表对应位的值相加的结果,最后返回头节点。
错误代码class Solution {
public:
ListNode* addTwoNumbers(Lis ...
ZIP格式分析
最近遇到一道CTF题是和zip格式编码相关的,正好我一直以来就对各文件格式编码没有一个系统的认知,就趁这个机会好好学习一下。
简介
ZIP文件格式是一种数据压缩和文档储存的文件格式,原名Deflate,发明者为菲尔·卡茨(Phil Katz),他于1989年1月公布了该格式的资料。ZIP通常使用后缀名“.zip”,它的MIME格式为application/zip。当前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7z格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。Microsoft从Windows ME操作系统开始内置对zip格式的支持,即使用户的计算机上没有安装解压缩软件,也能打开和制作zip格式的压缩文件,OS X和流行的Linux操作系统也对zip格式提供了类似的支持。因此如果在网络上传播和分发文件,zip格式往往是最常用的选择。
官方文档如果想要准确系统的了解整个zip格式,最好还是查看官方文档,链接如下:
.ZIP File Format Specification
格 ...
hexo博客的备份与恢复
为了防止误操作或计算机崩溃导致的博客源文件丢失,或满足我们更换电脑进行写作的需求,定期进行备份与恢复就显得很重要了。
备份需备份的文件目录我们在进行备份时,并不需要将整个博客目录全部备份,只备份以下几个用户自定义的即可:scaffolds目录,source目录,themes目录,.gitignore文件,_config.yml文件,package.json文件,其他都是通用的。
首先我们先来观察整个博客目录的结构:
.deploy_git 本目录会在我们部署时生成,也就是github上保存的文件,无需备份。
node_modules 本目录包含了hexo博客依赖的模块,安装时自动生成,无需备份。
public 与.deploy_git类似,是编译后生成的文件静态网页文件,无需备份。
scaffolds 保存了用户文章的模板,需要备份。
source 保存了用户文章的源文件,需要备份。
themes 保存了用户下载的主题文件与配置,需要备份。
.gitignore 保存了推送到github时忽略的文件名,需要备份。
_config ...