【2D割草类游戏 - 02】非基础变量类型
在进行游戏开发时,由于要考虑兼容性问题,所以很多时候不能直接使用基础类型,如char类型。这里就记录一下游戏中用到的非基础类型
字符编码
在说明类的选择前,需要先说明不同字符编码的不同
在使用MBCS字符编码等的情况下,英文字符的字符编码,每个字符占一字节;但是中文字符等字符编码,每个字符占两字节
这时如果直接使用char类型存储字符,就会产生问题,当存储英文字符时,char类型占1字节,当存储中文字符时,占两字节
所以就出现了Unicode字符编码,这种编码可以使所有字符都统一为固定字节
Unicode
特点
Unicode本身是一种全球字符编码方案,几乎覆盖了全球所有的绝大多数字符
Unicode设计了多种编码方案(如UTF-8、UTF-16、UTF-32)来适应不同的存储和传输需求。这些编码方案能够有效地处理从单一字节到四字节不等的字符表示,保证了编码的灵活性和高效性
Unicode兼容ASCII编码,因为Unicode将前128个字符设计的与ASCII保持一致
编码方案
Unicode有以下几种编码方案:
- UTF-8:
这是一种可变长的字符编码方案,使用1到4个字节表示每个字符,具有很好的兼容性和灵活性,特别适合网络传输,是互联网上最常用的Unicode实现方式。
这种编码方案可以编码所有的Unicode字符。 - UTF-16:
使用2个或4个字节表示每个字符,是许多现代操作系统和程序环境的内部编码方式,如Java和Windows。
这种编码方案使用2字符表示常用字符,使用4字符表示补充字符 - UTF-32:
每个字符固定使用4个字节,简化了字符的处理,但相比于UTF-8和UTF-16,它的数据量要大得多。
由于其固定长度的特性,它通常在内存中用于快速访问。
Windows API
在Windows中,为了消除各编译器间的差距,提高兼容性,定义了一些新类型
TCHAR、wchar_t与char
wchar_t
wchar_t是一种C++中的类型,用于表示16位的Unicode字符
- w代表wide,即宽字符;t代表type
- wchar_t的长度由编译器决定,在VS下为2字节
- wchar_t其实是用typedef定义的一个别名,2字节下相当于unsigned short;4字节下相当于unsigned int
wstring是一种Unicode字符串
对应方法
wchar_t类型不能直接使用一般的字符或字符串操作函数,而是要使用前面加上w的版本,如wprintf、putwchar
可以使用TEXT函数将char转换为wchar_t:
wchar_t wch[5]=TEXT("test");
指定
在字符串前加上L可以指定该字符串为宽字符串,使用wchar_t存储:
wchar_t a[] = L"我爱中国";
TCHAR
TCHAR是一种动态编译类型,根据条件动态编译为wchar_t或char
当没有定义_UNICODE
宏时,TCHAR
= char
,_tcslen
= strlen
当定义了_UNICODE
宏时,TCHAR
= wchar_t
, _tcslen
= wcslen
:
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
对应方法
TCHAR同样不能直接使用一般的字符或字符串操作函数,如:
_stprintf_s( char *buffer, size_t sizeOfBuffer, const char *format, [argument]);
t代表TCHAR,后边的s代表内存检查,即安全的securirty
- buffer:输出的字符
- sizeofbuffer:buffer长度,可省
- format:格式字符串,指定如何将参数插入到字符串中
- argument:可变数量的参数,它们将按照format字符串中指定的顺序和格式被插入到字符串中
例:
char buffer[32];
int number = 123;
// 使用 _stprintf_s 函数将整数和字符串格式化为一个字符串
_stprintf_s(buffer, sizeof(buffer), "Number: %d, String: hello world", number);
指定
在字符串前加上_t可以指定该字符串为TCHAR类型字符串:
TCHAR tch[] = _T("Hello World");
BYTE、WORD、DWORD
由于int的大小会随着机器位数的不同而变化,所以产生了这几种类型
定义:
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
- BYTE是无符号char类型,1字节
- WORD是无符号short类型,2字节
- DWORD是无符号long类型,4字节
BYTE类型非常灵活,因为它只定义了占1字节,但没有定义此类型的作用是什么,可表示0~255
DWORD常用于保存地址或存放指针
size_t
size_t是一个无符号整数类型
size_t 的大小取决于编译器和操作系统的位数,但通常它被定义为足以容纳系统中最大可能的对象的大小的无符号整数类型。例如,在32位系统上,size_t通常是32位无符号整数,而在64位系统上,它通常是64位无符号整数
用size_t的好处在于它提供了跨平台的可移植性,因为它的大小会根据底层系统的特性而自动调整。
由于size_t类型的非负性和大小,它常用来安全地存储对象(包括数组)的大小、数组的索引(下标)
例:
char array[10];
size_t size = sizeof(array); // 获取数组的大小
for (size_t i = 0; i < size; ++i)
{
array[i] = i; // 在数组中存储索引值
}
LPCTSTR
- L是long的首字母
- P是point的首字母,代表指针
- C是const的首字母
- T代表_T,即表示TCHAR类型
- STR代表string
LPCTSTR就代表上述的字符串常指针
POINT
POINT是C++中的一个结构体类型,用来表示一个点,包括在Windows.h
下
typedef struct tagPOINT {
LONG x;
LONG y;
} POINT, *PPOINT, *NPPOINT, *LPPOINT;
RECT
RECT是C++中的一个结构体类型,用于表示一个矩形,包括在Windows.h
下
typedef struct tagRECT {
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT, *PRECT, *NPRECT, *LPRECT;
EasyX
ExMessage
这是一个用于保存鼠标消息的结构体
struct ExMessage
{
USHORT message; // 消息标识
union
{
// 鼠标消息的数据
struct
{
bool ctrl :1; // Ctrl 键是否按下
bool shift :1; // Shift 键是否按下
bool lbutton :1; // 鼠标左键是否按下
bool mbutton :1; // 鼠标中键是否按下
bool rbutton :1; // 鼠标右键
short x; // 鼠标的 x 坐标
short y; // 鼠标的 y 坐标
short wheel; // 鼠标滚轮滚动值,为 120 的倍数
};
// 按键消息的数据
struct
{
BYTE vkcode; // 按键的虚拟键码
BYTE scancode; // 按键的扫描码(依赖于 OEM)
bool extended :1; // 按键是否是扩展键
bool prevdown :1; // 按键的前一个状态是否按下
};
// 字符消息的数据
TCHAR ch;
// 窗口消息的数据
struct
{
WPARAM wParam;
LPARAM lParam;
};
};
};
具体可以参考EasyX的官方文档
IMAGE
这是一个存储图像的类
class IMAGE(int width = 0, int height = 0);
这个类中含有两个公有成员,并重载了等于号,从而可以直接对IMAGE对象赋值,一般用于拷贝源图像
int getwidth();
//返回 IMAGE 对象的宽度,以像素为单位
int getheight();
//返回 IMAGE 对象的高度,以像素为单位
具体可以参考EasyX的官方文档
参考文章
1.一篇文章带你彻底搞懂Unicode、UTF-8、GB2312、GBK之间的关系_gb2312 utf-8-CSDN博客
2.什么是 LPCTSTR?和 char* 有什么关系? - CodeBus
3.在程序中正确使用 Unicode 和 MBCS 字符集 - CodeBus
4.C++字符类型TCHAR、char和wchar_t_tchar类型字节-CSDN博客
5.C语言中宽字符/宽字符串的输入输出(wchar_t和wprintf)_c语言wchar-CSDN博客
6._stprintf_s和_stscanf_s函数与UNICODE编码-CSDN博客
7._stprintf_s和_stscanf_s-CSDN博客
8.std::size_t - cppreference.com
9.C++ 中的size_t - 知乎 (zhihu.com)
10.C++中BYTE、WORD、DWORD的作用以及区别_c++ dword-CSDN博客
11.EasyX 文档 - 基本说明
评论区