Итак, у меня есть печально известная проблема белого квадрата (снова), и на этот раз я возвращаю ссылки везде, где это возможно, но безрезультатно. у меня есть 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;
}
Много кода, я знаю, но я действительно не знаю, где текстура выходит за рамки, предполагая, что это не так. Глядя на похожие посты, это, вероятно, проблема, но опять же, мне нужна помощь, чтобы найти его.
void Level::AddPiece() {
GamePiece piece(imgr);
gamePieces_.push_back(piece);
piece.SetShape();
}
piece
в настоящее время скопированный в вектор. Элемент, который находится в векторе, не связан с объектом, из которого он был скопирован (тот, который связан с областью действия AddPiece()
). Поэтому любые действия, предпринятые на piece
не влияет на элемент, который был вставлен.
Если вам нужно получить доступ к элементу, который ранее push_back()
‘затем используйте back()
вернуть ссылку на него:
gamePieces_.back().SetShape();
Вы могли бы также просто позвонил SetShape()
перед вставкой в вектор.