0

更新 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

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

4

1 回答 1

0

好的。事实证明,即使认为 Slick 的变换和 JBox 的角度都是弧度,它们的方向相反。因此,我使用 .getWorldPosition 而不是变换制作了以下代码。

        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
于 2015-06-12T21:16:47.743 回答