SFML Sprites根本不显示

时间:2016-05-05 21:14:52

标签: c++ sfml

我有一个方法应该使用64x128的spritesheet并将其转换为8x8精灵。

从存储的Image中找到每个纹理后,它会被添加到精灵中,并且该精灵被添加到我的main方法中调用的精灵数组中。

之前我测试过显示静态精灵,我的代码工作正常(我成功显示了1个8x8精灵)

然而,当我试图在我的精灵列表中显示128个精灵中的任何一个时,现在都没有渲染。

我认为逻辑错误可能在我的MakeSprite方法中,但我不确定,我无法看到问题所在。

[编辑]:似乎我调用的每个精灵都在spritesheet的末尾返回精灵(精灵128)

[编辑2]:上一个精灵的纹理(tex)会被下一个要生成的精灵覆盖。

以下是我的代码的完整可验证的工作示例:

的main.cpp

#include "Main.h"




int main() {

    srand(time(NULL));


    RenderWindow window(VideoMode(1280, 720), "Conduit");


    MakeCircle(10, 100, 100, Color::White);
    MakeCircle(30, 10, 100, Color::Cyan);
    MakeCircle(100, 200, 100, Color::Magenta);
    MakeCircle(100, 400, 100, Color::Cyan);



    if (!LoadSpritesheet())
    {
        return 1;
    }

    while (window.isOpen()) {

        Event event;
        while (window.pollEvent(event)) {

            if (event.type == Event::Closed)
                window.close();
            else if (event.key.code == Keyboard::Num1)
            {

                DrawRandomSprite(window);
            }
        }



        window.clear();
        DrawCircles(window);


        int c = 0;

        for (int i = 0; i < 128; i++)
        {

            Spritesheet.at(i).setPosition(c, c);
            window.draw(Spritesheet.at(i));
            c += 8;
        }





        window.display();
    }

}


void DrawRandomSprite(RenderWindow &window)
{

    //DEBUG METHOD: draws a random sprite for testing.

    int sprite = rand() % 128 + 1;



    Spritesheet.at(sprite).setPosition(rand() % 128 + 1, rand() % 128 + 1);

    window.draw(Spritesheet.at(sprite));



}

void MakeCircle(float radius, float xpos, float ypos, Color color)
{
    //makes a circle then adds it to the circle vector.
    CircleShape shape;
    shape.setRadius(radius);
    shape.setPosition(xpos, ypos);
    shape.setFillColor(color);

    Circles.push_back(shape);
}

void DrawCircles(RenderWindow &window)
{
    //Renders the circles in the circles vector.

    for (int i = 0; i < Circles.size(); i++)
    {
        window.draw(Circles.at(i));
    }
}

int LoadSpritesheet()
{
    //make sure spritesheet exists, then loads it into an image.

    Texture sheet;
    if (!sheet.loadFromFile("Sprites/A.png"))
    {
        return 0;
    }
    else
    {
        sheetIMG = sheet.copyToImage();
        SetMask();
        MakeSprite(8, 4);
        return 1;
    }


}

void SetMask()
{
    //creates a mask.

    sheetIMG.createMaskFromColor(sf::Color(151, 56, 14, 0), 100);


}

void MakeSprite(int dimension, int scale)
{
    //seperates the spritesheet into a list of 8x8 modular sprites.

    int c = 0, r = 0;

    do
    {
        for (int i = 0; i <= (sheetIMG.getSize().x * sheetIMG.getSize().y) / 64; i++)
        {
            if (r == 64)
                break;
            if (!tex.loadFromImage(sheetIMG, IntRect(c, r, dimension, dimension)))
                break;
            else
            {
                Sprite spr;
                spr.setTexture(tex);
                spr.setScale(scale, scale);
                Spritesheet.push_back(spr);
                c += dimension;
                if (c == sheetIMG.getSize().x) { c = 0; r+=8; };
            }
        }
    } while (r < sheetIMG.getSize().y);     
}

Main.h

#pragma once
#include <SFML/Graphics.hpp>
#include <vector>
#include <stdio.h>      /* printf, scanf, puts, NULL */
#include <stdlib.h>     /* srand, rand */
#include <time.h>       /* time */


//standard and SFML namespaces;
using namespace std;
using namespace sf;



//===============================VARIBLES===========================


//the main spritesheet.

Texture tex;

Image sheetIMG;

//array to hold circles.
vector<CircleShape> Circles;

//array to hold sprites.
vector<Sprite> Spritesheet;

//===============================PROTOTYPES=============================



void DrawCircles(RenderWindow &window);
void MakeCircle(float radius, float xpos, float ypos, Color color);
void MakeSprite(int dimension, int scale);
void SetMask();
int LoadSpritesheet();
void DrawRandomSprite(RenderWindow &window);

2 个答案:

答案 0 :(得分:0)

您的代码存在两个主要问题:

  1. 您正在使用全局变量。虽然这可能对某些库来说没问题,但使用SFML这根本不是一件好事。

  2. 在致电clear后,您DrawRandomSprite正在关注窗口。因此,你的精灵永远不会出现。

答案 1 :(得分:0)

所有精灵都具有相同的纹理:tex。由于tex是一个全局变量,当你的循环结束时,它被设置为最后一个纹理。所以所有的精灵都会画出最后的纹理。你需要摆脱全局变量并且每个精灵有一个纹理(或者每个精灵至少有一个你希望拥有不同纹理的纹理)。