簡體   English   中英

如何在Java中創建自定義形狀

[英]How to create custom shape in java

我正在做一些Java游戲,我認為如果制作游戲時不導入圖像會很酷。 因此,我需要創建自定義形狀並將其交給Graphics對象進行繪制。 我游戲中的主要角色將是一個像粘液一樣的團子,由一個不完美的圓圈和兩條垂直線組成。 我應該能夠通過給定一個指示大小的參數來構造dango。 另外,如果我可以修改眼睛的位置或底部曲線以呈現與地板的交互作用,那會更好。 更進一步,如果能夠為它填充顏色並為其賦予一些質感或其他功能,我將感到非常高興。 但是,所有事物都從一個圓和兩條直線開始。

我檢查了一些API,包括ShapeGeneralPathPathIteratorAreaEllipse和一些源代碼。 我學習了如何使用GeneralPath繪制直線,二次曲線和貝塞爾曲線。 但是我仍然不知道如何實現自定義形狀。 我在stackoverflow中發現了這個問題 ,但沒有給出好的答案。


如果有人只是讀了標題而跳過了該問題的內容,我將強調該問題與創建自定義形狀有關,這意味着實現“形狀”界面。 不只是一個形狀。

因此,經過一天的研究,我終於做到了。 對於與我有相同問題的任何人,我建議您做我所做的事情。

首先,參考java api源代碼,在這里我選擇了Ellipse2D.class的源代碼。 在源代碼之后,您可以忽略2個內部靜態類Ellipse2D.DoubleEllipse2D.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)

  1. 返回值是int,應該是靜態的final int字段: SEG_CLOSESEG_CUBICTO等。它們提供繪制形狀的說明。 SEG_MOVE將移動起點, SEG_LINETO將繪制一條從起點到終點的直線。 還有更多類似二次曲線和貝塞爾曲線的曲線,您可以在Java api上查看詳細信息。

  2. 參數float[] args也應視為返回值語句。 它提供上述說明的參數。 對於SEG_MOVETOSEG_LINETO ,您需要2個參數,因此請修改args [0]和args [1](x和y)。 對於SEG_QUADTO ,您需要4個參數,而SEG_CUBICTO需要6個參數。

認真遵循源代碼,創建形狀並不難。 我還沒有完成Shape接口中的所有方法,但是g2d實例已經可以繪制形狀了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM