gpt4 book ai didi

C SDL 对象移动流程

转载 作者:行者123 更新时间:2023-11-30 17:05:57 25 4
gpt4 key购买 nike

我刚刚开始使用 SDL,制作了一个在窗口上移动的小方 block 。我使用了 DL_GetKeyboardState,并且让它移动得相当顺利。然而,当我按住一个键开始向一个方向移动时,它会移动一点,停止,然后按照我想要的方式移动。这会破坏平滑度。我最好的猜测是它等待鼠标双击,但我不确定。有什么建议么?

代码:

#include <stdio.h>
#include <SDL.h>

int main(int argc, char * argv[])
{
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Event event;

SDL_Init(SDL_INIT_VIDEO);
window = SDL_CreateWindow("Yelda!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 1600, 1200, 0);
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

const Uint8 *state;
int run = 1;
int xpos=300;
int ypos=300;
int projectileYPos;
int projectileXPos;
int loop;
int lanceLength = 10;

while(run)
{
while(SDL_PollEvent(&event))
{
state=SDL_GetKeyboardState(NULL);

if(state[SDL_SCANCODE_ESCAPE])
run=0;
if(state[SDL_SCANCODE_W])
ypos-=10;
if(state[SDL_SCANCODE_S])
ypos+=10;
if(state[SDL_SCANCODE_A])
xpos-=10;
if(state[SDL_SCANCODE_D])
xpos+=10;

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 255, 255, 255 ,255);
SDL_Rect rect = {xpos, ypos, 20, 20 };
SDL_RenderFillRect(renderer, &rect);
SDL_RenderPresent(renderer);

SDL_Delay(20);
}
}

SDL_DestroyWindow(window);
SDL_DestroyRenderer(renderer);
SDL_Quit();
return 0;
}

最佳答案

SDL wiki表示您应该使用 SDL_PumpEvents() 来更新键盘状态数组。

事实上,如果我们

  • 删除 while(SDL_PollEvent(&event)) 循环(不是其内容),因为不需要它,
  • state=SDL_GetKeyboardState(NULL); 移至 while(run) 循环之前(数组的地址“将在应用程序的整个生命周期内有效”) ,所以它总是返回相同的指针),并且
  • 仅在循环内调用 SDL_PumpEvents()

那么 Action 就顺利了。

关于C SDL 对象移动流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35027446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com