2017-02-26 4 views
0

에 전달 제한된 Python 경험을 통해 C++로 왔습니다. 파이썬에서는 GUI를 처리하기 위해 Tkinter를 자주 사용하고, '캔버스'또는 '창'을 다른 클래스에 전달한 다음 캔버스/창에 그릴 수 있습니다.SFML RenderWindow를 클래스

SFML과 C++에서 동일한 작업을 수행하려고하지만, 지금까지 메서드가 호출 될 때마다 sf::RenderWindow을 메서드에 전달해야하는 솔루션을 발견했습니다.

예를 들어 Player.mrite ('up')가 호출 될 때마다 플레이어의 스프라이트를 잡고 스프라이트를 이동하려는 'player'클래스가 있습니다. 발견했습니다 나는 다음과 같은 코드를 사용하여이 있다고 (이 약간 잘못되었을 수 있습니다, 난 그냥 기차 동안이를 입력 한, 그러나 희망 당신은 그림을 얻는다) :

#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; 
} 

하여 Main.cpp를

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

해야하는 이유 '움직여''드로 (Draw) '라고 부르기까지? 게임 논리에서 렌더링을 격리합니다. – LogicStuff

+0

''down''은 큰 따옴표 여야합니다. 이 코드가 컴파일됩니까? –

+0

Guillame, 저는 작은 따옴표를 수정했습니다. 나는 현재 매우 긴 열차 여행을하고 있으며 추억을 통해이를 타이핑 했으므로 아마 더 많은 실수가있을 수 있습니다. LogicStuff, 왜'move'를'move'하지 말아야합니까? 나는 누군가가 예상 할 수있는 많은 프로세스를 메서드가 처리하도록 만드는 법을 배웠습니다. 이 클래스를 SFML 게임에서 사용할 수 있도록 누군가에게 제공하고 "player.move ("up ");" 플레이어가 위로 올라가지 않으면 꽤 혼란 스러울 것입니다. 방법으로 그런 종류의 일을 할 수 없다면 우리가 세상에서 가질 수있는 유일한 것은 게이 터와 세터입니다. 얼마나 지루한 지요! – Matchoo

답변

1

순수 가상 draw() 메서드가 포함 된 sf::Drawable에서 상속받을 수 있습니다. Player 클래스는 sf::Drawable되고

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

동안, 당신은이 작업을 수행 할 수있을 것입니다 :

Player player; 
window.draw(player); 
실체는 모양, 스프라이트, 정점 등처럼 sfml 그려하는 방법도

그게

+0

오, 이거 아주 좋아! 내가 생각하고 있던 해결책은 아니지만 아주 좋아 보인다. 그래서, 내 플레이어 클래스 여전히 스프라이트 등 (뿐만 아니라 내가하고 싶습니다) 다른 데이터를 저장하지만 그것은 달리 메인 루프에서 처리되는거야? 나는 이것을 좋아한다. xD – Matchoo

+0

@Matthew 예, 플레이어의 draw() 메소드 내부에서 드로잉 로직을 사용합니다.당신은'sprite2'라고하는 또 다른 스프라이트를 가지면, 당신은'target.draw (sprite); target.draw (sprite2);'.... 당신도 할 수 window.draw (playerObj.getSprite()); –