0

構造体「Layer」とクラス「LayerHandler」があります。レイヤーは、テクスチャ、スプライト、および 2 つのコンストラクター (1 つはデフォルト、もう 1 つは参照パラメーター付き) のみで構成されます。LayerHandler クラスは、すべてのレイヤーの描画を処理するクラスです。このクラスにレイヤーを追加し、後で win.draw(layerhandler_object) を使用してすべてを描画します。そのために、LayerHandler は Drawable から継承し、virtual void draw() をオーバーライドします。

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 の値が適切に保存されていませんでした」というエラーが表示されます。なぜこのエラーが発生するのかわかりません。呼び出し規約の不一致が原因である可能性があることはわかっていますが、コードにそのようなものは見当たりません...このエラーが発生したのはこれが初めてであり、完全にアウトです対処方法のアイデアです。何か助けはありますか?

4

1 に答える 1

0

理由はわかりませんが、問題は SFML ライブラリにありました。ここでは、32 ビット アプリ用にバージョン 2.2 を使用しています。バージョン 2.3 32 ビットをダウンロードし、新しい 2.3 ライブラリでアプリをコンパイルしたところ、完全に動作するようになりました。

于 2015-06-21T13:14:06.457 に答える