C 在SDL2中正确使用按键?
我试图用键盘上的键在窗口中移动一个矩形,但在启动/编译程序后,我得到了一个失败报告C 在SDL2中正确使用按键?,c,keypress,rectangles,sdl-2,C,Keypress,Rectangles,Sdl 2,我试图用键盘上的键在窗口中移动一个矩形,但在启动/编译程序后,我得到了一个失败报告 keystate=NULL; if (keystate[SDLK_LEFT] ) { rect2.x -= 2; } if (keystate[SDLK_RIGHT] ) { rect2.x += 2; } if (keystate[SDLK_DOWN] ) { rect2.y += 2; } if (keystate[SDLK_UP] ) { rect2.y -= 2; } 这是不
keystate=NULL;
if (keystate[SDLK_LEFT] )
{
rect2.x -= 2;
}
if (keystate[SDLK_RIGHT] )
{
rect2.x += 2;
}
if (keystate[SDLK_DOWN] )
{
rect2.y += 2;
}
if (keystate[SDLK_UP] )
{
rect2.y -= 2;
}
这是不起作用的代码。在main()的开头,我写了一行:
Uint8*键状态;
我使用C中的lib SDL.h来实现这一点
故障信息包含:
程序接收信号SIGSEGV
堆栈跟踪在“调用堆栈”选项卡中可用
PS:在我认为发布整个代码之后。它稍作修改:
#包括
#包括
int main()
{
//请求成功执行
if(SDL_Init(SDL_Init_EVERYTHING)!=0)
{
printf(“费勒”);
返回1;
}
//创建窗口800x600
SDL_窗口*win;
win=SDL_创建窗口(“测试”,100100800600,显示SDL_窗口);
//在启用vysnc的情况下创建renderwindow
SDL_Renderer*ren=SDL_CreateRenderer(win,-1,SDL_Renderer_加速| SDL_Renderer_PRESENTVSYNC);
if(ren==NULL)
{
printf(“费勒”);
SDL_退出();
返回1;
}
Uint8*keystate=SDL_GetKeyboardState(NULL);
//不支持布尔数据类型
int gameRunning=1;
SDL_事件;
//创建整个窗口的矩形
SDL_Rect={
0,0,800,600
};
//小矩形
SDL_Rect rect2={
0,0,50,50
};
//同时循环以保持窗口打开
同时(游戏运行)
{
if(SDL_PollEvent(&event))//关闭窗口
{
if(event.type==SDL\u QUIT)
{
gameRunning=0;
}
}
//第一个矩形的颜色(红色)
SDL_SetRenderDrawColor(ren,255,0,0255);
SDL_RenderClear(ren);
SDL_RenderFillRect(ren和rect);
//第二个矩形(蓝色)
SDL_SetRenderDrawColor(ren,0,0255255);
SDL_RenderFillRect(ren和rect2);
//更改/更新渲染
SDL_RenderPresent(任);
//rect2.x+=5.f;
if(按键状态[SDLK_左])
{
rect2.x-=2;
}
if(键状态[SDLK_RIGHT])
{
rect2.x+=2;
}
if(按键状态[SDLK_向下])
{
rect2.y+=2;
}
if(按键状态[SDLK\U UP])
{
rect2.y-=2;
}
}
//释放堆
SDL_(ren),;
SDL_(win);
SDL_退出();
返回0;
}
这些是宏。
您正在将指向NULL的指针偏移一个宏值,然后尝试取消对它的引用。
这就是分段故障(SIGSEGV)的原因
请记住,这是一个内部数组。你不应该释放它!这是一个常见的错误。。。“我正在从库中获取列表的副本,因此我最好稍后将其删除,以避免内存泄漏。”但实际上这不是由SDL_GetKeyboardState
分配的,而函数只是给您一个指向键状态的内部存储的指针。因此,请检查程序的其余部分,如果您正在释放它,请停止它,因为这也会导致应用程序崩溃
编辑 好吧,这才是真正的问题 您正在通过
SDLK\u LEFT
偏移地址键
。SDLK\u…
宏不用于此目的!相反,偏移量为SDL\u SCANCODE\u LEFT
,SDL\u SCANCODE\u RIGHT
,SDL\u SCANCODE\u UP
和SDL\u SCANCODE\u DOWN
由于
SDLK\uu…
宏不用于此目的,因此它们是不同的值。可能您遇到分段错误的原因是,这些被定义为远远超出数组长度的大值键
“我在启动/编译我的程序后收到故障报告”-它是在编译时发生的,或者它在运行/启动程序后编译并崩溃?我认为它已编译,启动后崩溃。使用调试器,在运行调试器后查看崩溃的位置。这将非常有用。@student96keystate=NULL
,然后读取keystate[anything]
将出错,因为您试图取消引用无效指针。也许你的意思是keystate=SDL\u GetKeyboardState(NULL)代码>当我这样做时,我得到了失败:“初始化从指针目标类型丢弃'const'限定符”我修改了代码,但我和以前一样有同样的问题。也许当我发布整个源代码时会有所帮助(它不是很长)。我将在我的问题中对其进行编辑。我对其进行了编辑,问题是您应该使用SDL\u SCANCODE\u…
s而不是SDLK\u…
s。
#include <stdio.h>
#include <SDL2/SDL.h>
int main()
{
//Request successful execute
if(SDL_Init(SDL_INIT_EVERYTHING)!=0)
{
printf("fehler");
return 1;
}
//create window 800x600
SDL_Window *win;
win = SDL_CreateWindow("test",100,100,800,600,SDL_WINDOW_SHOWN);
//create renderwindow with vysnc enabled
SDL_Renderer *ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
if(ren==NULL)
{
printf("Fehler");
SDL_Quit();
return 1;
}
Uint8 *keystate=SDL_GetKeyboardState(NULL);
//boolean data type not supported
int gameRunning = 1;
SDL_Event event;
//create rectangle which is the whole window
SDL_Rect rect={
0,0,800,600
};
//smaller rectangle
SDL_Rect rect2={
0,0,50,50
};
//while loop to hold the window opened
while (gameRunning)
{
if (SDL_PollEvent(&event))//close the window
{
if (event.type == SDL_QUIT)
{
gameRunning = 0;
}
}
//color of the first rectangle(red)
SDL_SetRenderDrawColor(ren, 255,0,0,255);
SDL_RenderClear(ren);
SDL_RenderFillRect( ren, &rect );
//second rectangle (blue)
SDL_SetRenderDrawColor(ren, 0,0,255,255);
SDL_RenderFillRect( ren, &rect2 );
//change/update the render
SDL_RenderPresent(ren);
//rect2.x+=5.f;
if (keystate[SDLK_LEFT] )
{
rect2.x -= 2;
}
if (keystate[SDLK_RIGHT] )
{
rect2.x += 2;
}
if (keystate[SDLK_DOWN] )
{
rect2.y += 2;
}
if (keystate[SDLK_UP] )
{
rect2.y -= 2;
}
}
//give heap free
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
Uint8* keys = SDL_GetKeyboardState(NULL); // NOT "keys = NULL;"
if (keys[SDLK_LEFT]) rect2.x -= 2;
if (keys[SDLK_RIGHT]) rect2.x += 2;
if (keys[SDLK_DOWN]) rect2.y += 2;
if (keys[SDLK_UP]) rect2.y -= 2;