2015-02-07 2 views
0

그래서 Game 클래스의 기본 창에 타일을 그리고 mapRender 함수에 대한 참조로 주 창을 전달하는 mapReader라는 다른 클래스에서 mapRender 함수를 만들고 있지만 그리지는 않습니다. mainwindow에 타일 ??? 내가 메인 게임 클래스에서 그것을 테스트하고 제대로 작동하지 않습니다, 그냥 제대로 작동하지 않는 창 참조를 전달하려고합니다.전달 SF :: RenderWindow 참조

완전한 예 :

MAIN.CPP

#include <Game.h> 

int main() 
{ 
    Game game; 
    game.run(); 
} 

Game.h

#ifndef GAME_H 
#define GAME_H 

#include <iostream> 
#include <Draw.h> 

class Game 
{ 
    public: 
     Game(); 
     void run(); 
     void render(); 

    private: 
     sf::RenderWindow window; 

}; 

#endif // GAME_H 

Game.cpp

#include "Game.h" 

Game::Game() 
{ 
    sf::VideoMode vmode(640,480); 
    window.create(vmode,"Reference passing"); 
    Draw d; 
    d.mapLoader(); 
} 

void Game::run() 
{ 
    while(window.isOpen()) 
    { 
     sf::Event event; 
     while(window.pollEvent(event)) 
     { 
      switch(event.type) 
      { 
      case sf::Event::Closed: 
       window.close(); 
       break; 
      default: 
       break; 
      } 
     } 
     render(); 
    } 
} 

void Game::render() 
{ 
    Draw d; 
    window.clear(); 
    d.mapRender(window); 
    window.display(); 

} 

Draw.h

#ifndef DRAW_H 
#define DRAW_H 

#include <iostream> 
#include <fstream> 
#include <cctype> 
#include <string> 
#include <SFML/Graphics.hpp> 


class Draw 
{ 
    public: 
     void mapLoader(); 
     void mapRender(sf::RenderWindow& rWindow); 
    private: 
     private: 
     sf::Vector2i levelMap[21][16]; 
     sf::Vector2i loadCounter; 
     sf::Texture tileTexture; 
     sf::Sprite tiles; 
}; 

#endif // DRAW_H 

Draw.cpp

#include "Draw.h" 


void Draw::mapLoader() 
{ 
    loadCounter=sf::Vector2i(0,0); 
    if(!tileTexture.loadFromFile("mapSprite.png")) 
     std::cout<<"\n\nMAP LOAD FAILED!\n"<<std::endl; 
    tiles.setTexture(tileTexture); 

    std::ifstream openFile; 
    openFile.open("mapfile.txt"); 
    loadCounter=sf::Vector2i(0,0); 
    if(openFile.is_open()) 
    { 
     while(!openFile.eof()) 
     { 
      std::string str; 
      openFile>>str; 
      char x=str[0],y=str[2]; 
      if(!isdigit(x)&&!isdigit(y)) 
       levelMap[loadCounter.x][loadCounter.y]=sf::Vector2i(-1,-1); 
      else 
       levelMap[loadCounter.x][loadCounter.y]=sf::Vector2i(x-'0',y-'0'); 

      if(openFile.peek()=='\n') 
      { 
       loadCounter.x=0; 
       loadCounter.y++; 
      } 
      else 
      loadCounter.x++; 
     } 
     loadCounter.y++; 
    } 

} 

void Draw::mapRender(sf::RenderWindow& rWindow) 
{ 
    for(int i=0;i<20;i++) 
    { 
     for(int j=0;j<15;j++) 
     { 
      if(levelMap[i][j].x!=-1 && levelMap[i][j].y!=-1) 
      { 
       tiles.setPosition(i*32,j*32); 
       tiles.setTextureRect(sf::IntRect(levelMap[i][j].x*32,levelMap[i][j].y*32,32,32)); 
       rWindow.draw(tiles); 
      } 
     } 
    } 
} 

mapfile.txt

x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x 0,0 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 0,0 x,x x,x x,x x,x x,x 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 0,0 x,x x,x x,x x,x 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 0,0 x,x x,x x,x 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 1,0 1,0 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 
0,0 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 0,0 
0,0 0,0 x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x x,x 0,0 0,0 
+0

렌더 창을 참조로 전달하면 문제가 없습니다. 오류는 다른 위치에 있어야합니다. [MCVE] (http://stackoverflow.com/help/mcve)를 게시 할 수 있습니까? – nvoigt

+0

mapReader 클래스에 Game 클래스 헤더를 포함해야합니까? 게임 클래스에서 테스트 해봤는데 정상적으로 작동합니다. 다른 클래스에 대한 참조로 전달할 때 창에 그리지 않습니다. 필요한 경우 MCVE를 제공 할 수 있습니다. –

+0

제가 말했듯이, 일반적으로 이것을 참고로 전달합니다. 귀하의 코드에 뭔가 문제가 있어야합니다. 완전한 예를 게시하면 실제로 무엇인지 파악할 수 있습니다. – nvoigt

답변

0

당신은 당신이 그것을 사용하는 시간 Draw d;의 새로운 인스턴스를 재 작성하십시오. 이 인스턴스를 번 (예 : 클래스 멤버로)으로 만들고이를 사용하십시오. d에지도를로드하기 때문에 그림에 사용할 d과 같지 않습니다.