c++ - 我的 sfml 纹理在哪里超出范围?

标签 c++ sfml square

所以我(又)遇到了臭名昭著的白方 block 问题,这次我尽可能地返回引用文献,但无济于事。我有一个包含 GamePieces vector 的 Level,每个 GamePiece 对象都包含一个 sf::sprite。下面是尝试从 GamePiece 绘制 Sprite 的代码:

引擎.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();
}

请记住,wallTilebgTile 绘制得很好,是最后一个 for 循环给我白色方 block 。

这里是相关的函数和类:

//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 正在复制到 vector 中。驻留在 vector 中的元素与从中复制它的对象(绑定(bind)到 AddPiece() 范围的对象)没有关联。因此,对 piece 采取的任何操作都不会影响插入的元素。

如果您需要访问之前 push_back() 编辑的元素,请使用 back() 返回对它的引用:

gamePieces_.back().SetShape();

您也可以在将其插入 vector 之前调用 SetShape()

关于c++ - 我的 sfml 纹理在哪里超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25879719/

相关文章:

android - Retrofit - @Body 参数不能与表单或多部分编码一起使用

c++ - 返回具有未初始化成员的内联定义结构。 C++

c++ - 如何开启英特尔C++编译器12.1.2的C++0x

c++ - SFML 不会画任何东西?

c++ - SFML 未加载图像(可能是由于放置错误的位置?)

ios - curl 命令、-H 选项和 Square API

C++ - 在创建类对象 vector 时使用 delete 的正确方法

c++ - 为什么依赖的应用程序要使用与动态库相同的编译器?

c++ - Texture.loadFromFile 不起作用

android - 在空属性上改造 SimpleXMLConverter NumberFormatException