2016-11-23 7 views
1

私はBeeを1つ追加したCanvas(playArea)を作成しました(playArea.children.Add(bee)を使用)。また、playAreaの任意の点でX秒ごとに新しいboxを追加します。 beeを現在のポイントからクリックしたポイントに移動するには、StoryboardDoubleAnimationを使用してください。私が何をしたいか他のUIElementが渡すたびにUIElementを削除する

は私が削除したいですbeeはそれだけでplayAre.Children.Remove(box)を行う必要がありますように。私はそれをチェックするためにどのようにそれを把握することはできません(通過さbox

example

ここに例を示します:Aをクリックすると、beeはそのポイントに行き、3つのボックスを削除します。私はおそらく私自身のEventHandlerを使用すべきだと思っていました(私はまだ自分でそれはもう一つの問題です)。だから私は何をすべきか、私はどのような状態を作るべきですか?

EDIT: 私の使用方法は次のとおりです。私はbegginingで何、私は蜂を描き、自分のキャンバスに追加して、すべてのX秒は、私はちょうどあなたがあなたのアニメーションにCurrentTimeInvalidatedイベントハンドラを使用することができ、ランダムな場所

//moving the bee to the position which I got from Point p = Mouse.GetPosition(playArea); 
    public static void MoveBee(UIElement element, double toX, double toY) 
    { 
     double fromX = Canvas.GetLeft(element); 
     double fromY = Canvas.GetTop(element); 

     Storyboard storyboard = new Storyboard(); 
     DoubleAnimation animationX = CreateDoubleAnimation(element, 
      fromX, toX, new PropertyPath(Canvas.LeftProperty)); 
     DoubleAnimation animationY = CreateDoubleAnimation(element, 
      fromY, toY, new PropertyPath(Canvas.TopProperty)); 
     storyboard.Children.Add(animationX); 
     storyboard.Children.Add(animationY); 
     storyboard.Begin(); 
    } 

    public static DoubleAnimation CreateDoubleAnimation(UIElement element, 
     double from, double to, PropertyPath propertyToAnimate) 
    { 
     DoubleAnimation animation = new DoubleAnimation(); 
     Storyboard.SetTarget(animation, element); 
     Storyboard.SetTargetProperty(animation, propertyToAnimate); 
     animation.From = from; 
     animation.To = to; 
     animation.Duration = TimeSpan.FromSeconds(3); 
     return animation; 
    } 

    public void DrawBox() 
    { 
     BoxControl newBox = new BoxControl(); 
     playArea.Children.Add(newBox); 
     Canvas.SetTop(newBox, random.Next(0, 419)); 
     Canvas.SetLeft(newBox, random.Next(0, 792)); 
    } 
+1

これは何のフレームワークとは?統一?タイトルやタグを更新すると、より知識のある人が連動します。 – akatakritos

+0

It's .NET、updated – Tripper

+1

あなたは、あなたの蜂とあなたの箱の位置を知る必要があります(そのためのCanvas.GetLeft、Canvas.GetTopメソッドとその寸法)。次に、ハチが通過したかどうかを確認するのは簡単な数学です。すべてのボックスでこれを行う必要があります(このplayArea.children.OfType ()のようなそれらのコレクションを得ることができます)。しかし、実際に作業しているコードを提供しない限り、手助けするのは難しい – Omilis

答えて

2

で新しいボックスを追加します。詳細は以下のコードを参照してください。

Valid XHTML


public partial class MainWindow : Window 
{ 
    public Random Rng { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Rng = new Random(0); 

     do 
     { 
      AddBoxToRandomPointInPlayArea(); 
     } while (PlayArea.Children.Count < 10); 

    } 

    private void AddBoxToRandomPointInPlayArea() 
    { 
     var x = Rng.Next(0, Convert.ToInt32(PlayArea.Width)); 
     var y = Rng.Next(0, Convert.ToInt32(PlayArea.Height)); 

     var box = new Rectangle 
     { 
      Height = 10, 
      Width = 30, 
      Fill = Brushes.Brown 
     }; 

     PlayArea.Children.Add(box); 

     Canvas.SetLeft(box, x); 
     Canvas.SetTop(box, y); 
    } 

    private void PlayArea_MouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var x = Canvas.GetLeft(Bee); 
     var y = Canvas.GetTop(Bee); 

     var storyboard = new Storyboard(); 

     var xTranslation = new DoubleAnimation(x, e.GetPosition(PlayArea).X, new Duration(new TimeSpan(0, 0, 5))); 
     Storyboard.SetTargetProperty(xTranslation, new PropertyPath(Canvas.LeftProperty)); 
     xTranslation.CurrentTimeInvalidated += CheckForCollidingBoxesAndRemoveIfNeeded; 

     storyboard.Children.Add(xTranslation); 

     var yTranslation = new DoubleAnimation(y, e.GetPosition(PlayArea).Y, new Duration(new TimeSpan(0, 0, 5))); 
     Storyboard.SetTargetProperty(yTranslation, new PropertyPath(Canvas.TopProperty)); 
     yTranslation.CurrentTimeInvalidated += CheckForCollidingBoxesAndRemoveIfNeeded; 

     storyboard.Children.Add(yTranslation); 

     Bee.BeginStoryboard(storyboard); 
    } 


    private void CheckForCollidingBoxesAndRemoveIfNeeded(object sender, EventArgs eventArgs) 
    { 
     var idxToRemoveAt = GetIndexOfBoxCollidingWithBee; 
     if (idxToRemoveAt != -1) 
     { 
      PlayArea.Children.RemoveAt(idxToRemoveAt); 
     } 
    } 

    /// <summary> 
    /// returns 0 if no boxes collide, otherwise the number is the index of the box in the 
    /// </summary> 
    public int GetIndexOfBoxCollidingWithBee 
    { 
     get 
     { 
      var beeTopLeft = PointToScreen(new Point(Canvas.GetLeft(Bee), Canvas.GetTop(Bee))); // local to world coordinates 
      var beeCentroid = new Point((beeTopLeft.X + Bee.ActualWidth) * 0.5, (beeTopLeft.Y + Bee.ActualHeight) * 0.5); // center point of bee 

      for (var idx = 0; idx < PlayArea.Children.Count; idx++) 
      { 
       var child = PlayArea.Children[idx]; 
       var currentBoxInSearch = child as Rectangle; 
       if (currentBoxInSearch != null) 
       { 
        var boxTopLeft = PointToScreen(new Point(Canvas.GetLeft(currentBoxInSearch), Canvas.GetTop(currentBoxInSearch))); // local to world coordinates 
        var boxCentroid = new Point((boxTopLeft.X + currentBoxInSearch.ActualWidth) * 0.5, (boxTopLeft.Y + currentBoxInSearch.ActualHeight) * 0.5); // center point of bee 

        var xCollided = false; 
        var yCollided = false; 

        if (Math.Abs(beeCentroid.X - boxCentroid.X) < Bee.ActualWidth*0.5) 
         xCollided = true; 

        if (Math.Abs(beeCentroid.Y - boxCentroid.Y) < Bee.ActualHeight*0.5) 
         yCollided = true; 

        if (xCollided && yCollided) 
         return idx; 
       } 
      } 

      return -1; 
     } 
    } 
} 
関連する問題