2015-06-21 45 views
0

我有一個struct「Layer」和class「LayerHandler」。圖層只包含紋理,精靈和兩個構造函數 - 一個是默認的,另一個是引用參數。 LayerHandler類是處理所有圖層的繪圖的類。我爲這個類添加圖層,稍後我使用win.draw(layerhandler_object)繪製所有內容。 LayerHandler從Drawable繼承,這樣做會覆蓋virtual void draw()。vector,sfml和「esp的值在函數調用中未正確保存」錯誤

LayerHandler.h:

#ifndef LAYERHANDLER_H 
#define LAYERHANDLER_H 

#include <vector> 
#include <SFML\Graphics.hpp> 

using namespace std; 
using namespace sf; 

struct Layer { 
    Texture tex; 
    Sprite spr; 

    Layer() { } 

    Layer(Layer& l) { 
     tex = l.tex; 
     spr = l.spr; 
    } 
}; 

class LayerHandler : public Drawable { 
    private: 
     vector<Layer*> layers; 

     virtual void draw(RenderTarget& target, RenderStates states) const { 
      for (int i=0; i<layers.size(); i++) 
       target.draw(layers[i]->spr, states); 
     } 

    public: 
     LayerHandler(); 
     ~LayerHandler(); 
     void Add(Layer& layer); 
}; 

#endif 

LayerHandler.cpp:

#include "LayerHandler.h" 

LayerHandler::LayerHandler() { 

} 

LayerHandler::~LayerHandler() { 

} 

void LayerHandler::Add(Layer& layer) { 
    layers.push_back(new Layer(layer)); 
} 

和main.cpp中:

#include <iostream> 
#include <SFML\Graphics.hpp> 
#include "LayerHandler.h" 

using namespace std; 
using namespace sf; 

int main() { 
    RenderWindow win(VideoMode(800, 600), "Raven", Style::Default); 
    win.setFramerateLimit(60); 
    win.setVerticalSyncEnabled(true); 
    win.setMouseCursorVisible(false); 

    LayerHandler lhandler; 

    Layer back; 
    back.tex.loadFromFile("bao/gfx/back.png"); 
    back.spr.setTexture(back.tex); 
    back.spr.setPosition(0, 50); 

    lhandler.Add(back); 

    Event evt; 

    float dt = 0.f; 
    Clock clock; 
    float dwticks = clock.getElapsedTime().asMilliseconds(); 
    float dwnewticks = 0.f; 

    while (win.isOpen()) { 
     if (win.pollEvent(evt)) { 
      if (Keyboard::isKeyPressed(Keyboard::Key::Escape)) { 
       win.close(); 
      } 
     } else { 
      dwnewticks = clock.getElapsedTime().asMilliseconds(); 
      dt = dwnewticks > dwticks ? (dwnewticks - dwticks)/4000.f : 0.f; 
      dwticks = dwnewticks; 

      win.clear(); 
      win.draw(lhandler); 
      win.display(); 
     } 
    } 

    return 0; 
} 

我認爲這並不複雜,我做的一切都是好的,但我得到這個「ESP的價值沒有妥善保存在函數調用」錯誤。我不知道爲什麼我得到這個錯誤。我知道這可能是由不匹配的調用約定引起的,但我在代碼中看不到這樣的東西......我不得不說這是我第一次遇到這個錯誤,而且我完全不在的想法如何處理它。任何幫助?

+1

有些東西可能不是你麻煩的原因,但仍然很重要:[不要同時使用'setFramerateLimit'和'setVerticalSyncEnabled'](http://www.sfml-dev.org/tutorials /2.3/window-window.php#controlling-the-framerate)&你的圖層拷貝應該a)以const ref爲參數,b)將'spr'的紋理設置爲'tex',而不是保留'l。 tex'。你也應該避免在頭文件中使用''語句並且使用'/'而不是非標準的'''作爲路徑。最後,使用智能指針或至少釋放你的記憶。 – Hiura

+0

我剪出setFramerateLimit,只留下setVerticalSyncEnabled。我還將spr = l.spr更改爲spr.setTexture(tex),但我必須不同意我的副本應該將const ref作爲參數,因爲參考已經是一個常量指針。感謝您的幫助,我會嘗試釋放內存,並閱讀關於智能指針的信息。希望它會有所幫助。 – mentor93

+0

***但我得到這個「ESP的價值沒有妥善保存在函數調用」錯誤。我不知道爲什麼我得到這個錯誤。堆棧腐敗。 – drescherjm

回答

0

不知道爲什麼,但問題出在SFML庫上。這裏我使用的是2.2版本的32位應用程序。我下載了2.3版的32位版本,並使用新的2.3庫編譯了我的應用程序,現在它完美無缺。

+0

對於展示此問題的庫,是否使用爲編譯器版本或某些其他版本的Visual Studio構建的庫?雖然與crt衝突,我認爲堆腐敗會比堆棧腐敗更可能。 – drescherjm

+0

我確定我用我的視覺工作室版本(2010年)的庫。例如,我從未安裝過任何其他版本的visual C++,所以我確信我不會下載用於visual 2013的庫。更重要的是,我使用2.2庫編寫了一個打磚塊/突破克隆,並且運行良好,但是當我試圖重寫可繪製類時,我又得到了esp錯誤。但後來我寫了一個返回對象精靈的方法,所以我可以像這樣繪製它:'window.draw(myobject.getSprite());'。 – mentor93

相關問題