【问题标题】:Problems with getPosition() in SFMLSFML 中的 getPosition() 问题
【发布时间】:2018-07-04 15:32:48
【问题描述】:

我是 C++ 新手,所以我对这个有点困惑。我试图让玩家产生,然后当用户按下“C”时,玩家会用汽车切换。当前发生的情况是玩家最初在正确的位置生成,然后汽车在玩家最初生成的位置生成,而不是当前所在的位置。但是,由于我使用的是函数getPosition(),我会假设它会在玩家的当前位置生成。

播放器.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();
};

播放器.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();
}
}

非常感谢!

【问题讨论】:

  • 你能告诉我们你在哪里生成汽车的代码吗?
  • 好的,给我一秒钟

标签: c++ sfml


【解决方案1】:

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

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

但正如 ractiv 所说,您应该以不同的方式组织代码。我建议你在尝试做这类游戏之前了解更多关于 c++ 的“好习惯”。

【讨论】:

  • 完美运行!谢谢!
  • 关于编码的“良好实践”,您的代码可以正常工作,但您应该以不同的方式组织它
【解决方案2】:

我们错过了 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;
}

【讨论】:

  • spawnCar() 函数应该在 Player.h 还是 Player.cpp 中?
  • 这取决于你如何组织你的代码。我建议您将属性设置为私有,并将 getter 和 setter 添加到您的类中。我用来做的就是在头文件中声明属性和方法并实现是一个.cpp文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-15
  • 2011-04-08
  • 1970-01-01
  • 2012-06-05
  • 2018-05-23
  • 1970-01-01
  • 2021-01-04
相关资源
最近更新 更多