2017-02-26 10 views
0

私は限られたPythonの経験からC++に来たのだろうか? PythonではGUIを扱うためにTkinterを使うことが多く、キャンバスやウィンドウをそれを格納する他のクラスに渡してキャンバスに描画することができます。SFML RenderWindowをクラスに渡す

私はSFMLとC++で同じことをしようとしていますが、今のところ、メソッドが呼び出されるたびにsf::RenderWindowをメソッドに渡す必要があるソリューションしか見つかりませんでした。

たとえば、Player.move( 'up')が呼び出されるたびに、プレーヤーのスプライトを保持し、スプライトを移動したいと思う 'player'クラスがあります。

MAIN.CPP

#include <SFML/Window.hpp> 
#include <SFML/Graphics.hpp> 
#include "Player.h" 
int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(800, 600), "My Game"); 

    Player player(); //Nothing passed 
    player.move(window, "up"); //Pass window every time 
    player.move(window, "down"); 
    player.move(window, "left"); 
    return 0; 
} 
:私は、次のコードを使用する必要があります(それは少し間違っている可能性があり、私は電車の中ながら、これを入力したが、うまくいけば、あなたが画像を取得する)と言ったVEの

Player.cpp

Player::move(sf::RenderWindow& window, char direction){ 
    /*Code to move the sprite shall be on this line*/   
    window.draw(sprite); 
} 

私は法にレンダリングウィンドウwindowを渡すと、巨大な苦労はありませんが、もっとこのようにそれを行う方法がなければならないように私は感じていることを理解する:

MAIN.CPP

#include <SFML/Window.hpp> 
#include <SFML/Graphics.hpp> 
#include "Player.h" 
int main(){ 
    sf::RenderWindow window(sf::VideoMode(800, 600), "My Game"); 

    Player player(window); //Pass window once. 
    player.move("up"); // Relax knowing that everything is already handled. 
    player.move("down"); 
    player.move("left"); 
    return 0; 
} 

Player.cpp

Player::Player(sf::RenderWindow& win_gui){ 
    window = win_gui; 
} 

Player::move(char direction){ 
    /*various case statements to move the sprite on this line*/   
    window.draw(sprite); 
} 

私は巨大なものや完全に誤解しているものを紛失しています。私の推測は両方です。それが別の言語で可能なら、なぜC++ではないでしょうか?

+5

を'move'でも' draw'を呼び出しますか?ゲームロジックからレンダリングを分離する。 – LogicStuff

+0

'' down''は二重引用符でなければなりません。このコードはコンパイルされていますか? –

+0

Guillame、私は一重引用符を修正しました。私は現在非常に長い列車の旅に乗っていて、これを記憶からタイプしているので、おそらくもっと間違いがあります。 LogicStuff、なぜ '移動'は '描画'を呼び出すべきではありませんか? 私は、メソッドが誰もが期待するプロセスの多くを処理するように教えられてきました。このクラスをSFMLゲームで動作させるために私が誰かに与えて、 "player.move(" up ");とタイプすると、プレーヤーが上に動かないと、彼らはかなり混乱するでしょう。私が方法でそのようなことをすることができないならば、私たちが世界で持っている唯一のものは、ゲッターとセッターです。どれくらい退屈です! – Matchoo

答えて

1

純粋な仮想draw()メソッドを含むsf::Drawableから継承できます。

class Player : public sf::Drawable 
{ 
    protected: 
      void draw(sf::RenderTarget& target, sf::RenderStates state) const 
      { 
       target.draw(sprite); 
      } 
}; 

Playerクラスはsf::Drawableなりながら、あなたはこれを行うことができるようになります:なぜべき

Player player; 
window.draw(player); 

ザッツも実体は形状のようSFMLに描かれているか、スプライト、頂点など

+0

おっと、私はこれが大好きです!かなり私が考えていた解決策ではありませんが、それは非常によく見えます。だから、私のプレーヤークラスはまだスプライトなど(と私はそれが欲しい他のデータ)を格納しますが、それは別の方法でメインループで処理されますか?私はこれが好き。 xD – Matchoo

+0

@Matthewはい、プレイヤーのdraw()メソッド内で描画ロジックを行います。あなたは 'sprite2'と呼ばれる別のスプライトを持っていて、次に' target.draw(sprite);を実行します。 target.draw(スプライト2); '....あなたはまた、window.draw(playerObj.getSprite());を行うことができます。 –

関連する問題