Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Enemy does not follow Player OpenGL 2D

I have a project to do where one the tasks is to make an enemy that follows the player.
This is how I drew the player

//Body
    modelMatrix = visMatrix;
    modelMatrix *= transform2D::Translate(translateX, translateY);
    modelMatrix *= transform2D::Scale(1, 1);
    modelMatrix *= transform2D::Rotate(playerAngle);
    modelMatrix *= transform2D::Translate(-50, -50);
    RenderMesh2D(meshes["square3"], shaders["VertexColor"], modelMatrix);

    //Eye1
    modelMatrix = visMatrix;
    modelMatrix *= transform2D::Translate(translateX, translateY);
    modelMatrix *= transform2D::Scale(0.25f, 0.25f);
    modelMatrix *= transform2D::Rotate(playerAngle);
    modelMatrix *= transform2D::Translate(150, 200);
    modelMatrix *= transform2D::Rotate(0);
    modelMatrix *= transform2D::Translate(-50, -50);
    RenderMesh2D(meshes["square1"], shaders["VertexColor"], modelMatrix);

    //Eye2
    modelMatrix = visMatrix;
    modelMatrix *= transform2D::Translate(translateX, translateY);
    modelMatrix *= transform2D::Scale(0.25f, 0.25f);
    modelMatrix *= transform2D::Rotate(playerAngle);
    modelMatrix *= transform2D::Translate(-150, 200);
    modelMatrix *= transform2D::Rotate(0);
    modelMatrix *= transform2D::Translate(-50, -50);
    RenderMesh2D(meshes["square1"], shaders["VertexColor"], modelMatrix);

This is how I drew the enemy

//Body
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(translateEnemyX, translateEnemyY);
modelMatrix *= transform2D::Scale(1, 1);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["border"], shaders["VertexColor"], modelMatrix);

//Eye1
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(translateEnemyX, translateEnemyY);
modelMatrix *= transform2D::Scale(0.25f, 0.25f);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(150, 200);
modelMatrix *= transform2D::Rotate(0);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["square2"], shaders["VertexColor"], modelMatrix);

//Eye2
modelMatrix = visMatrix;
modelMatrix *= transform2D::Translate(translateEnemyX, translateEnemyY);
modelMatrix *= transform2D::Scale(0.25f, 0.25f);
modelMatrix *= transform2D::Rotate(enemyAngle);
modelMatrix *= transform2D::Translate(-150, 200);
modelMatrix *= transform2D::Rotate(0);
modelMatrix *= transform2D::Translate(-50, -50);
RenderMesh2D(meshes["square2"], shaders["VertexColor"], modelMatrix);

I made the enemy to face the player by calculating the angle like this, and this works

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

enemyAngle = atan2(translateX - translateEnemyX, translateY - translateEnemyY);

And I have tried to move the enemy towards the player like this

enemySpeed = 10;
translateEnemyX += enemySpeed * cos(enemyAngle);
translateEnemyY += enemySpeed * sin(enemyAngle);

But it does not work, the enemy just moves away from the player.

The question is, how to make the enemy move towards player?

>Solution :

If it moves away from the player, perhaps you switched up sin and cos.
My guess is, it should be this instead:
translateEnemyX += enemySpeed * sin(enemyAngle);
translateEnemyY += enemySpeed * cos(enemyAngle);

Other than that I think the right side should also contain your delta time between frames, otherwise it’s going to move faster at higher frame rate.

Edit: Nevermind, that shouldn’t work, your equation should contain the player’s position, since that’s what you want the enemy to move towards.
Try taking the difference between the enemy position and the player position, something like this:
translateEnemyX += (translatePlayerX – translateEnemyX) * enemySpeed * deltaTime;
translateEnemyY += (translatePlayerY – translateEnemyY) * enemySpeed * deltaTime;

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading