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

The texture of the player does not changing

In the code I wrote, the collision is detected correctly, but only 1 enemy changes players texture. What is the reason and how can I change players texture for every enemy? The problem is between lines 56 and 64 of the code.

Screenshots :

No collision

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

Collision but texture isn’t change

Collision and players texture is changed

My code :

#include <iostream>
#include <stdlib.h>
#include <SFML/Graphics.hpp>

using namespace sf;

int main(){

    RenderWindow window(VideoMode(500,500), "Game");
    window.setFramerateLimit(100);

    Texture playerTexture;
    playerTexture.loadFromFile("./images/player.png");
    Texture collisionPlayerTexture;
    collisionPlayerTexture.loadFromFile("./images/collision_player.png");
    Texture enemyTexture;
    enemyTexture.loadFromFile("./images/enemy.png");

    Sprite player;
    player.setTexture(playerTexture);
    player.setTextureRect(IntRect(50,50,50,50));
    player.setPosition(225,225);

    Sprite enemies[5] = {Sprite(),Sprite(),Sprite(),Sprite(),Sprite()};
    for(int i=0;i<5;i++){
        enemies[i].setTexture(enemyTexture);
        enemies[i].setTextureRect(IntRect(25,25,25,25));
        enemies[i].setPosition(rand() % 475,rand() % 475);
    }

    while(window.isOpen()){

        Event event;
        while(window.pollEvent(event)){
            switch(event.type){
                case Event::Closed:
                    window.close();
            }
        }

        if(Keyboard::isKeyPressed(Keyboard::W) || Keyboard::isKeyPressed(Keyboard::Up)){
            player.move(0.0f,-1.5f);
        }
        if(Keyboard::isKeyPressed(Keyboard::S) || Keyboard::isKeyPressed(Keyboard::Down)){
            player.move(0.0f,1.5f);
        }
        if(Keyboard::isKeyPressed(Keyboard::A) || Keyboard::isKeyPressed(Keyboard::Left)){
            player.move(-1.5f,0.0f);
        }
        if(Keyboard::isKeyPressed(Keyboard::D) || Keyboard::isKeyPressed(Keyboard::Right)){
            player.move(1.5f,0.0f);
        }

        window.clear(Color(255,255,255));

        //////////////////////////////////////////////This is where I'm talking about//////////////////////////////////////////////

        for(int i=0;i<5;i++){
            if(player.getGlobalBounds().intersects(enemies[i].getGlobalBounds())){
                std::cout << "Collision"; // This is working
                player.setTexture(collisionPlayerTexture); // But this line only works for an enemy
            } else {
                player.setTexture(playerTexture);
            }
            window.draw(enemies[i]);
        }

        //////////////////////////////////////////////This is where I'm talking about//////////////////////////////////////////////

        window.draw(player);
        window.display();
    }
    return 0;
}

>Solution :

In your loop

    for(int i=0;i<5;i++){

you are iterating through all 5 enemies.

If you detect collision with the LAST one, you change the texture and get out of the loop. But if the collision was with any other enemy, the next loop iteration will revert the texture back.

Solution: you might want to break; out of the loop if a collision was detected.

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