这是我从2017年开始在 Heabot 论坛(已关停)编写的一系列关于 GameMaker 8.0 的教程,最早是想写在贴吧,但是贴吧嘛懂得都懂,格式乱+不能二次编辑+吞贴,于是选择了 Heabot 论坛。 该教程从 2017 年一直写到 2019 年才完成大部分内容,并且之后也一直有在增加新的内容,涵盖从完全新手入门到精通 GameMaker 8.0 的一切内容,如果对 GameMake...

GameMaker 8.0 从入门到入土
抓包查看 UVC 设备选择的分辨率与帧率
使用工具: Bus Hound, USB Device Tree Viewer 打开 Bus Hound,转到 Devices 选项卡,在设备列表中找到想抓包的 UVC 设备,勾选其 UVC interface。如果你不确定,可以把全部勾上,不影响: 通常,Video 帧数据通过 ISOC 传输,为了避免巨量的帧数据影响我们抓包,我们可以在 Settings 选项卡里把 ISOC 取...
C++ Coroutine VS Rust Async
在 C++20 中,我们有 Coroutine,在 Rust 中,我们有 Async。严格来说,二者之间没有完全等效的概念,但是我们可以找到一些相似之处,进而了解 C++ Coroutine 与 Rust Async 设计上的异同点。 由于我的上一篇文章介绍了 C++ 的 Coroutine,因此我们本文主要以 C++ Coroutine 的视角来看 Rust 的 Async。 为了更好...
初探 C++20 Coroutine
前言 近段时间研究了一下 C++20 的协程(Coroutine),大概了解了其中的工作原理,做一下记录。 初次接触 Coroutine 时,给我的感觉是一脸懵逼的。和其他语言简单的 async、await 不同,想要使用 C++20 的 Coroutine,它要求你定义一个包含 promise_type 的类型,其中 promise_type 又需要至少包含 get_return_ob...
[C++] std::function 是如何实现 lambda 递归的
我们都知道,C++ 是不允许 lambda 函数递归调用自己的,如果想要递归,最好的办法就是使用 std::function: #include <functional> #include <iostream> int main() { std::function<unsigned(unsigned)> fact = [&fact](uns...
[Rust] 当实例被移动时,究竟发生了什么?
前言 本文并不是移动语义的教程,并且本文假设你已经看过 the Book,已经了解了 Rust 中所有权的概念。 本文包含汇编和 MIR,但是并非需要了解汇编和 MIR 才能看懂。只要跟随本文的思路,即使以前不懂汇编和 MIR,也可以理解本文所表达的意图。 从汇编看移动 先简简单单 wrapper 一个 i32: use std::fmt::Debug; #[derive(Deb...
为什么我反对炒作中文编程
什么是中文编程 中文编程(或者称为中文编程语言)是指使用中文来书写的程序设计语言,其目的是为了减少对英语的学习,将精力集中在程序设计上,并且便于程序交流和代码维护。 摘自百度百科。 我认为中文编程可以从浅入深地划分为三种类型: 使用中文标识符 使用中文关键字 使用中文语法 使用中文标识符 这种中文编程是入门门槛最低的:绝大部分现代语言的编译器都支持 Uni...
记录在 Qt 重写事件时犯的蠢
前段时间,我想要通过提供选项框的形式来允许用户自定义界面 UI 的字体和大小,就像这样: 然后生成形如 * { ... } 的 QSS 字符串,通过 qApp->setStyleSheet(qss) 应用给所有窗口组件。 然而奇怪的事情出现了,我在主界面有两个 QTextBrowser 组件,一个是通过 new QTextBrowser 出来然后 addWidget 到布局上的...
Rust 2022 年稳定的语法
概览 在整个 2022 年,Rust 一共发布了 1.58.0 ~ 1.66.0 共 9 个版本,让我们感谢 Rust 团队一整年的付出。 通常来说,大部分人都不是喜欢追着 Release Note 啃的类型,因此对于大部分人而言,Rust 的语法就只有书上写出来的那一些。这也是我撰写这篇文章的目的:总结和记录 Rust 整个 2022 年稳定的语法,让更多人意识到 “原来 Rust 还...
C++ Concept 重载决议探讨
测试环境 OS: Ubuntu 22.04 CC: GCC 11.2.0 重载决议 重载决议(Overload Resolution)的定义,摘自 cppreference: 为了编译函数调用,编译器必须首先进行名字查找,对于函数可能涉及实参依赖查找,而对于函数模板可能后随模板实参推导。如果这些步骤产生了多个候选函数,那么需要进行重载决议选择将要实际调用的函数。 ...