我如何让我的敌人追赶我的玩家?

问题描述 投票:0回答:3

我尝试让 10 个敌人移动到我移动玩家的地方,尝试做一些统计,但无法弄清楚。

公共密封部分类 MainPage : 页面 { int[] arr_Enemy = new int[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"))

        };

       Player = new Rectangle();

       Player.Width = 50;

       Player.Height = 50;

       Player.Fill = new ImageBrush

        {

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.Fill = new ImageBrush

            {

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;

        }
        


    }
   

} }

c# xaml uwp
3个回答
1
投票

如何让敌人追赶我的玩家?

更好的方法是让计时器一步步将敌人移动到玩家身上。我们可以获得敌人和玩家的位置。并测量它们之间的距离。然后根据距离调用set left-top方法。当敌人和玩家交叉时停止移动。

例如

private void Chase(FrameworkElement enemy)
{
    var enemyLeft = Canvas.GetLeft(enemy);
    var enemyTop = Canvas.GetTop(enemy);
 
    var playerLeft = Canvas.GetLeft(Player);
    var playerTop = Canvas.GetTop(Player);
  
    var distance = new Point(playerLeft - enemyLeft, playerTop - enemyTop);

    if (distance.X == 0 && distance.Y == 0 || !DetectCollisions(Player,enemy).IsEmpty) return;

    if (distance.X > 0 && distance.Y > 0)
    {
        //down-right
        Canvas.SetTop(enemy, Canvas.GetTop(enemy) + 10);
        Canvas.SetLeft(enemy, Canvas.GetLeft(enemy) + 10);

    }
    else if (distance.X < 0 && distance.Y < 0)
    {
        //up-left
        Canvas.SetTop(enemy, Canvas.GetTop(enemy) - 10);
        Canvas.SetLeft(enemy, Canvas.GetLeft(enemy) - 10);
    }
    else if (distance.X > 0 && distance.Y < 0)
    {
        Canvas.SetTop(enemy, Canvas.GetTop(enemy) - 10);
        Canvas.SetLeft(enemy, Canvas.GetLeft(enemy) + 10);
        //up-right

    }
    else if (distance.X < 0 && distance.Y > 0)
    {
        Canvas.SetTop(enemy, Canvas.GetTop(enemy) + 10);
        Canvas.SetLeft(enemy, Canvas.GetLeft(enemy) - 10);
        //down-left
    }
    
}

1
投票

您的代码需要进行两处小更改

1:

Rectangle Enemy;

System.Collections.Generic.List<Rectangle> Enemies = new System.Collections.Generic.List<Rectangle>();

2:

Enemy.Fill = new ImageBrush . . . .

var Enemy = new Rectangle();
Enemies.Add(Enemy);
Enemy.Fill = new ImageBrush . . . .

0
投票

我使用了 Vector3.MoveTowards 代码,你可以在 Unity 手册中查看它。

© www.soinside.com 2019 - 2024. All rights reserved.