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); } } }
source share