如何用Slick2D创​​建弧线?

问题描述:

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

我想过使用Arc2D,这对我所需要的是完美的,但我无法弄清楚如何得到光滑的绘制Arc2D。

继承人是什么,我希望有一个样机:

mockup

这是很容易做到的Arc2D,然后使用JFrame的画,但我不知道如何创建这样的事情光滑。

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

香港专业教育学院创建创建一个基于曲线

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

嘿,你可以创造出各种不同形状与Slick2D上的近似圆弧的方法。你可以在这里看到他们:

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

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

没有特定的圆弧形状,但您可能可以使用曲线或可能是多边形(或其他)。因此,举例来说,您只需执行以下操作:

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

创建奇怪的外观曲线。只要阅读文档并稍微玩一下。在您的渲染方法中,您可以调用g.drawArc(myCurve),或者直接在myCurve上调用绘图方法(myCurve.draw());

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

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

+0

嘿,所以我实际上设法创建了一种从曲线(我将我的方法添加到主文章中)创建弧线的方法,但我不知道如何将其关闭。 .intersects()只在线条本身触及时才起作用,但是如何使它在曲线内部有任何东西时熄灭? – user3263212

+1

如果我理解你是正确的,你可以使用.contains()代替或作为intersects()的补充。 –

+0

contains()在小圆圈花花公子的两侧创建了一个小死区,我通过在曲线的两端之间添加一条线,做一个curve.union(线),然后做一个if(包含^ intersects) {}。而且完美运作,正是我需要的。谢谢你的帮助! – user3263212