检查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
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);
// }
//}
}