C++ C++;通过单击点到点的SDL角运动

C++ C++;通过单击点到点的SDL角运动,c++,floating-point,sdl,rounding,physics,C++,Floating Point,Sdl,Rounding,Physics,我试图通过点击将一个物体从一个点移动到另一个点。每一帧对象都会将一个小点移动到B点。我的代码可以工作,但它不能完全满足我的要求 这就是我的意思: 我有两个代码,这是第一个 class tank { public: void setMoveTank(tank &_tank, int x, int y) { _tank.tanke.moving = true; _tank.tanke.x2 = x; _tank.tanke.y2 =

我试图通过点击将一个物体从一个点移动到另一个点。每一帧对象都会将一个小点移动到B点。我的代码可以工作,但它不能完全满足我的要求

这就是我的意思: 我有两个代码,这是第一个

class tank {

public:

    void setMoveTank(tank &_tank, int x, int y) {
        _tank.tanke.moving = true;
        _tank.tanke.x2 = x;
        _tank.tanke.y2 = y;

        int vx      = _tank.tanke.x2 - _tank.tanke.x;
        int vy      = _tank.tanke.y2 - _tank.tanke.y;
        if(vx==0) vx+=1; if(vy==0) vy+=1; //float core dumperra arreglateko
        double alfa = atan2(vy,vx) * 180 / M_PI;

        _tank.tanke.vx = 2*cos(alfa*( M_PI / 180));
        _tank.tanke.vy = 2*sin(alfa*( M_PI / 180));
    }

    void renderTank(render _render, tank &_tank) {
        if(_tank.tanke.moving) {
            _tank.tanke.x += _tank.tanke.vx;
            _tank.tanke.y += _tank.tanke.vy;
        }

        SDL_Rect dst = {(int)(_tank.tanke.x),(int)(_tank.tanke.y),_tank.tanke.spr.w,_tank.tanke.spr.h};
        SDL_RenderCopy(_render.ren, _tank.tanke.img, &_tank.tanke.spr, &dst);
    }
})

…然后像这样做

这是我的第二个密码

class tank {

public:

    void setMoveTank(tank &_tank, int x, int y) {
        _tank.tanke.moving = true;
        _tank.tanke.x2 = x;
        _tank.tanke.y2 = y;
    }

    void renderTank(render _render, tank &_tank) {
        if(_tank.tanke.moving) {
            int vx      = _tank.tanke.x2 - _tank.tanke.x;
            int vy      = _tank.tanke.y2 - _tank.tanke.y;
            if(vx==0) vx+=1; if(vy==0) vy+=1; //float core dumperra arreglateko
            double alfa = atan2(vy,vx) * 180 / M_PI;

            _tank.tanke.vx = 2*cos(alfa*( M_PI / 180));
            _tank.tanke.vy = 2*sin(alfa*( M_PI / 180));

            _tank.tanke.x += _tank.tanke.vx;
            _tank.tanke.y += _tank.tanke.vy;
        }

        SDL_Rect dst = {(int)(_tank.tanke.x),(int)(_tank.tanke.y),_tank.tanke.spr.w,_tank.tanke.spr.h};
        SDL_RenderCopy(_render.ren, _tank.tanke.img, &_tank.tanke.spr, &dst);
    }
})

。。。然后像这样做

问题是,在第二个代码中,对象没有画一条直线,而在第一个代码中,对象永远不会到达B点

我确信问题是全面的,但我怎样才能解决它呢?最好的方法是什么

    int main() {

            if(event.type == SDL_MOUSEBUTTONDOWN) {
                switch(event.button.button) {
                    case SDL_BUTTON_LEFT:   _tank.setMoveTank(_tank, event.button.x, event.button.y);   break;
                }
            }

        }
        SDL_RenderClear(_render.ren);
        _tank.renderTank(_render, _tank);
        SDL_RenderPresent(_render.ren);
    }
}
hiii

编辑:这是固定代码

void renderTank(render _render, tank &_tank) {
    if(_tank.tanke.moving) {
        double vx      = _tank.tanke.x2 - _tank.tanke.x;
        double vy      = _tank.tanke.y2 - _tank.tanke.y;
        if(vx==0) vx+=1; if(vy==0) vy+=1; //float core dumperra arreglateko
        double alfa = atan2(vy,vx) * 180 / M_PI;

        _tank.tanke.vx = 2*cos(alfa*( M_PI / 180));
        _tank.tanke.vy = 2*sin(alfa*( M_PI / 180));

        _tank.tanke.x += _tank.tanke.vx;
        _tank.tanke.y += _tank.tanke.vy;
    }

    SDL_Rect dst = {(int)(_tank.tanke.x),(int)(_tank.tanke.y),_tank.tanke.spr.w,_tank.tanke.spr.h};
    SDL_RenderCopy(_render.ren, _tank.tanke.img, &_tank.tanke.spr, &dst);
}

问题是您将速度存储为整数。这会导致很多精度损失,这就是为什么在第一个示例中,它的角度略有不同。在第二个示例中,您尝试调整每帧的速度,这会导致它在两个方向之间翻转,这两个方向都是关闭的,因为缺少精度

将位置和速度存储为浮点值,仅当需要在屏幕上绘制水箱时才将其转换为整数