Thor Event System



  • Wieso das C Präfix weglassen und die Namen klein?


  • Mod

    darman96 schrieb:

    Wieso das C Präfix weglassen und die Namen klein?

    Zum C: Nützt es dir zu wissen, dass CInput eine class ist? Im Gegensatz zu was überhaupt? Es kann ja nur eine Klasse oder ein anderer Typ sein, wenn es wie ein Typ benutzt wird. Und wenn es wie ein Typ benutzt wird, ist es nicht wichtig zu wissen, ob es eine Klasse oder irgendwas anderes ist.

    Zur Kleinschreibung von Funktionen: Es ist die übliche Namenskonvention. Aber hier gilt nur, dass es üblich ist. Es gibt keine starken Gründe, warum man nicht alles groß schreiben sollte. Hauptsache einheitlich. Aber es hat den Vorteil, dass andere Programmierer sich eher wie Zuhause fühlen, wenn sie deinen Code lesen und du die üblichen Konventionen benutzt.



  • Hmm okay ich weiß nur das Crytek das so mit der CryEngine gemacht hat, da dachte ich das wäre üblich.



  • Irrlicht macht es auch, um die verschiedenen Typen zu unterscheiden, also C fuer Klasse im normalen Sinne, I fuer Interface und S fuer structs, also Datensammlungen ohne definierte Methoden.
    Ich wuerde so eine Library aber auch voellig anders designen, sodass die Interfaces wegfallen und man diese Unterscheidungen gar nicht braucht.
    Heutzutage baut man Klassen auch so, dass sie in der Verwendung wie ein eingebauter Datentyp sind (z.B. std::complex und float oder iterator und pointer).



  • So ich hab immernoch ein Problem...

    Visual Studio gibt mir immer diese Fehler:

    Fehler	1	error C2027: Verwendung des undefinierten Typs "std::_Get_function_impl<_Fty>"	c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional	550	1	Tile Engine
    
    Fehler	2	error C2504: 'type': Basisklasse undefiniert	c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional	551	1	Tile Engine
    
    Fehler	3	error C2027: Verwendung des undefinierten Typs "std::_Get_function_impl<_Fty>"	c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional	554	1	Tile Engine
    
    Fehler	4	error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner '_Mybase'	c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional	554	1	Tile Engine
    
    Fehler	5	error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.	c:\program files (x86)\microsoft visual studio 12.0\vc\include\functional	554	1	Tile Engine
    
    ...
    

    und noch mehr

    ich hab aber keine ahnung was das Programm mir damit sagen will...



  • SeppJ schrieb:

    Zur Kleinschreibung von Funktionen: Es ist die übliche Namenskonvention.

    In Java vielleicht.
    In C++ Projekten sehe ich viel häufiger PascalCaseFunktionsNamen.



  • Weiß denn keiner was zu den Fehlermeldungen?



  • Du inkludierst irgendwo ne STL Header, und DAVOR hast du Müll stehen. Vermutlich.
    Viel mehr lässt sich da nicht rauslesen.
    Code der zu diesen Fehlermeldungen führt zeigst du uns ja nicht.
    Fehlermeldungen von deutschen VS Versionen sind auch nicht sehr beliebt.
    ...
    Tjo. Viel mehr gibt's dazu nicht zu sagen denke ich.



  • hustbaer schrieb:

    SeppJ schrieb:

    Zur Kleinschreibung von Funktionen: Es ist die übliche Namenskonvention.

    In Java vielleicht.
    In C++ Projekten sehe ich viel häufiger PascalCaseFunktionsNamen.

    Naja, Windows.



  • So hier nochmal der ganze Code.

    Main.cpp:

    #include "Engine.h"
    
    int main() {
    
    	CEngine engine;
    
    	sf::RenderWindow window(sf::VideoMode(800, 600), "Tile Engine");
    
    	engine.Init(&window);
    
    	while (window.isOpen()) {
    		engine.Render();
    		engine.Update();
    	}
    
    }
    

    Engine.h:

    #pragma once
    #pragma once
    #include <SFML\Graphics.hpp>
    
    #include "Input.h"
    
    class CEngine
    {
    public:
    	CEngine();
    	~CEngine();
    
    	bool Init(sf::RenderWindow *window);
    	void EnterGame();
    	void Update();
    	void Input();
    	void Render();
    
    private:
    	// Render Target
    	sf::RenderWindow* window;
    
    	CInput inputSystem;
    
    	void onKeyPress(thor::ActionContext<std::string> context)
    	{
    		if (context.event->key.code == sf::Keyboard::X) {
    			window->close();
    		}
    	};
    
    };
    

    Engine.cpp:

    #include "Engine.h"
    
    CEngine::CEngine()
    {
    	CInput temp(window);
    	inputSystem = temp;
    }
    
    CEngine::~CEngine()
    {
    }
    
    bool CEngine::Init(sf::RenderWindow *window) {
    
    	this->window = window;
    
    	inputSystem.AddCallback("keyPressed", &onKeyPress);
    }
    
    void CEngine::Render() {
    	window->clear();
    	window->display();
    }
    

    Input.h:

    #pragma once
    #include <SFML/Graphics.hpp>
    #include <Thor/Input.hpp>
    
    class CInput
    {
    public:
    	CInput();
    	CInput(sf::RenderWindow* w);
    	~CInput();
    
    	void AddCallback(std::string trigger, std::function<thor::ActionContext<thor::Action>> unaryListener) {
    		thorSystem.connect(trigger, unaryListener);
    	};
    
    private:
    	sf::RenderWindow window;
    	thor::ActionMap < std::string >::CallbackSystem thorSystem;
    
    	void InitActions();
    
    };
    

    Input.cpp:

    #include "Input.h"
    
    CInput::CInput(sf::RenderWindow* window) {
    	this->window = *window;
    }
    
    CInput::~CInput()
    {
    }
    
    void CInput::InitActions() {
    
    	thor::Action closeRequest(sf::Event::Closed);
    	thor::Action keyPressed(sf::Event::KeyPressed);
    	thor::Action leftMouseButton(sf::Mouse::Left, thor::Action::PressOnce);
    
    	thor::ActionMap<std::string> actions;
    	actions["close"] = closeRequest;
    	actions["keyPressed"] = keyPressed;
    	actions["leftMouse"] = leftMouseButton;
    
    	actions.invokeCallbacks(thorSystem, &window);
    }
    


  • immer noch nichts?



  • Also es fehlen
    #include <functional>
    und
    #include <string>

    Kannst ja mal probieren ob es was bringt die einzufügen. Wobei ich anhand der Fehler eher auf ein anderes Problem tippen würde. Der Rest sieht aber soweit richtig aus, also...

    Probier' halt selbst ein wenig rum.
    Nimm Stück für Sütck Code weg, so lange bis der Fehler verschwindet. So grenzt man Fehler ein die man nicht auf anderem Weg findet.
    Irgendwann hast du dann eine Version die geht, und eine davor (mit weniger "weggenommenem" Code) die nicht geht. Dann guckst du dir den Code an der unterschiedlich ist, und überlegst dir was das Problem sein könnte.

    ps:
    Gerade erst gesehen:

    private:
        sf::RenderWindow window;
    
    // ....
    
    this->window = *window;
    

    Das kann nicht gehen. Wie du in der Doku sehen kannst
    http://sfml-dev.org/documentation/2.0/classsf_1_1RenderWindow.php
    ist sf::RenderWindow noncopyable.



  • Okay danke.

    Wofür ist denn die functional?
    ich mein ich benutz nur methoden die ich sonst auch immer ohne die functional benutzt hab.



  • darman96 schrieb:

    Wofür ist denn die functional?
    ich mein ich benutz nur methoden die ich sonst auch immer ohne die functional benutzt hab.

    http://en.cppreference.com/w/cpp/utility/functional/function
    (Du nutztt std::function<> in Z.12 von input.h)

    Kann durchaus sein, dass Dein Programm <functional> irgendwo aufschnappt. Z.B. koennte SFML <functional> #includ en.
    Aber der Vollständigkeit halber solltest Du es selber aufführen - kann ja auch sein, dass in der näxten Version das #include in SFML wegfällt und dann kompiliert Dein Programm nicht mehr.



  • Hat nicht viel gebracht es sind immer noch Fehler da...

    Hier die Fehler: https://www.dropbox.com/s/zcxfu0lpmgzigsa/Error.PNG?dl=0



  • Das sind die Fehler, schau mal in die Ausgabe. Da sieht man oft mehr, z.B. wo der Fehler in deinem Code herkommt.



  • es liegt auf jedem fall an dem kram mit der Thor Lib.
    Wenn ich das rausschmeiße dann geht's.



  • Auch doof.



  • darman96 schrieb:

    es liegt auf jedem fall an dem kram mit der Thor Lib.
    Wenn ich das rausschmeiße dann geht's.

    Das sieht trotzdem nach einem fehlenden Include aus. Oder vielleicht ist es auch nicht mit deinem VS kompatibel und du musst den Code etwas anpassen, kommt auch vor.


Anmelden zum Antworten