我正在做一些Java游戏,我认为如果游戏是在没有导入图像的情况下制作的话会很酷。因此,我需要创建自定义形状并将其交给Graphics对象进行绘制。我游戏中的主要人物将是一个dango,就像一个粘液,由一个不完美的圆圈和两条垂直线组成的眼睛。我应该能够通过给出一个指示大小的参数来构造dango。此外,如果我可以修改眼睛的位置或底部曲线以呈现与地板的相互作用将会更好。更进一步,如果我能用颜色填充它并给它一些纹理或东西,我会很高兴。但所有事情都从一个圆圈和两行开始。
我检查了一些API,包括Shape
,GeneralPath
,PathIterator
,Area
,Ellipse
和一些源代码。我学会了如何使用GeneralPath绘制直线,二次曲线和贝塞尔曲线。但我仍然不知道如何实现我的自定义形状。我在stackoverflow中找到了这个question,但没有发布好的答案。
如果有人刚刚阅读了标题并跳过了这个问题的内容,我将强调这个问题是关于创建自定义形状,这意味着要实现' Shape&#39 ;接口。不仅仅是绘制形状。
答案 0 :(得分:3)
经过一天的研究,我终于做到了。对于那些对我有同样问题的人,我建议你做我做过的事。
首先,请参阅java api源代码,这里我选择了Ellipse2D.class的源代码。在源代码之后,您可以忽略2内部静态类Ellipse2D.Double
,Ellipse2D.Float
,它们在这一点上并不那么重要。
要实现Shape
接口,最重要的方法是
public PathIterator getPathIterator(AffineTransform at) {
return new EllipseIterator(this, at);
}
paintComponent调用此方法来绘制PathIterator
。因此,源代码的作用就是您创建自己的ShapeIterator
。
然后是EllipseIterator的源代码。如您所见,有4种方法(不包括构造函数和副本)。您可以离开getWindingRule()
进行更深入的研究。虽然isDone()
和next()
很容易理解。
然后让我们关注public int currentSegment(float[] args)
。
返回值为int,它应该是静态的最终int字段:SEG_CLOSE
,SEG_CUBICTO
等。它们提供了绘制形状的说明。 SEG_MOVE
将移动起点,SEG_LINETO
将从起点到终点绘制一条直线。除了quatratic曲线和Bezier曲线之外,您可以查看java api的详细信息。
参数float[] args
也应视为返回值语句。它提供了上述说明的参数。对于SEG_MOVETO
,SEG_LINETO
,您需要2个参数,因此请修改args [0]和args [1](x和y)。对于SEG_QUADTO
,您需要4个参数,SEG_CUBICTO
需要6个。
仔细遵循源代码,创建形状并不困难。我还没有在Shape界面中完成所有方法,但是形状已经可以由g2d实例绘制。