首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >攻击/跟随我的玩家

攻击/跟随我的玩家
EN

Stack Overflow用户
提问于 2016-10-27 14:51:53
回答 1查看 95关注 0票数 5

我想要创建一个游戏,你试图避免对象(圆圈)是“攻击”你。我这么做的方式:

  • 首先计算对象和me之间的x_and y差值(在此代码中,AI_x是对象的x位置(AI_y: y-location)和x,y是播放器的位置)
  • 计算物体为了直奔玩家(用Math.Atan(x轴差/y轴差))所需的角度,然后用这些角度来计算x和y之间的距离(例如,distancePerTick_x =Math.Cos(角)*速度)。

但是,当我的distanceToPlayer_x (参见代码)是正数或者distanceToPlayer_x和distanceToPlayer_y都是负值时,它就不能工作了,因此分隔数再次变为正数。

我知道为什么会发生这种情况,但我已经尝试了两个小时来解决它,但再也不能忍受痛苦了。

希望你们能帮我。

代码:

代码语言:javascript
复制
namespace AI
{
    public partial class mainClass : Form
    {
        //variables
        int health;
        double startPosition_x, startPosition_y, angle;
        float x, y, speed, AI_x, AI_y, distanceToPlayer_x, distanceToPlayer_y;

        //gameloop
        Timer gameLoop;

        //field
        Bitmap bmp;

        //player color
        Pen playerColor;

        //Random
        Random random_x, random_y;

    //constructor
    public mainClass()
    {
        InitializeComponent();
        Initialization();
    }

    //on startup do this:
    private void Initialization()
    {
        //initializing variables
        health = 100;
        speed = (float) 0.75;

        //startposition
        startPosition_x = pbField.Width / 2;
        startPosition_y = pbField.Height / 2;

        //set x and y value to start position
        x = (float) startPosition_x;
        y = (float)startPosition_y;

        //random
        random_x = new Random();
        random_y = new Random();

        AI_x = 0;//random_x.Next(1, 550);
        AI_y = 0;//random_y.Next(1, 320);
        //player color
        playerColor = new Pen(Color.Red, 5);

        //gameloop
        gameLoop = new Timer();
        gameLoop.Tick += new EventHandler(gameMethode);
        gameLoop.Interval = 5;
        gameLoop.Start();
    }

    //the gameloop
    private void gameMethode(object sender, EventArgs e)
    {
        //field
        bmp = new Bitmap(550, 320);
        pbField.Image = bmp;

        using (Graphics g = Graphics.FromImage(bmp))
        {
            //key manager
            if (InputManager.pressed(Keys.W))
            {
                y -= speed;
            }
            else if (InputManager.pressed(Keys.S))
            {
                y += speed;
            }
            else if (InputManager.pressed(Keys.A))
            {
                x -= speed;
            }
            else if (InputManager.pressed(Keys.D))
            {
                x += speed;
            }

            g.DrawEllipse(playerColor, AI_x, AI_y, 5, 5);
            g.DrawEllipse(playerColor, x, y, 5, 5);

            attackPlayer();
        }
    }

    //attack player method
    private void attackPlayer()
    {
        //the distance to the player
        distanceToPlayer_x = AI_x - x;
        distanceToPlayer_y = AI_y - y;

        angle = Math.Atan(distanceToPlayer_y / distanceToPlayer_x);

        Console.WriteLine("Radiants: " + angle);
        Console.WriteLine("Degrees: "+ angle * (180 / Math.PI));

        AI_x += (float) Math.Cos(angle) * (speed/(float)1.25);
        AI_y += (float) Math.Sin(angle) * (speed/(float)1.25);
    }

    //if keydown
    private void mainClass_KeyDown(object sender, KeyEventArgs e)
    {
        //if escape button is pressed
        if (e.KeyCode == Keys.Escape)
        {
            Application.Exit();
        }

        InputManager.changeState(e.KeyCode, true);
    }

    //if keyup
    private void mainClass_KeyUp(object sender, KeyEventArgs e)
    {
        InputManager.changeState(e.KeyCode, false);
    }

    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-27 15:07:22

在计算整个范围内的[0..2 * pi]角度时,典型的解决方案涉及Atan2方法:

代码语言:javascript
复制
 angle = Math.Atan2(distanceToPlayer_y, distanceToPlayer_x);

详细信息请参见https://msdn.microsoft.com/en-us/library/system.math.atan2(v=vs.110).aspx

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40287804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档