C ++ SDL通过单击指向角点运动

时间:2016-05-20 06:56:36

标签: c++ floating-point sdl rounding physics

我试图通过点击将对象从A点移动到B点。物体将每个框架移动到一个小点到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);
    }

};

......并做这样的事情

I calculate angle once and I move object every frame, but it never arrive to destination

这是我的第二个代码......

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);
    }

};

......并做这样的事情

this code do what I want but I must recalculate de angle each frame

问题在于,在第二个代码中,对象不会绘制矩形线,而在第一个代码中,对象永远不会到达B点。

我确定问题出在ROUND中,但我该如何解决?最好的方法是什么?

    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);
}

1 个答案:

答案 0 :(得分:2)

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

将位置和速度存储为浮点值,并且只在需要在屏幕上绘制坦克时才将它们转换为整数。