无法将jbox2d角度转换为slick2d角度

时间:2015-06-12 19:45:37

标签: java slick2d jbox2d radians

更新 Slick和JBox使用相反方向的弧度,这就是我遇到麻烦的原因。

我正在使用JBox2D和Slick2D制作游戏(根据标题)。所以,因为我在网上找不到任何关于它的东西,我从头开始编写了一堆代码来进行转换。然而,似乎角度是不同的,即使两个文件都说他们使用弧度。

这是我的代码:

//In the update function
angle = (float) (angle % 2*Math.PI);
mass = player.getMass();
position = player.getPosition();

if(input.isKeyDown(inputLeft)){
    angle-=0.015f*turnBlocks.size()/mass;        //turning, pt1
} else if(input.isKeyDown(inputRight)){
    angle+=0.015f*turnBlocks.size()/mass;
}

player.setTransform(position, angle);           //turning, pt2

if(input.isKeyDown(inputForward)){
    float xv = (float)(0.25f * Math.sin(angle) * 
                      thrustBlocks.size() / mass);  //Converting angle to vector
    float yv = (float)(0.25f * Math.cos(angle) * 
                       thrustBlocks.size() / mass);
    Vec2 curVel = player.getLinearVelocity();
    xv = xv + curVel.x;
    yv = yv + curVel.y;
    player.setLinearVelocity(new Vec2(xv, yv));
}

//In the render function
g.setColor(Color.gray);

for(int mass = 0; mass < massBlocks.size(); mass++){
    float boxx = (float)massBlocks.get(mass)[0];
    float boxy = (float)massBlocks.get(mass)[1];
    int[] slicklist = tr.toSlick(position.x+boxx, position.y+boxy);
    boxx = (float)slicklist[0];
    boxy = (float)slicklist[1];

    float[] ps = {boxx-tr.xscale/2, boxy-tr.yscale/2, 
              boxx+tr.xscale/2, boxy-tr.yscale/2, 
              boxx+tr.xscale/2, boxy+tr.yscale/2, 
              boxx-tr.xscale/2, boxy+tr.yscale/2};
    Polygon p = new Polygon(ps);
    //turning, pt3  
    g.fill(p.transform(Transform.createRotateTransform(radAngle, slickx, slicky)));
}

当我运行上面的代码(其余部分)时,我会让玩家块朝着它所面对的方向移动。但是,Jbox2D中的冲突不同步。这是我找到的模式:

1个单位= pi / 4 in slick

光滑的方向:

7 ___ 0 ___ 1

6 ___.___ 2

5 ___ 4 ___ 3

Jbox方向:

5 ___ 0 ___ 3

2 ___.___ 6

7 ___ 4 ___ 1

真的,我不知道发生了什么。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

好。事实证明,即使Slick的变换和JBox的角度都是弧度,它们的方向相反。所以,我用.getWorldPosition而不是transform。

制作了下面的代码
        float localJBoxX = thrustBlocks.get(count)[0];
        float localJBoxY = thrustBlocks.get(count)[1];

        float[] localEndCoords = {localJBoxX+0.5f, localJBoxY+0.5f,
                                    localJBoxX-0.5f, localJBoxY+0.5f,
                                    localJBoxX-0.5f, localJBoxY-0.5f,
                                    localJBoxX+0.5f, localJBoxY-0.5f};

        float[] slickCoords = new float[localEndCoords.length];

        for(byte point = 0; point<localEndCoords.length/2; point++){

            Vec2 localPoint = new Vec2(localEndCoords[point*2], localEndCoords[point*2+1]);

            slickCoords[point*2] = (float)tr.toSlick(player.getWorldPoint(localPoint).x, player.getWorldPoint(localPoint).y)[0];
            slickCoords[point*2+1] = (float)tr.toSlick(player.getWorldPoint(localPoint).x, player.getWorldPoint(localPoint).y)[1];
        }

        Polygon box = new Polygon(slickCoords);
        g.fill(box.transform(new Transform()));  //as to return a shape