Attack / Follow my player

I want to create a game in which you try to avoid objects (circles) that "attack" you. How I did it:

  • First, calculate the difference x_ and y between the object and me (in this code, AI_x is the location of the object (AI_y: y-location) and x, y is the location of the player).
  • Calculate the angle that the object must make in order to go straight to the player (with Math.Atan (difference between the x axis / difference between the y axis)) Then I use these angles to calculate the distances x and y that it should move beyond the check mark (for example distancePerTick_x = Math.Cos (angle) * speed)

However, this does not work when my distanceToPlayer_x (see code) is positive or both distanceToPlayer_x and distanceToPlayer_y are negative, so the divisible number becomes positive again.

I know why this happens, but I tried 2 hours to solve it, but I can no longer cope with the pain: P.

Hope you guys can help me.

CODE:

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); } } } 
+5
source share
1 answer

When calculating the entire range [0..2 * pi] typical solution includes the Atan2 method:

  angle = Math.Atan2(distanceToPlayer_y, distanceToPlayer_x); 

see https://msdn.microsoft.com/en-us/library/system.math.atan2(v=vs.110).aspx for details

+1
source

Source: https://habr.com/ru/post/1258892/


All Articles