Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++_Visual Studio 2010_Sdl_Sdl 2 - Fatal编程技术网

C++ SDL2:如何沿方形路径移动图像?

C++ SDL2:如何沿方形路径移动图像?,c++,visual-studio-2010,sdl,sdl-2,C++,Visual Studio 2010,Sdl,Sdl 2,我正在尝试制作一个程序来运行模拟。我希望模拟能够沿着设定的路径移动一个小图像或精灵,就像从一个正方形的一个角移动到另一个角,就像它在绘制它一样。我还希望在按下键盘上的一个键时触发模拟,但在移动图像后刷新图像时遇到一些困难 例如,我希望图像向左移动50个像素,然后向上移动50个像素,然后向右移动50个像素,然后向下移动50个像素,每次移动后,只需按键盘上的“1”键,即可刷新屏幕上的图像 这是我到目前为止的代码,主要是从教程中提取的,目前只是在每次按下时将图像移动4个像素,我不确定如何从这里开始:

我正在尝试制作一个程序来运行模拟。我希望模拟能够沿着设定的路径移动一个小图像或精灵,就像从一个正方形的一个角移动到另一个角,就像它在绘制它一样。我还希望在按下键盘上的一个键时触发模拟,但在移动图像后刷新图像时遇到一些困难

例如,我希望图像向左移动50个像素,然后向上移动50个像素,然后向右移动50个像素,然后向下移动50个像素,每次移动后,只需按键盘上的“1”键,即可刷新屏幕上的图像

这是我到目前为止的代码,主要是从教程中提取的,目前只是在每次按下时将图像移动4个像素,我不确定如何从这里开始:

int main(int argc, char ** argv)
{
// variables

bool quit = false;
SDL_Event event;
int x = 360;
int y = 240;

// init SDL

SDL_Init(SDL_INIT_VIDEO);
SDL_Window * window = SDL_CreateWindow("SDL2 Keyboard/Mouse events", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 800, 600, 0);
SDL_Renderer * renderer = SDL_CreateRenderer(window, -1, 0);

SDL_Surface * image = SDL_LoadBMP("Star.bmp");
SDL_Texture * texture = SDL_CreateTextureFromSurface(renderer, image);
SDL_FreeSurface(image);

SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);

// handle events

while (!quit)
{ 

    switch (event.type)
    {
    case SDL_QUIT:
        quit = true;
        break;

    case SDL_KEYDOWN:
        switch (event.key.keysym.sym)
        {

        case SDLK_1:  

            x-=4; 

            break;

        case SDLK_2: 

            x+=4; 

            break;

        case SDLK_3:

            y-=4;

            break;

        case SDLK_4:

            y+=4;

            break;

        }
        break;
    }

   SDL_Rect dstrect = {x, y, 75, 75};

   SDL_RenderClear(renderer);
   SDL_RenderCopy(renderer, texture, NULL, &dstrect);
   SDL_RenderPresent(renderer);
}

// cleanup SDL

SDL_DestroyTexture(texture);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();

return 0;
}

最好从跟踪每个while循环的增量时间开始,(尝试使用gettimeofday()

然后可以使用线性插值在位置之间转换对象

按键时:(向右移动)

每个循环:

if(doTransition == true)
{
    tick += deltaTime;
    float tval = MIN(tick / duration, 1);
    x = startX + (endX - startX) * tval;
    y = startY + (endY - startY) * tval;
    if(tval == 1)
    {
        //finished transition
        doTransition = false;
    }
}
startX是按下该键时图像的x位置


endX是转换结束时所需的x位置

比较浮点类型是否相等可能导致surprises@sp2danny在这种情况下应该没问题。
if(doTransition == true)
{
    tick += deltaTime;
    float tval = MIN(tick / duration, 1);
    x = startX + (endX - startX) * tval;
    y = startY + (endY - startY) * tval;
    if(tval == 1)
    {
        //finished transition
        doTransition = false;
    }
}