【发布时间】:2020-10-02 22:56:54
【问题描述】:
我正在制作一个游戏,当按下空间射击敌人时,坦克的喷嘴会旋转。但是,刚开始按下空格时,它似乎停止了几毫秒,然后继续没有任何问题。我怎样才能使它从一开始就在按下空间时使旋转平滑且一致?这是一个最小的可重现示例:
#include "SDL.h"
#include <iostream>
class Nozzle
{
public:
void draw(SDL_Renderer* renderer, int cx, int cy, int l)
{
float x = ((float)cos(angle) * l) + cx;
float y = ((float)sin(angle) * l) + cy;
SDL_RenderDrawLine(renderer, cx, cy, (int)x, (int)y);
}
void plusAngle(float a)
{
angle += a;
}
private:
float angle = 0.0f;
};
int main(int argc, char* argv[])
{
SDL_Window* window = SDL_CreateWindow("RGame", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1200, 600, false);
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);
SDL_Event event;
Nozzle nozzle;
bool running = true;
while (running)
{
while (SDL_PollEvent(&event))
{
if (event.type == SDL_QUIT)
running = false;
if (event.type == SDL_KEYDOWN)
{
if (event.key.keysym.sym == SDLK_SPACE)
nozzle.plusAngle(0.1f);
}
}
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
SDL_RenderClear(renderer);
SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
nozzle.draw(renderer, 600, 300, 70);
SDL_RenderPresent(renderer);
}
SDL_DestroyWindow(window);
SDL_Quit();
return 1;
}
【问题讨论】:
-
个人资料。通过分析找出延迟的位置。猜测没有用(那是浪费你的时间)。您也可以使用“基准测试”。在互联网上搜索“C++ 配置文件”并添加您的 IDE 或编译器。
-
很久以前,在现在的银河系中,当计算机速度很慢时,有多个“帧”缓冲区。当硬件绘制另一个帧缓冲区时,处理器将绘制到一个帧缓冲区中。将使用多个缓冲区来平滑感知速度。
-
@ThomasMatthews -:) 谢谢你的建议。我可能会研究如何做你在未来的建议,因为我不知道,因为我是初学者。但我不认为延迟是这里的问题。我读取键的方式可能有问题,因为即使我不渲染任何东西并且只打印“应该旋转的喷嘴”,结果也是一样的(有点延迟并继续)
-
你只是看到键盘自动重复吗?