Проблемы с getPosition () в SFML - PullRequest
0 голосов
/ 04 июля 2018

Я новичок в 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();
}
}

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Прежде чем нарисовать машину, вы должны отрегулировать ее положение в соответствии с позицией игрока:

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

Но, как сказал ractiv, вы должны организовать свой код иначе. Я предлагаю вам узнать больше о "хороших правилах" c ++, прежде чем пытаться делать такие игры.

0 голосов
/ 04 июля 2018

Нам не хватает функции main, чтобы точно знать, что происходит, когда появляется машина, но я думаю, что вы инициализируете машину в конструкторе Player и не перемещаете ее, когда игрок нажимает клавишу «C».

У вас должно быть что-то подобное:

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

и в вашей spawnCar() функции:

carSprite.setPosition(normalSprite.getPosition());

EDIT

Как я сказал в своем комментарии, вы должны использовать геттеры и сеттеры для доступа к вашим атрибутам. Согласно вашему текущему 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;
}
...