2017-02-27 79 views
1

我正在使用SFML中的第一個小項目。我製作了一個在屏幕上彈跳的球(彈丸)和一個可移動的球員。然而,這個問題發生在我試圖爲我的對象創建一個Objecthandler的時候。在讓處理者控制了對象的繪製和更新之後,玩家和球剛停下來並且變得不可移動。我的問題是爲什麼? 球:Sprite不會移動到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(...)被副本調用。

製作方法move爲您Projectile

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

,並調用它在ObjectHandlerprojectile.move(...)

您可能還希望在getSprite中返回對您的精靈的常量引用以避免多個副本:const sf::Sprite& Projectile::getSprite()const。當您嘗試通過調用projectile.getSprite().move(...)來修改它時會導致錯誤,並且您會更快地看到錯誤。

+0

Okey,非常感謝你:D現在工作正常。 – Henke