2014-09-16 4 views
1

그래서 악명 높은 흰색 사각형 문제 (다시)가 있으며 이번에는 가능한 한 참조를 반환하지만 아무 소용이 없습니다. 나는 GamePieces의 벡터를 가지고있는 Level을 가지고 있고, 각각 GamePiecesf::sprite을 가지고있다.내 sfml 텍스처가 어디에서 범위를 벗어나니까?

Engine.h :

#pragma once 
#include "stdafx.h" 
#include "SFML/Graphics.hpp" 
#include "ImageManager.h" 
#include "Level.h" 
#include "GamePiece.h" 

class Engine{ 
public: 
    Engine(); 
    ~Engine(); 

    void Go(); 
private: 
    void ProcessInput(); 
    void UpdateCPU(); 
    void Render(); 

    sf::RenderWindow window; 

    ImageManager imgr; 
    Level level; 
}; 

엔진의 기능 도면을 수행합니다 여기 GamePiece에서 스프라이트 그리는 시도하는 코드이다

void Engine::Render(){ 
    window.clear(); 
    //draw wall tiles 
    for(int i = 0; i < 160; i++){ 
     if(i < 60){ 
      level.GetWallTile().setPosition(0, i * 10); 
      window.draw(level.GetWallTile()); 
     } 
     if(i >= 60 && i < 100){ 
      level.GetWallTile().setPosition((i - 60) * 10, 590); 
      window.draw(level.GetWallTile()); 
     } 
     if(i >= 100){ 
      level.GetWallTile().setPosition(390, (i - 100) * 10); 
      window.draw(level.GetWallTile()); 
     } 
    } 

    //draw BG tiles 
    for(int i = 1; i < 39; i++){ 
     for(int j = 0; j < 59; j++){ 
      level.GetBGTile().setPosition(i * 10, j * 10); 
      window.draw(level.GetBGTile()); 
     } 
    } 
    for(int i = 0; i < level.GetGamePieces().size(); i++){ 
     window.draw(level.GetGamePieces()[i].GetPieceSprite()); 
    } 

    window.display(); 
} 

명심를 그 wallTile 's 및 bgTile 괜찮아요, 그게 나를 위해 흰색 사각형을주는 루프 마지막이야. 여기

는 관련 함수와 클래스입니다 : 코드의

//level.h 
#pragma once 
#include "stdafx.h" 
#include "SFML/Graphics.hpp" 
#include "ImageManager.h" 
#include "GamePiece.h" 

class Level{ 
public: 
    Level(ImageManager &im); 
    ~Level(); 

    sf::Sprite &GetWallTile(); 
    sf::Sprite &GetBGTile(); 

    void AddPiece(); 
    std::vector<GamePiece> &GetGamePieces(); 
private: 
    ImageManager &imgr; 
    //not sure if vector needed, or one sprite 
    //std::vector<sf::Sprite> wallTiles_; 
    sf::Sprite wallTile; 
    //std::vector<sf::Sprite> bgTiles_; 
    sf::Sprite bgTile; 
    std::vector<GamePiece> gamePieces_; 
}; 
//Level.cpp 
#include "stdafx.h" 
#include "Level.h" 

Level::Level(ImageManager &im) : imgr(im){ 
    im.AddResourceDirectory("images/"); 
    wallTile.setTexture(im.GetImage("walltile1.png")); 
    bgTile.setTexture(im.GetImage("bgtile1.png")); 
    AddPiece(); 
} 

Level::~Level(){ 

} 

void Level::AddPiece(){ 
    GamePiece piece(imgr); 
    gamePieces_.push_back(piece); 
} 

std::vector<GamePiece> &Level::GetGamePieces(){ 
    return gamePieces_; 
} 

//GamPiece.h 
class GamePiece{ 
public: 
    GamePiece(ImageManager &im); 
    ~GamePiece(); 

    void SetShape(); 
    sf::Sprite &GetPieceSprite(); 
private: 
    ImageManager &imgr; 
    sf::Sprite pieceShape; 
}; 
//and GamePiece.cpp 

#include "stdafx.h" 
#include "GamePiece.h" 

GamePiece::GamePiece(ImageManager &im) : imgr(im){ 
    SetShape(); 
} 

GamePiece::~GamePiece(){ 

} 

void GamePiece::SetShape(){ 
    //int temp = rand() % 7; 
    int temp = 0; 
    switch(temp){ 
    case 0: 
     pieceShape.setTexture(imgr.GetImage("line.png")); 
    case 1: 
     pieceShape.setTexture(imgr.GetImage("llblock.png")); 
    case 2: 
     pieceShape.setTexture(imgr.GetImage("rlblock.png")); 
    case 3: 
     pieceShape.setTexture(imgr.GetImage("square.png")); 
    case 4: 
     pieceShape.setTexture(imgr.GetImage("lsquiggly.png")); 
    case 5: 
     pieceShape.setTexture(imgr.GetImage("rsquiggly.png")); 
    case 6: 
     pieceShape.setTexture(imgr.GetImage("tblock.png")); 
    } 
} 

sf::Sprite &GamePiece::GetPieceSprite(){ 
    return pieceShape; 
} 

많은, 나도 알아,하지만 난 정말 잘못 무엇 가정, 질감이 범위를 벗어나 어디로 가는지 모른다. 유사한 게시물을 살펴보면 문제가 될 수 있지만 다시 찾는 데 도움이 필요합니다.

+0

사실, 너무 많은 코드! 실제로 텍스쳐 구조를 어디에서 인스턴스화합니까? 멤버로서의 텍스처를 인스턴스화하는 클래스 ('GamePiece'?)는 어디에서 인스턴스화되고 범위를 벗어나니까? –

+0

GamePiece는 생성자에서 SetShape()를 호출하고이 함수는 스프라이트의 텍스처를 설정합니다. – jburn7

답변

2
void Level::AddPiece() { 
    GamePiece piece(imgr); 
    gamePieces_.push_back(piece); 
    piece.SetShape(); 
} 

piece 벡터에 복사되고있다. 벡터에있는 요소는 복사 된 개체 (AddPiece()의 범위에 바인딩 된 개체)와 연결되어 있지 않습니다. 따라서 piece에서 취한 조치는 삽입 된 요소에 영향을주지 않습니다.

이전 push_back() '에드는, 다음에 대한 참조를 반환 back()을 사용하는 요소에 액세스해야하는 경우 : 벡터에 삽입하기 전에

gamePieces_.back().SetShape(); 

또한 단지 SetShape()라는 수도 있습니다.

+0

그에 따라 코드를 편집했습니다. 나는 내가 게시하자마자 그것을 붙 잡았다. 내가 전에 말했던 것 (당신이 인용 한 것)은 심지어 하얀 사각형을 렌더링하지 않았다. 이제'SetShape()'를 호출하기 전에 조각을 뒤로 밀면 다시 흰색 사각형으로 돌아갑니다. – jburn7

+1

@ jburn7 각 case의 마지막 문장 다음에'break;'를 넣지 않을 것입니다. 도움이 될지도 몰라. – 0x499602D2

+1

@ jburn7 또한,'window.display()'전에'window.clear()'를해야합니다. – 0x499602D2