我的渲染窗口中没有绘制我的精灵数组

时间:2014-03-28 23:18:28

标签: c++ arrays sfml

所以我想做一个象棋游戏,当然我开始只是制作棋盘。为此我创建了一个像8x8这样的二维数组。每个瓷砖都有自己的对象精灵,名为tileSprite,我试图将它们定义为屏幕宽度和高度的1/8,其固定大小为1024x768。加载的纹理只有1像素黑色或白色。该程序没有给出确定的错误,但是绘制的图块没有显示在我的窗口上,我看到的只是一个红色的屏幕,我从清除屏幕得到的结果(遵循SFML的标准清除/绘制/显示周期) )。

#include "SFML/Window.hpp"
#include "SFML/Graphics.hpp"
#include "SFML/Audio.hpp"

#include <iostream>
#include <vector>
#include <array>

bool playing = true;

class Textures {
public:
    static void loadTextures();

    sf::Texture static blackTile;
    sf::Texture static whiteTile;
};
/*---Class--Definitions----*/
sf::Texture Textures::blackTile;
sf::Texture Textures::whiteTile;
/*-------------------------*/

void Textures::loadTextures() {
    if (blackTile.loadFromFile("Images/blackTile.PNG")) {
        return;
    }
    else if (whiteTile.loadFromFile("Images/whiteTile.PNG")) {
        return;
    }
}

class ChessBoard_Tiles {
public:
    static void _initialize();
    static void draw(sf::RenderWindow& window);

    enum TileStatus { EMPTY, OCCUPIED, HIGHLIGHTED };

    struct TileSlot {
        sf::Sprite tileSprite;
        TileStatus tileStatus;
    };

private:
    typedef std::array< std::array<TileSlot*, 8>, 8 > TileType;
    static TileType tileBoard;
};
/*-Class Definition that has to be called-*/
ChessBoard_Tiles::TileType ChessBoard_Tiles::tileBoard = ChessBoard_Tiles::TileType();

void ChessBoard_Tiles::_initialize() {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            tileBoard[i][j] = new TileSlot();

            if ((i + j) % 2 == 0) {
                tileBoard[i][j]->tileSprite.setTexture(Textures::whiteTile);
            }
            else {
                tileBoard[i][j]->tileSprite.setTexture(Textures::blackTile);
            }

            tileBoard[i][j]->tileSprite.setPosition(128 * j, 96 * i);
            tileBoard[i][j]->tileSprite.setScale(128, 96);
            tileBoard[i][j]->tileStatus = EMPTY;
        }
    }
}

void ChessBoard_Tiles::draw(sf::RenderWindow& window) {
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            window.draw(tileBoard[i][j]->tileSprite);
        }
    }
}

int main(int argc, char* argv[]) {
    sf::RenderWindow renderWindow;
    renderWindow.create(sf::VideoMode(1024, 768), "Chess");

    Textures::loadTextures();
    ChessBoard_Tiles::_initialize();

    while (playing) {
        sf::Event currentEvent;
        renderWindow.pollEvent(currentEvent);

        if (currentEvent.type == sf::Event::Closed) {
            renderWindow.close();
            playing = false;
        }

        if (currentEvent.type == sf::Event::KeyPressed) {
            if (currentEvent.key.code == sf::Keyboard::Escape) {
                renderWindow.close();
                playing = false;
            }
        }

        renderWindow.clear(sf::Color::Red);
        std::cout << "Clear\n";

        ChessBoard_Tiles::draw(renderWindow);
        std::cout << "Draw\n";

        renderWindow.display();
        std::cout << "Display\n";
    }

    return 0;
}

如果有人知道什么是错的,那对我来说将是一个很大的帮助..否则我可能不得不完全重新制作这个程序,我认为到目前为止应该有效,但我还没有没有想法为什么它没有。非常感谢提前=)

编辑:如果纹理超出范围,请阅读一些关于sprite似乎消失的内容。如果是这种情况,那么可以指出然后我可以继续工作,因为我已经尝试过了现在很多不同的事情,我觉得我只是在圈子里去?

1 个答案:

答案 0 :(得分:0)

错误来自loadTextures()函数,我忘记在其中包含要加载的文件的文件扩展名,我搞砸了关于loadFromFile()函数的逻辑,所以程序只有在没有&#时才会继续39; t加载文件..