问题描述
好吧,我有一个移动物体的列表,我想检查一下它们是否相互碰撞,我需要删除它们,但我不知道如何检查它们是否相互接触 我有一个玩家和很多敌人-敌人自己移动,而玩家则通过键盘的键移动---
-
我需要知道敌人是否击中了敌人
-
我需要知道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 (将#修改为@)