2016-05-05 19 views
-1

私は64x128のスプライトシートを8x8スプライトに変換する方法があります。SFMLスプライトがまったく表示されない

保存された画像から各テクスチャが見つかった後、そのテクスチャはスプライトに追加され、そのスプライトは私のメインメソッドで呼び出されているスプライト配列に追加されます。

私は前に静的なスプライトを表示するテストしている、と私のコードが働いしかし

(私は成功した1つの8x8のスプライトを表示)スプライトの私のリストに128個のスプライトのいずれかを表示しようとしたときに、今、何がされていませんレンダリングされる。

論理エラーは私のMakeSpriteメソッドにあると信じていますが、わかりませんが、どこに問題があるのか​​わかりません。

[EDIT]:私が呼ぶすべてのスプライトはspritesheetの一番最後にスプライトを返しているようです(128スプライト)

[編集2]:前回のテクスチャ(テックス)スプライトは、スプライトされる次のスプライトによって上書きされます。以下は

私のコードの完全な検証作業の例です:

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); 
+0

すでに2つの問題が確認されているようです。あなたの[mcve]には、必要と思わないコードがあります。そしてあなたの変数 'tex'は毎回オーバーライドされます。たぶんあなたはそれらを最初に修正し、私たちがチェックアウトするために短い[mcve]で戻ってくるべきでしょう。 – nvoigt

答えて

0

あなたの持つ2つの大きな問題がありますコード:

  1. グローバル変数を使用しています。これはいくつかのライブラリでは問題ないかもしれませんが、SFMLではこれはまったく良いことではありません。

  2. あなたはDrawRandomSpriteを呼び出した後、ウィンドウをclearにしています。したがって、あなたのスプライトは決して現れません。

+0

まあ、スプライトが表示されている、それはちょうど間違ったスプライトだ、私は実際にDrawRandomSprite()について話していなかった、それはテストメソッドです。 これは最終的にシングルトンクラスになるため、現時点ではグローバル変数ではありません。 – GregStuart

+0

問題は、どのスプライトが描画されていても、実際にレンダリングされるスプライトはImage内の最後のスプライト、つまり位置128です。 – GregStuart

0

すべてのスプライトは同じテクスチャを持っています:textexは単一のグローバル変数です。ループが終了すると、最後のテクスチャに設定されます。したがって、すべてのスプライトが最後のテクスチャを描画します。あなたは、グローバルを取り除き、スプライトごとに1つのテクスチャ(または異なるテクスチャを持たせたいスプライトごとに少なくとも1つ)を持つ必要があります。

関連する問題