2016-07-25 4 views
0

カードゲームでは、現在書いています。カードを表すカスタムの「コントロール」を作成しました。ゲームの進行中に反転、ドラッグ、選択、スケーリング、翻訳などが行われます。ノードの周りに装飾領域を追加して、効果のように動作します。

カードの主要な機能は、さまざまな方法で「強調表示」することができることです。ハイライトの最も基本的なフォームは、カードの周りに輝くボーダー(アニメーション)を表示しています。

ここでは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ので

enter image description here

を行う方法:単純に、それは

次画像ショー

は、私が構築しようとした...ノードの影響のように振る舞うべきですか? 正しくできますか?

答えて

0

setMouseTransparent(true)effectViewで正しく動作します。

ただし、親の境界(Pane)にはまだeffectViewが含まれており、マウスイベントが生成されます。そしてpickOnBoundsRegionsはデフォルトでtrueに設定されています(これは私が忘れてしまったことです、一般的なデフォルトはjava docによるとfalseです)、falseに設定する必要があります。

これが機能します。

関連する問題