2017-02-27 5 views
1

SFMLで私の最初の小さなプロジェクトで作業しています。私は画面上で跳ね返っているボール(発射体)と移動可能なプレイヤーを作りました。しかし、問題は、オブジェクトにObjecthandlerを作成しようとしたときに発生しました。ハンドラーがオブジェクトの描画と更新を制御するようにした後、プレーヤーとボールはちょうど停止し、移動不能になりました。私の質問はなぜですか? ボール:SFMLでスプライトが動かない

#ifndef PROJECTILE_H 
#define PROJECTILE_H 
#include <SFML\Graphics.hpp> 
using namespace std; 

class Projectile : public sf::Drawable { 

private: 
    sf::Texture texture; 
    sf::Sprite sprite; 
public: 
    Projectile(); 
    virtual ~Projectile(); 
    sf::Sprite getSprite() const; 
    virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const; 
}; 

#endif //PROJECTILE_H 

#include "Projectile.h" 
#include <iostream> 

Projectile::Projectile() { 

    if (!this->texture.loadFromFile("../Resources/projectile.png")) { 
     cout << "Error! Projectile sprite could not be loaded!" << endl; 
    } 
    this->sprite.setPosition(sf::Vector2f(0.0f, 0.0f)); 
    this->sprite.setTexture(this->texture); 
    sf::FloatRect boundingBoxProjectile = this->sprite.getGlobalBounds(); 
} 

Projectile::~Projectile() { 
} 

sf::Sprite Projectile::getSprite() const{ 
    return this->sprite; 
} 

void Projectile::draw(sf::RenderTarget & target, sf::RenderStates states) const { 
    target.draw(sprite, states); 
} 

ハンドラ:

#ifndef OBJECTHANDLER_H 
#define OBJECTHANDLER_H 
#include "Block.h" 
#include "Player.h" 
#include "Projectile.h" 
using namespace std; 

class ObjectHandler : public sf::Drawable { 

private: 
    Player player; 
    Block block; 
    Projectile projectile; 
    int hitX = 0; 
    int hitY = 0; 
    float checkX; 
    float checkY; 
    float keyFrameDuration = 0.0f; 
    float speed = 500.0f; 
public: 
    ObjectHandler(); 
    virtual ~ObjectHandler(); 
    void updateProjectile(float dt); 
    void updatePlayer(float dt); 
    void updateBlock(float dt); 
    virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const; 
}; 

#endif OBJECTHANDLER_H 

#include "ObjectHandler.h" 

ObjectHandler::ObjectHandler() { 
    this->projectile = projectile; 
    this->block = block; 
    this->player = player; 
} 

ObjectHandler::~ObjectHandler() { 
} 

void ObjectHandler::updateProjectile(float dt) { 
    sf::Vector2f direction; 

    if (hitX == 0) { 
     direction = sf::Vector2f(0.5f, checkY); 
     checkX = 0.5f; 
     if (this->projectile.getSprite().getPosition().x >= 700) { 
      hitX = 1; 
     } 
    } 
    else if (hitX == 1) { 
     direction = sf::Vector2f(-0.5f, checkY); 
     checkX = -0.5f; 
     if (this->projectile.getSprite().getPosition().x <= 0) { 
      hitX = 0; 
     } 
    } 

    if (hitY == 0) { 
     direction = sf::Vector2f(checkX, 0.5f); 
     checkY = 0.5f; 
     if (this->projectile.getSprite().getPosition().y >= 460) { 
      hitY = 1; 
     } 
    } 
    else if (hitY == 1) { 
     direction = sf::Vector2f(checkX, -0.5f); 
     checkY = -0.5f; 
     if (this->projectile.getSprite().getPosition().y <= 0) { 
      hitY = 0; 
     } 
    } 

    this->projectile.getSprite().move(direction * speed * dt); 
} 

void ObjectHandler::draw(sf::RenderTarget & target, sf::RenderStates states) const { 
    this->block.draw(target, states); 
    this->projectile.draw(target, states); 
    this->player.draw(target, states); 
} 

そしてゲーム:

#ifndef GAME_H 
#define GAME_H 

#include <SFML\Graphics.hpp> 
#include "ObjectHandler.h" 

class Game : public sf::Drawable { 
private: 
    virtual void draw(sf::RenderTarget &target, sf::RenderStates states) const; 
    sf::Texture backgroundTexture; 
    sf::Sprite backgroundSprite; 
    ObjectHandler object; 
public: 
    Game(); 
    virtual ~Game(); 
    void update(float dt); 
}; 

#endif // GAME_H 

#include "Game.h" 
#include <iostream> 
using namespace std; 

void Game::draw(sf::RenderTarget & target, sf::RenderStates states) const { 
    target.draw(backgroundSprite, states); 
    target.draw(this->object, states); 
    } 

Game::Game() { 
    if (!backgroundTexture.loadFromFile("../Resources/levelOne.jpg")) { 
     cout << "The background could not be loaded!" << endl; 
    } 
    backgroundSprite.setTexture(backgroundTexture); 
} 

Game::~Game() { 
} 

void Game::update(float dt) { 
    this->object.updatePlayer(dt); 
    this->object.updateProjectile(dt); 
    this->object.updateBlock(dt); 
} 
+0

一般的な発言として、どこでも「this->」を削除できます。 C++では、特定の状況(テンプレートクラスなど)を除いて、メンバー関数を直接使用することができます。 – Lemko

+0

'ObjectHandler'のコンストラクタを空のままにしておきます。 'this-> projectile = projectile'などを再割り当てする必要はありません。コンストラクタの本体を入力する前にすべて初期化されています。 – tntxtnt

+0

チップをありがとう! – Henke

答えて

1

問題はあなたのsf::Sprite Projectile::getSprite()const戻り、実際のスプライトのコピーです。したがって、projectile.getSprite().move(...)がコピーによって呼び出されます。

方法あなたのProjectileためmoveください:

void Projectile::move(const sf::Vector2f& amount) 
{ 
    sprite.move(amount); 
} 

ObjectHandlerでそれを呼び出す:projectile.move(...)を。

getSpriteでスプライトの定数参照を返すと、複数コピーを避けることもできます:const sf::Sprite& Projectile::getSprite()constprojectile.getSprite().move(...)を呼び出して修正しようとするとエラーが発生し、バグが早く表示されます。

+0

Okey、ありがとうございました:D今はうまくいきます。 – Henke

関連する問題