检查C#xaml Blank应用程序中两个移动对象之间的碰撞

检查C#xaml Blank应用程序中两个移动对象之间的碰撞,c#,xaml,uwp-xaml,C#,Xaml,Uwp Xaml,好的,我有一个移动物体的列表,我想检查它们是否相互碰撞,我需要删除其中的一个,但我不知道如何检查它们是否相互接触 我有一个玩家和很多敌人-敌人自己移动,而玩家通过键盘降下键移动--- 我需要知道敌人是否击中了敌人 我需要知道enemt是否击中了玩家 public class MovingObject { 公共映像Img{get;protected set;}//获取表示对象的UI控件 public double X{get{return Canvas.GetLeft(Img);}prote

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

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

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

     public class MovingObject
    
    { 公共映像Img{get;protected set;}//获取表示对象的UI控件 public double X{get{return Canvas.GetLeft(Img);}protected set{Canvas.SetLeft(Img,value);}}//获取或设置画布上的当前水平位置 公共双Y{get{return Canvas.GetTop(Img);}受保护集{Canvas.SetTop(Img,value);}}//获取或设置画布上的当前垂直位置 公共双高{get{return Img.ActualHeight;}受保护的集{Img.Height=value;}}}//获取或设置当前高度 公共双宽度{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;
     }
    
    }

    公众阶级敌人:运动对象 { 随机rnd; 私人住宅; 私人厕所; 私人双阶梯=5; 公敌(双x,双y) :底座(x,y) { Img.Source=新的位图图像(新的Uri(“ms”)-appx:///Assets//enemy.png")); rnd=新随机数(); 如果(rnd.Next(0,2)==1) { _向后_x=真; } 否则u向后x=false; 如果(rnd.Next(0,2)==1) { _向后_y=真; } 否则u向后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
     }
    
    }
    公共无效移动(画布CNV)
    {
    if(this.X-\u stepSise=cnvs.ActualWidth)\u backWards\u X=true;//\u backWards\u X=!\u backWards\u X;//如果击中右侧
    否则如果(此.Y-\u stepSise=cnvs.ActualHeight)\u backWards\u Y=true;//\u backWards\u Y=!\u backWards\u Y;//如果击中下侧
    如果(_backWards_y)y-=_stepSise;//向上移动
    否则Y+=\u步进;//向下移动
    如果(_向后_x)x-=_步骤;//向左移动
    else X+=\u步骤;//向右移动
    }
    
    } }

    公共班级委员会 { 私人玩家(Player);; 私敌; 私人名单(敌人),; 私人帆布; 私人调度员定时器; 私有随机数=新随机数()

    公共事件GameOver\u gameOverEvent;
    公共董事会(帆布)
    {
    _画布=画布;
    _敌人=新列表();
    _计时器=新调度程序();
    _Timer.Interval=新的时间跨度(0,0,0,0,10);
    _Timer.Tick+=\u Timer\u Tick;
    }
    二等兵bool checkifenemysmete(敌方,inti)//知道身份的另一种方法有一次会面
    {
    对于(int j=0;j<\u.Count;j++)
    {
    //ל
    如果(i!=j)
    {
    double MaxWithToMet=(敌人[j].Width/2)+(敌人.Width/2);
    双最大高度集=(_敌人[j].Height/2)+(敌人.Height/2);
    双x=_敌人[j].x-敌人.x;
    双y=_敌人[j].y-敌人.y;
    双距离x=x;
    双距离y=y;
    如果(MaxHeightToMet>=距离Y | | MaxWithToMet>=距离X)
    返回true;
    }
    }
    返回false;
    }
    私有布尔检查冲突优先(移动对象mo1,移动对象mo2)
    {
    foreach(类型()的_canvas.Children.OfType()中的var)
    {
    Rect-enemyHit=new-Rect(Canvas.GetLeft(mo1.Img)、Canvas.GetTop(mo1.Img)、mo1.Width、mo1.Height);
    Rect-anoterenemy=new-Rect(Canvas.GetLeft(mo2.Img)、Canvas.GetTop(mo2.Img)、mo2.Width、mo2.Height);
    bool collisin=enemyHit。
    如果(!enemyHit.IntersectWith(anotherEnemy))
    {
    }
    }
    返回true;//delit
    }
    私家侦探()
    {
    foreach(敌人中的var敌人)
    敌人。移动(_画布);
    //对于(int i=0;i<\u.Count;i++)
    //{
    //if(checkifenemysmete(_敌人[i],i))
    //    {
    //_canvas.Children.Remove(_敌人[i].Img);
    //除掉敌人;
    //if(_friends.Count i;j--)//检查敌人是否与另一个敌人交战
    //    {
    //if(检查碰撞(_敌人[i],_敌人[j]))
    //        {
    //_canvas.Children.Remove(_敌人[j].Img);
    //_敌人。移除(_敌人[j]);
    //如果(_.Count min;
    }
    私有布尔检查冲突(移动对象mo1,移动对象mo2)
    {
    返回!检查距离(mo1,mo2,((mo1.Width+mo2.Width)/2)+(mo1.Height+mo2.Height)/2))/2);
    }
    公共播放器(VirtualKey)
    {
    _游戏者。移动(键);
    //foreach(敌人中的敌人)
    //{
    //如果(检查碰撞(敌人,玩家))
    //    {
    //GameOver(假);
    //    }
    //}
    }
    
    } }


  • 您好,您是否使用UWP进行开发?根据您的描述,您的问题可以简化为检测图形是否重叠,如果两个图形有重叠区域,则判断它们为“碰撞”。您的代码似乎正在执行此操作。您遇到的具体问题是什么?代码不会生效,或者它会报告错误吗?如果您可以提供最小的可复制演示,简化版本,这一次将帮助我们了解问题的原因。
     public event GameOver _gameOverEvent;
    
     public Board(Canvas canvas)
     {
         _canvas = canvas;
    
         _Enemies = new List<Enemy>();
         _Timer = new DispatcherTimer();
         _Timer.Interval = new TimeSpan(0, 0, 0, 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);
         //    }
         //}
    
     }