カードゲームでは、現在書いています。カードを表すカスタムの「コントロール」を作成しました。ゲームの進行中に反転、ドラッグ、選択、スケーリング、翻訳などが行われます。ノードの周りに装飾領域を追加して、効果のように動作します。
カードの主要な機能は、さまざまな方法で「強調表示」することができることです。ハイライトの最も基本的なフォームは、カードの周りに輝くボーダー(アニメーション)を表示しています。
ここではJavaFXエフェクト(アニメーションのスプレッド/半径を持つドロップシャドウ)から始めましたが、パフォーマンスは非常に悪いことが判明したのですぐにこれを避けました。
そこで、カードの背後にあるアニメーション化されたImageView(スプライトシートの基本スプライトアニメーションとあらかじめレンダリングされたグローアニメーション)でエフェクトを置き換えました。これはパフォーマンスの問題を解決しますが、私が現在取り組もうとしている他の多くの問題が導入されました...
"アンカーポイント"は、カードの周りの輝きの左上隅カード自体の左上隅で、カードノード内のImageViewを-X/-Yでオフセットしようとしました。
(異なるハイライトではノードを異なる量だけ展開することができますが、これはノードの位置に影響を与えません。また、ノードの位置を設定するときには、ハイライトオフセットやハイライトが異なる可能性があります)
最初はこれはうまく見えましたが、これはまだノード全体の境界に影響します。たとえば、ノードにマウスイベントリスナーを追加すると、イメージビューをマウスに透明に設定しても、「グロー」領域をクリックすると発生します。カスタムノード上のすべてのイベントメソッドに対して「プロキシ」メソッドを作成し、それらを「内部」カードノードに転送する必要があります。もちろん可能ですが、率直に言って私が探している解決策ではありません。
現在のカードのノードは基本的に以下の構造を有する:
public class Card extends Pane {
// the view that will contain the border glow (blue area in image below)
private ImageView effectView;
// stand-in for the rest of the card stuff (image etc)
private Rectangle placeholderForCardContent;
public Card() {
effectView = new ImageView();
effectView.setMouseTransparent(true);
placeholderForCardContent = new Rectangle();
getChildren().addAll(effectView, placeholderForCardContent);
}
@Override
protected void layoutChildren() {
// offsets are defined by the current highlight
effectView.setLayoutX(-50);
effectView.setLayoutY(-50);
effectView.setFitWidth(getWidth() + 100);
effectView.setFitHeight(getHeight() + 100);
placeholderForCardContent.setLayoutX(0);
placeholderForCardContent.setLayoutY(0);
placeholderForCardContent.setWidth(getWidth());
placeholderForCardContent.setHeight(getHeight());
}
}
例:新しいカードを()setOnMouseClick()などはplaceHolderForCardContentに現在等しい面積に影響を与えますが、effectViewに及ぶべきではありません。このようなものが適切にJavaFXので
を行う方法:単純に、それは
次画像ショー
は、私が構築しようとした...ノードの影響のように振る舞うべきですか? 正しくできますか?