SFML 中 getPosition() 的问题

Problems with getPosition() in SFML

我是 c++ 的新手,所以我对这个有点困惑。我正在尝试让玩家重生,然后当用户按下 "C" 时,玩家会切换到汽车。当前发生的事情是玩家最初在正确的位置生成,然后汽车在玩家最初生成的位置生成,而不是当前位置。但是,由于我使用的是 getPosition() 函数,我认为它会在玩家的当前位置生成。

Player.h:

#pragma once
#include <SFML\Graphics.hpp>
#include <string>
class player {

public:
    sf::Texture normalTexture;
    sf::Sprite normalSprite;
    sf::Texture carTexture;
    sf::Sprite carSprite;
    sf::Texture springTexture;
    sf::Sprite springSprite;
    sf::Texture rocketTexture;
    sf::Sprite rocketSprite;
    sf::IntRect normalRect[1];
    sf::IntRect carRect[1];
    sf::IntRect springRect[1];
    sf::IntRect rocketRect[1];


bool rocket=false;
bool car=false;
bool spring=false;
bool normal=false;

player();
player(sf::Vector2f position, std::string normalFileLoc, std::string carFileLoc, std::string springFileLoc, std::string rocketFileLoc);

void update();
};

Player.cpp:

#include "Player.h"

player::player() : player::player(sf::Vector2f(100, 0), "player.jpg", "car.png", "spring.png", "rocket.png") {
}

player::player(sf::Vector2f position, std::string normalFileLoc, std::string 
carFileLoc, std::string springFileLoc, std::string rocketFileLoc)
{
normalTexture.loadFromFile(normalFileLoc);
normalRect[0] = sf::IntRect(0, 0, 64, 128);
normalSprite.setTexture(normalTexture);
normalSprite.setTextureRect(normalRect[0]);
normalSprite.setOrigin(0,0);
normalSprite.setScale(1, 1);
normalSprite.setPosition(position.x, position.y);

carTexture.loadFromFile(carFileLoc);
carRect[0] = sf::IntRect(0, 0, 64, 64);
carSprite.setTexture(carTexture);
carSprite.setTextureRect(carRect[0]);
carSprite.setOrigin(0, -64);
carSprite.setScale(1, 1);
carSprite.setPosition(normalSprite.getPosition().x, normalSprite.getPosition().y);

}

Main.cpp我知道它看起来很恶心,我打算以后让它看起来更好看:

#include <SFML/Graphics.hpp>
#include <SFML\Graphics\Rect.hpp>
#include "player.h"
int main()
{
sf::RenderWindow window(sf::VideoMode(750, 750), "SFML Works!");

player thePlayer;

const float gravity = .001;
int groundheight = 500;
sf::Vector2f velocity(sf::Vector2f(0, 0));

thePlayer.normal = true;


while (window.isOpen())
{
    sf::Event event;
    while (window.pollEvent(event))
    {
        if (event.type == sf::Event::Closed)
            window.close();

        if (event.type == sf::Event::KeyPressed)
        {
            if (thePlayer.car && event.key.code == sf::Keyboard::C)
            {
                thePlayer.car = false;
                thePlayer.spring = false;
                thePlayer.rocket = false;
                thePlayer.normal = true;
                break;
            }
            if (thePlayer.spring && event.key.code == sf::Keyboard::S)
            {
                thePlayer.car = false;
                thePlayer.spring = false;
                thePlayer.rocket = false;
                thePlayer.normal = true;
                break;
            }
            if (thePlayer.rocket && event.key.code == sf::Keyboard::R)
            {
                thePlayer.car = false;
                thePlayer.spring = false;
                thePlayer.rocket = false;
                thePlayer.normal = true;
                break;
            }
            if (event.key.code == sf::Keyboard::C)
            {
                thePlayer.car = true;
                thePlayer.spring = false;
                thePlayer.rocket = false;
                thePlayer.normal = false;
                break;
            }
            if (event.key.code == sf::Keyboard::R)
            {
                thePlayer.car = false;
                thePlayer.spring = false;
                thePlayer.rocket = true;
                thePlayer.normal = false;
                break;
            }
            if (event.key.code == sf::Keyboard::S)
            {
                thePlayer.car = false;
                thePlayer.spring = true;
                thePlayer.rocket = false;
                thePlayer.normal = false;
                break;
            }

        }

    }



    if (thePlayer.normal)
    {
        velocity.x = 0;
        thePlayer.normalSprite.move(velocity.x, velocity.y);
        if (thePlayer.normalSprite.getPosition().y < groundheight)
        {
            velocity.y += gravity;
        }
        else
        {
            thePlayer.normalSprite.setPosition(thePlayer.normalSprite.getPosition().x, groundheight);
            velocity.y = 0;
        }

    }

    if (thePlayer.car)
    {
        thePlayer.carSprite.move(velocity.x, velocity.y);
        if (thePlayer.carSprite.getPosition().y < groundheight)
        {
            velocity.y += gravity;
        }
        else
        {
            thePlayer.carSprite.setPosition(thePlayer.carSprite.getPosition().x, groundheight);
            velocity.y = 0;
        }

    }

    window.clear();
    if (thePlayer.normal)
    {
        window.draw(thePlayer.normalSprite);
    }
    if (thePlayer.car)
    {
        window.draw(thePlayer.carSprite);
    }

    window.display();
}
}

非常感谢!

我们错过了 main 函数来确切知道汽车生成时会发生什么,但我认为您在 Player 构造函数中初始化汽车并且在玩家按下 'C' 时不会移动它。

你应该有这样的东西:

if(event.key.code == sf::Keyboard::C) {
    player.spawnCar();
}

并在您的 spawnCar() 函数中:

carSprite.setPosition(normalSprite.getPosition());

编辑

正如我在评论中所说,您应该使用 getter 和 setter 来访问您的属性。根据你目前的main.cpp,你应该有这个:

if (event.key.code == sf::Keyboard::C)
{
    thePlayer.car = true;
    thePlayer.spring = false;
    thePlayer.rocket = false;
    thePlayer.normal = false;
    carSprite.setPosition(normalSprite.getPosition());
    break;
}

在绘制汽车之前,您应该将其位置调整到您的玩家位置:

if (thePlayer.car)
{
    thePlayer.carSprite.setPosition(thePlayer.normalSprite.getPosition());
    window.draw(thePlayer.carSprite);
}

但正如 ractiv 所说,您应该以不同的方式组织代码。我建议你在尝试做这种游戏之前多了解一下 c++ "good pratices"。