C#xaml空白应用程序中2个移动对象之间的checkCollision

问题描述

好吧,我有一个移动物体的列表,我想检查一下它们是否相互碰撞,我需要删除它们,但我不知道如何检查它们是否相互接触 我有一个玩家和很多敌人-敌人自己移动,而玩家则通过键盘的键移动---

  1. 我需要知道敌人是否击中了敌人

  2. 我需要知道enemt是否击中了玩家

     public class MovingObject
    

    { 公众形象Img {get;保护集; } //获取代表对象的UI控件 public double X {get {return Canvas.GetLeft(Img);} protected set {Canvas.SetLeft(Img,value);}} //获取或设置画布上的当前水平位置 公共双Y {get {返回Canvas.GetTop(Img); }受保护的集{Canvas.SetTop(Img,value);}} //获取或设置画布上的当前垂直位置 public double Height {get {return Img.ActualHeight; }保护集{Img.Height =值; }} //获取或设置当前高度 public double Width {get {return Img.ActualWidth; }保护集{Img.Width = value; }} //获取或设置当前宽度

     public MovingObject(double x,double y)// Initializes an instance of object - the constractor
     {
         this.Img = new Image();
         this.Img.Stretch = Stretch.UniformToFill;
         this.Height = 70;
         this.Width = 70;
    
         X = x;
         Y = y;
     }
    

    }

    公共类敌人:MovingObject { 随机rnd; 私人布尔_backWards_y; 私人布尔_backWards_x; 私人double _stepSise = 5; 公共敌人(双x,双y) :基(x,y) { Img.source =新的BitmapImage(新的Uri(“ ms-appx:///Assets//enemy.png”)); rnd = new Random(); 如果(rnd.Next(0,2)== 1) { _backWards_x = true; } 否则_backWards_x = false; 如果(rnd.Next(0,2)== 1) { _backWards_y = true; } 否则_backWards_y = false;

     }
    
    
    
     public void Move(Canvas cnvs)
     {
         if (this.X - _stepSise <= 0) _backWards_x = false;// _backWards_X = !_backWards_X;// if hit left side
         else if (this.X + _stepSise + Img.Width >= cnvs.ActualWidth) _backWards_x = true;//_backWards_X = !_backWards_X; //if hit right side
         else if (this.Y - _stepSise <= 0) _backWards_y = false;//_backWards_y = !_backWards_y;  // if hit up side
         else if (this.Y + _stepSise + Img.Height >= cnvs.ActualHeight) _backWards_y = true;//_backWards_y = !_backWards_y;// if hit down side
    
         if (_backWards_y) Y -= _stepSise;// move up
         else Y += _stepSise;// move down
    
         if (_backWards_x) X -= _stepSise;// move left
         else X += _stepSise;// move right
     }
    

    } }

    公共课董事会 { 私人玩家_Player; 私人敌人; 私人清单_敌人; 私人画布_canvas; 私人dispatcherTimer _Timer; 私人Random _rnd = new Random();

     public event GameOver _gameOverEvent;
    
     public Board(Canvas canvas)
     {
         _canvas = canvas;
    
         _Enemies = new List<Enemy>();
         _Timer = new dispatcherTimer();
         _Timer.Interval = new TimeSpan(0,10);
         _Timer.Tick += _Timer_Tick;
    
     }
    
     private bool CheckIfEnemysmeet(Enemy enemy,int i)//another way to kNow id there was a meet 
     {
         for (int j = 0; j < _Enemies.Count; j++)
         {
             //לבדוק את כל הנקוקדות של כל אוייב הפרמטר ומיקום J
             if (i!=j)
             {
                 double maxWithToMeet = (_Enemies[j].Width / 2) + (enemy.Width / 2);
                 double maxHeightToMeet = (_Enemies[j].Height / 2) + (enemy.Height / 2);
                 double x = _Enemies[j].X - enemy.X;
                 double y = _Enemies[j].Y - enemy.Y;
                 double distanceX = x ;
                 double distanceY = y;
    
                 if (maxHeightToMeet>= distanceY || maxWithToMeet>= distanceX)                    
                     return true;                    
             }
         }
         return false;
     }
    
     private bool CheckCollisionFirst(MovingObject mo1,MovingObject mo2)
     {
         foreach (var enemy in _canvas.Children.OfType<Image>())
         {
             Rect enemyHit = new Rect(Canvas.GetLeft( mo1.Img),Canvas.GetTop(mo1.Img),mo1.Width,mo1.Height);
             Rect anotherEnemy = new Rect(Canvas.GetLeft(mo2.Img),Canvas.GetTop(mo2.Img),mo2.Width,mo2.Height);
             bool collisin = enemyHit.
             if (!enemyHit.IntersectWith(anotherEnemy))
             {
    
             }
    
         }
    
         return true;//delit
     }
    
     private void MoveEnemies()
     {
         foreach (var enemy in _Enemies)
             enemy.Move(_canvas);
    
    
    
    
         //for (int i = 0; i < _Enemies.Count; i++)
         //{
         //    if (CheckIfEnemysmeet(_Enemies[i],i))
         //    {
         //        _canvas.Children.Remove(_Enemies[i].Img);
         //        _Enemies.Remove(_Enemies[i]);
         //        if (_Enemies.Count <= 1)
         //        {
         //            GameOver(true);
         //            break;
         //        }
         //    }
         //}
    
    
         //for (int i = 0; i < _Enemies.Count; i++) // the third way 
         //{
         //    //if (CheckCollision(_Enemies[i],_Player))//check if enemy touck player whilw move
         //    //{
         //    //    GameOver(false);
         //    //    break;
         //    //}
    
         //    for (int j = _Enemies.Count - 1; j > i; j--)//check if enemy toches another enemy
         //    {
    
         //        if (CheckCollision(_Enemies[i],_Enemies[j]))
         //        {
    
         //            _canvas.Children.Remove(_Enemies[j].Img);
         //            _Enemies.Remove(_Enemies[j]);
         //            if (_Enemies.Count <= 1)
         //            {
         //                GameOver(true);
         //                break;
         //            }
         //        }
    
    
         //    }
         //}
    
         //foreach (var enemy in _Enemies) // the two ways by foreach loop
         //{
    
         //    if (CheckIfMeetRandomly(enemy))   //two way for this ercsersise       
         //    {
         //        _canvas.Children.Remove(enemy.Img);
         //        _Enemies.Remove(enemy);
         //        if (_Enemies.Count <= 1)
         //        {
         //            GameOver(true);
         //            break;
         //        }
    
         //    }
         //}
     }
    
    
     private void _Timer_Tick(object sender,object e)
     {
         MoveEnemies();
     }
    
     public void SetupNewGame(int enemyiesCount)
     {
    
         _Player = new Player(_canvas,_canvas.ActualWidth / 2,_canvas.ActualHeight / 2);
         _canvas.Children.Add(_Player.Img);
         for (int i = 0; i < enemyiesCount; i++)
         {
              GetRandomEnemyLocation();
             _canvas.Children.Add(enemy.Img);
             _Enemies.Add(enemy);
         }
         _Timer.Start();
     }
    
     private Enemy GetRandomEnemyLocation()
     {
         //Enemy enemy = new Enemy(0,0);(int)enemy.Height,(int)enemy.Width,double x,y;
         do
         {
             x = _rnd.Next((int)(Math.Floor(_canvas.ActualWidth)));
             y = _rnd.Next((int)(Math.Floor(_canvas.ActualHeight)));
             enemy = new Enemy(x,y);
         }
         while (!CheckIfMeetRandomly(enemy));
         return enemy;
     }
     private bool CheckIfMeetRandomly(MovingObject mo)
     {
         if (!CheckThedistance(mo,_Player,300))
             return false;
         foreach (Enemy enemy in _Enemies)
         {
             if (!CheckThedistance(mo,enemy,100))
                 return false;
         }
         return true;
    
     }
    
     private bool CheckThedistance(MovingObject mo1,MovingObject mo2,double min) //שיזוז ליכוון השחקן
     {
         double x = mo1.X - mo2.X;
         double y = mo2.Y - mo2.Y;
         double dist = Math.Sqrt(Math.Pow(x,2) + Math.Pow(y,2));  // distace formula
         //if (dist > min)
         //    return true;
         //else
         //    return false;
    
         return dist > min;
     }
     private bool CheckCollision(MovingObject mo1,MovingObject mo2)
     {
         return !CheckThedistance(mo1,mo2,((((mo1.Width + mo2.Width) / 2) + ((mo1.Height + mo2.Height) / 2)) / 2));
     }
    
    
     public void MovePlayer(VirtualKey key)
     {
         _Player.Move(key);
         //foreach (Enemy enemy in _Enemies)
         //{
         //    if (CheckCollision(enemy,_Player))
         //    {
         //        GameOver(false);
         //    }
         //}
    
     }
    

    } }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)