简体   繁体   English

我如何让我的玩家和敌人发生碰撞?

[英]How do i make a collision between my player and enemy?

public sealed partial class MainPage: Page公开密封部分 class MainPage: Page

{

    Enemy[] arr_Enemy = new Enemy[10];

    Rectangle Enemy;

    Rectangle Player;

    Random rnd = new Random();     

    public MainPage()           

    {

    this.InitializeComponent();

    Window.Current.CoreWindow.KeyDown += PlayerMovement;

    MyCanvas.Background = new ImageBrush

       {

ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/Background.jpg")) ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/Background.jpg"))

        };

       Player = new Rectangle();

       Player.Width = 50;

       Player.Height = 50;

       Player.Fill = new ImageBrush

        {

ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/PlAYER2.GIF")) }; ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/PlAYER2.GIF")) };

       MyCanvas.Children.Add(Player);

       Canvas.SetTop(Player, 700);

       Canvas.SetLeft(Player, 900);

        for (int i = 0; i < arr_Enemy.Length; i++)
        {
            Enemy = new Rectangle();
            Enemy.Fill = new ImageBrush
            {

ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/enemy.GIF")) }; ImageSource = new BitmapImage(new Uri("ms-appx:///Assets/enemy.GIF")) };

         Enemy.Width = 120;

         Enemy.Height = 115;

         MyCanvas.Children.Add(Enemy);

         Canvas.SetTop(Enemy, rnd.Next(750));

         Canvas.SetLeft(Enemy, rnd.Next(750));
        }

    }
    private void PlayerMovement(CoreWindow sender, KeyEventArgs args)
    {


  VirtualKey movement = args.VirtualKey;

    switch (movement)

       {

         case VirtualKey.Up:

             Canvas.SetTop(Player, Canvas.GetTop(Player) - 10);

         break;

         case VirtualKey.Down:

             Canvas.SetTop(Player, Canvas.GetTop(Player) + 10);

         break;

         case VirtualKey.Left:

             Canvas.SetLeft(Player, Canvas.GetLeft(Player) - 10);

         break;

         case VirtualKey.Right:

             Canvas.SetLeft(Player, Canvas.GetLeft(Player) + 10);

         break;

        }
        

(i tried to do if statment like this but it didnt work.)- (我试着做这样的 if 语句,但它没有用。)-

if (Canvas.GetLeft(Player) == Canvas.GetLeft(Enemy) &&如果(Canvas.GetLeft(玩家)== Canvas.GetLeft(敌人)&&

Canvas.GetTop(Player) == Canvas.GetTop(Enemy)) Canvas.GetTop(玩家) == Canvas.GetTop(敌人))

How do i make a collision between my player and enemy?我如何让我的玩家和敌人发生碰撞?

You can use Intersect method to determine if elements has common points.您可以使用Intersect方法来确定元素是否具有公共点。 For example例如

private Rect DetectCollisions(FrameworkElement player, FrameworkElement enemy)
{
    var rp = new Rect(Canvas.GetLeft(player), Canvas.GetTop(player), player.ActualWidth, player.ActualHeight);
    var re = new Rect(Canvas.GetLeft(enemy), Canvas.GetTop(enemy), enemy.ActualWidth, enemy.ActualHeight);
    rp.Intersect(re);
    return rp;
}

If player and enemy has collision, the method will store new intersection Rect to player rect variable, instead of this it return Rect.Empty structure.如果玩家和敌人发生碰撞,该方法会将新的交集 Rect 存储到玩家 rect 变量,而不是返回Rect.Empty结构。

foreach (var item in enemyList)
{
  var rect =  DetectCollisions(Player, item);
    if (!rect.IsEmpty)
    {
        MyCanvas.Children.Remove(item);
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM