如何使用Slick2D创​​建弧?

时间:2017-07-02 12:09:08

标签: java slick2d

我似乎无法弄清楚如何使用Slick2D创​​建弧。基本上我希望能够将它保存为对象,以便我可以用它进行collicion检测,但Slick2D只有一个g.drawArc()函数。

我想过使用Arc2D,它非常适合我需要的东西,但是我无法弄清楚如何使用光滑来绘制Arc2D。

Heres是我想要的模型:

mockup

使用Arc2D然后使用jFrame绘制它很容易,但我不知道如何用光滑创建这样的东西。

编辑:我看到我能做的解决方案,只是使用Arc2D进行所有碰撞检测,然后只需使用myArc.x,myArc.y,myArc.width等,当我需要绘制弧时g.drawArc(),但Arc2D无法使用.interesects()函数和slick2d形状,这些形状在其他地方使用。

我创建了一种基于曲线创建近似弧的方法

public Curve createArc(float centerX, float centerY, float radius, float theta){
        // creates a 180 degree arc around centerX and Y, theta (in  degrees) is used for rotation

    float x1,x2,x3,x4,y1,y2,y3,y4;

    x1 = (float) (radius*(1-Math.cos(Math.toRadians(theta)))) + startX - radius;
    y1 = (float) (radius*(1-Math.sin(Math.toRadians(theta)))) + startY - radius;

    x2 = (float) (Math.sqrt(25*(radius*radius)/9)*(Math.cos(Math.toRadians(theta-36.87-90))))  + startX;
    y2 = (float) (Math.sqrt(25*(radius*radius)/9)*(Math.sin(Math.toRadians(theta-36.87-90)))) + startY;

    x3 = (float) (Math.sqrt(25*(radius*radius)/9)*(Math.cos(Math.toRadians(theta-53.13))))  + startX;
    y3 = (float) (Math.sqrt(25*(radius*radius)/9)*(Math.sin(Math.toRadians(theta-53.13)))) + startY;

    x4 = (float) (radius*(1-Math.cos(Math.toRadians(theta+180)))) - radius + startX;
    y4 = (float) (radius*(1-Math.sin(Math.toRadians(theta+180)))) - radius + startY;



    Vector2f vectorTest1 = new Vector2f(x1,y1);
    Vector2f vectorTest2 = new Vector2f(x2,y2);
    Vector2f vectorTest3 = new Vector2f(x3,y3);
    Vector2f vectorTest4 = new Vector2f(x4,y4);


    Curve curve = new Curve(vectorTest1,vectorTest2,vectorTest3,vectorTest4);

    return curve;
}

1 个答案:

答案 0 :(得分:1)

嘿,你可以使用Slick2D创​​建各种不同的形状。你可以在这里看到它们:

http://slick.ninjacave.com/javadoc/org/newdawn/slick/geom/package-summary.html

它们都从形状继承并共享相同的方法(例如intersects());

没有特定的弧形,但您可以使用曲线或多边形(或其他)。例如,您可以这样做:

    org.newdawn.slick.geom.Curve myCurve = new org.newdawn.slick.geom.Curve(10f, 5f, 9f, 4f);

创建一个奇怪的曲线。只需阅读文档并稍微玩一下。

在你的渲染方法中,你可以调用g.drawArc(myCurve),也可以直接在myCurve上调用绘图方法(myCurve.draw());

如果您阅读文档并使用坐标稍微玩一下,我相信您将能够这样做。

此外,如果您创建一个新类并让它从Shape继承,您可以在Slick2D中创建自己的Shapes。