Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在SDL2中正确使用按键?_C_Keypress_Rectangles_Sdl 2 - Fatal编程技术网

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…
宏不用于此目的,因此它们是不同的值。可能您遇到分段错误的原因是,这些被定义为远远超出数组长度的大值

“我在启动/编译我的程序后收到故障报告”-它是在编译时发生的,或者它在运行/启动程序后编译并崩溃?我认为它已编译,启动后崩溃。使用调试器,在运行调试器后查看崩溃的位置。这将非常有用。@student96
keystate=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;