首页
Nihil
取消

GameMaker 8.0 从入门到入土

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

记录在 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: 为了编译函数调用,编译器必须首先进行名字查找,对于函数可能涉及实参依赖查找,而对于函数模板可能后随模板实参推导。如果这些步骤产生了多个候选函数,那么需要进行重载决议选择将要实际调用的函数。 ...

Type-C 接口 CC 针脚的工作模式

Type-C 接口 Type-C 接口的规范大致与 USB 3.1 规范同时期发布,但是由于在 USB 3.2 规范中才引入了 Type-C 的双通道传输模式,因此我们通常仅基于 USB 3.2 及以后的规范版本来讨论 Type-C 接口。 Type-C 接口的针脚定义我曾经在 USB 2.0 与 USB 3.2 一文中介绍过,为了方便,我将其搬运到本文中: Type-C 公头针脚定...

Android C++ 生成 compile_commands.json

Android C++ 程序开发现状 在 Android 下开发 C++ 程序,我见过绝大多数人都是不使用任何语法插件,就靠硬写,写完之后再根据编译报错来修改语法错误。这也怪不得程序员,一方面,Android 使用 Arm 平台的 clang 编译器,跟 x86 平台的开发环境并不是很兼容;另一方面,Android 要求我们将 C++ 程序放在 vendor 目录下,但是我们包含的头文件却...

C++20 Concept

模板 在为静态类型语言开发代码时,我们很经常遇到这样的情况:我们需要为多个数据类型实现相同的功能。放在 C 语言中,我们不得不为他们各自定义一个函数或结构体,例如: int add(int x, int y); unsigned addu(unsigned x, unsigned y); float addf(float x, float y); // ... struct Vecto...

Qt 计时器 QTimer 的妙用

QTimer 基础用法 QTimer 提供了计时器的高级编程接口,我们可以通过 Qt 的信号槽机制快速启用一个定时器: QTimer *timer = new QTimer(this); connect(timer, &QTimer::timeout, recv, &recv::slot_function); timer->start(1000); 这将会使 r...

在高版本系统上为 Qt6 生成 AppImage

前言 目前,大部分的 AppImage 的教程与工具都建议你在最低所支持的系统上进行编译打包,这是由于 Linux 系统的兼容性,在旧版本系统打包的软件可以正常在新版本系统中运行,反过来则不行。 但是这一点对于 Qt 用户尤其是 Qt6 用户而言很不友好:一方面,在旧版本的 Linux 系统上很难安装高版本的 Qt,另一方面,过于老旧的 GCC 不支持大量的 C++ 新特性,需要对代码进...

GNU C 一些有趣的扩展语法

复合语句作为表达式 在使用 Rust 的过程中,常常会觉得 Rust 任何一个 block 都能返回值的特性太赞了,这可以极大地限制一些临时变量的作用域,例如: fn main() { let value: Option<u8> = { let string = "123".to_owned(); if let Ok(temp) = s...