Home > Software engineering >  The texture of the player does not changing
The texture of the player does not changing

Time:02-11

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

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;
}

CodePudding user response:

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.

  • Related