Где моя текстура sfml выходит из области видимости?

Итак, у меня есть печально известная проблема белого квадрата (снова), и на этот раз я возвращаю ссылки везде, где это возможно, но безрезультатно. у меня есть Level который содержит вектор GamePiecesи каждый GamePiece объект содержит sf::sprite, Вот код, пытающийся нарисовать спрайт из GamePiece:

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

Функция двигателя, которая делает рисунок:

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

Много кода, я знаю, но я действительно не знаю, где текстура выходит за рамки, предполагая, что это не так. Глядя на похожие посты, это, вероятно, проблема, но опять же, мне нужна помощь, чтобы найти его.

1

Решение

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

piece в настоящее время скопированный в вектор. Элемент, который находится в векторе, не связан с объектом, из которого он был скопирован (тот, который связан с областью действия AddPiece()). Поэтому любые действия, предпринятые на piece не влияет на элемент, который был вставлен.

Если вам нужно получить доступ к элементу, который ранее push_back()‘затем используйте back() вернуть ссылку на него:

gamePieces_.back().SetShape();

Вы могли бы также просто позвонил SetShape() перед вставкой в ​​вектор.

2

Другие решения


По вопросам рекламы [email protected]