4

我想我有一个普遍的问题。

我目前正在学习 C++ 和 SDL 2.0。SDL 提供了一个函数,该函数返回一个指向包含所有键状态的 const uint * 的指针。

这些是我想使用的变量:

const Uint8* oldKeyState;
const Uint8* currentKeyState;

在我的 input.cpp 的构建中:

currentKeyState = SDL_GetKeyboardState(&this->length);
    oldKeyState =  currentKeyState;

在我使用的 Update() 方法中:

oldKeyState = currentKeyState;
currentKeyState = SDL_GetKeyboardState(NULL);

但是,我没有复制最后一个值,而是提供一个指向 oldKeyState 的指针,该指针又指向当前的键状态。

那么如何将变量指针中的实际值复制到当前和旧的键状态呢?我不希望指针处于旧键状态,因为我将无法检查以前的状态是否为 UP 而新状态是否为 DOWN。

4

4 回答 4

3
Uint8 oldKeyState[SDL_NUM_SCANCODES];

// ...

memcpy(oldkeystate, currentKeyState, length);
于 2013-12-02T06:57:39.400 回答
2

您正在调用的函数的签名是

const Uint8* SDL_GetKeyboardState(int* numkeys)

这个函数有返回类型const Uint8*,这意味着它返回一个指向字节的指针。(它不返回指向指针的指针。)根据文档,这个返回的指针实际上指向一个数组Uint8(一个Uint8不足以编码键盘上所有键的状态),并且指向的值bynumkeys被该数组的长度(即键的数量)覆盖。因此,要保留数组中的值,您需要分配一个与存储的长度相同的内存区域this->length,然后将该内存从 SDL 的数组复制到您自己的数组中。然后,您需要保留一个指向您自己的数组的指针,以供您继续使用。因为 SDL 表示返回的指向数组的指针在应用程序的整个生命周期内都有效,所以您可以假设长度不变,因此您不必担心调整数组的大小,但您应该担心释放该内存当你完成它时。

于 2013-12-02T06:56:33.587 回答
2

所以,我认为 SDL 主要是一个 C 库。

SDL_GetKeyboardStateconst Uint8*返回的值是指向数组中第一个元素的指针。如果要复制给定状态以供以后参考,通常需要一个数组来复制它们,并需要一个 for 循环来进行复制。例如:

currentKeyState = SDL_GetKeyboardState(&this->length);
savedKeyState = malloc(this->length*sizeof(Uint8));
for(int i=0; i<&this-length, i++) savedKeyState [i] = currentKeyState[i];

当然,很差的代码,使用矢量可能是一种更好的方法,例如:

currentKeyState = SDL_GetKeyboardState(&this->length);
vector savedKeyState(currentKeyState, currentKeyState+length);
于 2013-12-02T06:58:08.290 回答
1

你在这里遇到的问题是你试图将指针复制到一个永远不会改变的 const 数组。结果,您将看到两个指针都指向相同的内存地址,并且您永远不会有两个输入状态副本,可让您检查是否按下了按键。

相反,您应该使用 memcpy 将一个数组复制到另一个数组。但为了这样做,您应该将 oldKeyState 的类型更改为 just Uint8*,否则复制到 const 数组时会出错。

所以,代码最终应该是这样的:

const Uint8 * currentKeyState;
Uint8 * oldKeyState;

...

//Constructor
currentKeyState = SDL_GetKeyboardState(&this->length);
oldKeyState = new Uint8[this->length];

...

//Input update
memcpy(oldKeyState, currentKeyState, this->length);
SDL_PumpEvents(); //Copy the array before calling PumpEvents()!
currentKeyState = SDL_GetKeyboardState(NULL);
于 2013-12-02T17:58:27.323 回答