Überschreiben einer Methode beim erweitern einer Klasse deren Datei main() enthält



  • Warum das sleep?
    Nur so am Rande.



  • Wow,

    vielen Dank für die hilfreichen Antworten.

    Die template Variante ist sicher besserer C++ Style, kommt für mein Projekt allerdings nicht in frage. Ich möchte das ganze auch unter Android zum laufen bringen, deshalb habe ich vor für die Pc Implementierung den NativeActivity lifecycle (also onStart(), onResume(), onPause() und onStop() anstelle von run() ) nachzubilden / zu simulieren.

    Makros in C++ zu verwenden wäre mir nie in den Sinn gekommen, scheint mir in diesem Fall aber eine gute Lösung zu sein. In der Pc Version kann das Makro die main() Methode ersetzen und in der Android was völlig anderes (oder garnichts) tun, ohne das der Code des jeweiligen Spiels verändert werden muss.

    using namespace Game; // Der Namespace heisst Game und enthält eine Klasse die Game heisst? Hmmm...

    Ups, das Ergebnis von "Ich schreib mal schnell ein kurzes Beispiel" 😉 Bis das Kind einen Namen hat, ist wohl "GameEngine" besser als Namensraum geeignet, um Konflikte zu vermeiden.

    Warum das sleep?

    Um das Fenster für einen Moment offen zu halten. die Game Klasse implementiert eine statische sleep() Methode die das Programm für x Millisekunden pausiert. Für richtige Spiele mit timeing würde man natürlich eher sowas wie deltaTime verwenden. Für ein kurzes Snippet schien mir das so einfacher 😉



  • Andere Frage: Wieso einen rohen, benutzenden Pointer?


  • Mod

    Nathan schrieb:

    Wieso einen rohen, benutzenden Pointer?

    lol



  • NilsV schrieb:

    Um das Fenster für einen Moment offen zu halten. die Game Klasse implementiert eine statische sleep() Methode die das Programm für x Millisekunden pausiert. Für richtige Spiele mit timeing würde man natürlich eher sowas wie deltaTime verwenden. Für ein kurzes Snippet schien mir das so einfacher 😉

    Nein, ein Fenster wird durch eine while schleife offen gehalten, in der man die Message Pump abfrägt.
    Aber ist auch egal. Bei einem Beispiel ist es auch sinnlos, weil dafür gibts breakpoints :P.



  • Andere Frage: Wieso einen rohen, benutzenden Pointer?

    Ich bin mir nicht sicher was du damit meinst. Wenn deine Frage darauf abzielt warum ich keine getInstance() Methoden verwende lautet die Antwort: Ich mag new und delete 😉 Jeder C++ Anfänger lernt damit umzugehen, und die Syntax Hervorhebung der Schlüsselwörter ist eine willkommene Hilfestellung dabei, schnell nachzuprüfen ob man wirklich alles wieder aufgeräumt hat.

    Nein, ein Fenster wird durch eine while schleife offen gehalten, in der man die Message Pump abfrägt.
    Aber ist auch egal. Bei einem Beispiel ist es auch sinnlos, weil dafür gibts breakpoints :P.

    In spiele Frameworks oder Game Engines ist es typisch solche Methoden zu haben. SDL2 hat zum Beispiel eine Funktion SDL_Delay. Das ist ein Überbleibsel aus der Zeit als Spiele noch mit einer fixen Framerate programmiert wurden. Es ist auch üblich und Sinnvoll vorhandenes zu ersetzen oder zu Wrappen, um sowohl den verwendeten Wortschatz als auch die Funktionalität an den Kontext der Spiele Entwicklung anzupassen.

    In meinem Fall werde ich wohl eine Menge std Klassen Wrappen oder ersetzen, von Containern die einfacher zu handhaben sind bis zu einer Point Klasse die Rechnen kann.



  • Arcoth schrieb:

    Nathan schrieb:

    Wieso einen rohen, benutzenden Pointer?

    lol

    Ich komprimiere halt benutzen und besitzen. 😃

    NilsV schrieb:

    Andere Frage: Wieso einen rohen, benutzenden Pointer?

    Ich bin mir nicht sicher was du damit meinst. Wenn deine Frage darauf abzielt warum ich keine getInstance() Methoden verwende lautet die Antwort: Ich mag new und delete 😉 Jeder C++ Anfänger lernt damit umzugehen, und die Syntax Hervorhebung der Schlüsselwörter ist eine willkommene Hilfestellung dabei, schnell nachzuprüfen ob man wirklich alles wieder aufgeräumt hat.

    Meine Frage ist: Wieso erstellst du das canvas via new und weißt das Ergebnis einem rohen Pointer zu? Zum einen ist new hier absolut überflüssig und du könntest das Canvas auch direkt auf dem Stack erstellen. Zum anderen verwendest du rohe Pointer, bei denen du manuell aufräumen musst. Was passiert, wenn bpsw. draw eine Exception wirft? Wer zerstört dann das canvas für dich?
    Jedesmal wenn man manuell etwas aufräumen muss, macht man etwas falsch. Wir sind hier nicht in C, Äufräumen wird über Destruktoren automatisiert.
    Für new heißt das, du verwendest eine Klasse, dessen Destruktor automatisch delete auf den Pointer aufrufst. So eine sind bspw. die Smartpointer aus der Standardbibliothek: std::unique_ptr böte sich hier an.



  • Ich Zitiere mich hier einfach mal selbst 😉

    NilsV schrieb:

    Da das Framework Unterrichts Zwecken dient ...

    Des Zweck dieses Frameworks ist es Jugendlichen, auf eine Weise die Spaß macht, die Grundlagen der Programmierung nahe zu bringen. Die Schüler sollen unter Verwendung des Framesworks spielerisch die Grundlagen von C++ und OOP lernen und anschließend einen Einblick bekommen wie das Framework aufgebaut wurde.

    In diesem Kontext halte ich es für kontraproduktiv Elementare Sprachkonzepte wie einfache Pointer zu überspringen.



  • NilsV schrieb:

    In diesem Kontext halte ich es für kontraproduktiv Elementare Sprachkonzepte wie einfache Pointer zu überspringen.

    Du sollst Pointer ja auch nicht überspringen. Sie sind sehr wichtig. Und Smart-Pointer haben durch Operatorenüberladung sehr starke Ähnlichkeiten.
    Du sollst ihnen nur zeigen, wie man rohe Speicherverwaltung macht, erklären, dass das umständlich und sehr fehleranfällig ist, und ihnen dann bessere Alternativen zeigen.

    Das ist in etwa wie Taschenrechner im Matheunterricht. Natürlich müssen die Schüler lernen, wie man Kopfrechnet. Aber wenn sie es können, sollte man ihnen erlauben die besseren Alternativen zu verwenden, die schneller sind und Fehler vermeiden, sonst brauchen sie später ewig für komplexere Aufgaben, wenn sie alles im Kopf rechnen müssen.



  • Im Prinzip sehe ich das ähnlich, in der Praxis lässt sich das aber nicht in 10 mal 2 Stunden Unterricht unterbringen, vor allem wenn Du mit Jugendlichen ohne Vorkenntnisse arbeitest.

    Das C++ keinen Garabage Collector hat wird von vielen Einsteigern als schwäche angesehen, weil sie die wesentlich performanteren Alternativen nicht kennen. Auch das Einsteiger nach ihrem ersten Kurs, Tutorial oder Buch recht schnell damit konfrontiert werden dass das was sie gelernt haben in der Praxis, milde ausgedrückt, nicht der optimale Weg ist, trägt zu dem Ruf bei C++ sei kompliziert.

    Ich sehe auch eine große Lücke zwischen dem was in der meisten einsteiger Lektüre geboten wird und den Quellen die fortgeschrittene Themen behandeln.

    Im Moment ist es allerdings meine Aufgabe einen Kurs für einen kurzen und unterhaltsamen Quereinstieg zu gestalten, von dem sich Pädagogen versprechen Schüler mehr für Mathematik zu begeistern.



  • NilsV schrieb:

    In spiele Frameworks oder Game Engines ist es typisch solche Methoden zu haben. SDL2 hat zum Beispiel eine Funktion SDL_Delay. Das ist ein Überbleibsel aus der Zeit als Spiele noch mit einer fixen Framerate programmiert wurden.

    Nein, ist es nicht. Aber mach nur. Man fixiert heute den Interval der Logik, damit man konsistentere Physik Berechnungen durchführen kann, die Grafik sollte aber immer synchron mit dem VSYNC Signal gerendert werden. Ändert aber auch nix an meiner obigen Aussage, wie man ein Fenster offen hält. Zudem, wenn du schon eine XPlatform Bibliothek wie SDL hast, verzichte doch auf die WinAPI und verwende std::this_thread::sleep_for(2s).
    http://gafferongames.com/game-physics/fix-your-timestep/

    NilsV schrieb:

    In meinem Fall werde ich wohl eine Menge std Klassen Wrappen oder ersetzen, von Containern die einfacher zu handhaben sind

    Wieso?? Für wen auch immer du das machst, bring denen bei die STL zu handhaben. Die Grundlagen sind nicht schwer.



  • Die statische sleep() Methode die ich verwende befindet sich in meiner Game Klasse, und ruft SDL_Delay() mit dem übergebenen Parameter auf.

    Über Zeugs wie VSync muss ich mir bei der Verwendung einer Bibliothek wie SDL 2 glaube ich eher weniger Gedanken machen. Mein Projekt wird ein kleines Framework zum einfachen programmieren keiner 2D Spiele. Dafür sollte eine abrufbare deltaTime mehr als ausreichend sein, um im Gameloop ein von der Framerate unabhängiges Timeing zu erreichen. Zumal sich die mathematische Einfachheit dieser Lösung gut in den Lehrplan einfügt.

    Mal unabhängig von meinem aktuellen Projekt, warum eigentlich std::unique_ptr? std::shared_ptr funktionieren auch vernünftig wenn mehr als ein shared_ptr auf das selbe Objekt zeigt. Damit wäre, denke ich, ein Verhalten gewährleistet, das Äquivalent zu dem in Sprachen mit einem Garabage Collector ist, oder nicht?



  • Nicht komplett, zyklische Referenzen kann ein Reference Counter nicht auflösen, ein Garbage Collector schon. Nur stellt sich die Frage: Will man das?



  • Wer Zyklen baut hat sein Design verkackt und ist selbst schuld.



  • NilsV schrieb:

    Über Zeugs wie VSync muss ich mir bei der Verwendung einer Bibliothek wie SDL 2 glaube ich eher weniger Gedanken machen. Mein Projekt wird ein kleines Framework zum einfachen programmieren keiner 2D Spiele.

    Solange sich C++ nicht fest im Lehrplan befindet, solltest du den Studenten eher sowas wie GameMaker Studio geben. Das ist als Standard Version kostenlos und die mathematischen Probleme kann man darin auch genauso behandeln, solange man mit Code arbeitet und nicht mit den Drop Actions. Damit beokmmen die Studenten auch ein Gefühl dafür und die Einstiegsbarriere ist sehr niedrig.

    Falls du aber deinen Studenten C++ beibringen willst, ist dein Ansatz total daneben imho. Bring denen das Programmieren gescheit bei und nicht mit irgendwelchen erfunden Wrapper Klassen. Erfinde das Rad nicht neu.



  • Scorcher24 schrieb:

    Falls du aber deinen Studenten C++ beibringen willst, ist dein Ansatz total daneben imho. Bring denen das Programmieren gescheit bei und nicht mit irgendwelchen erfunden Wrapper Klassen. Erfinde das Rad nicht neu.

    Ich denke hier stoßen einfach grund verschiedene Philosophien aufeinander 😉 Wenn es dich wirklich Interessiert erläutere ich gerne meine Gedanken zu dem Thema:

    Meine persönliche Meinung zu C++
    Ich halte C++ für eine Sehr effiziente Sprache für die eine Vielzahl guter Kompiler für eine breite Palette verschiedener Plattformen zur Verfügung stehen. Mit dem Kern der Sprache fühle ich mich als Entwickler sehr wohl. Was die STL angeht, die ist technisch gut durchdacht und in der Regel auch gut und zuverlässig implementiert. Auf der anderen Seite wirkt der verwendete Wortschatz ziemlich angestaubt, aufgrund der langen Geschichte und der Abwärtskompatibilität gibt es viel zu viele Wege bestimmte Dinge zu erreichen und die Handhabung vieler Klassen ist wesentlich umständlicher als nötig.

    Wrapper Klassen versus mitgelieferter Bibliotheken
    Klassen zu Wrappen heißt nicht wirklich das Rad neu zu erfinden, man streicht es nur neu an 😉 Für den jeweiligen Verwendungszweck gut umgesetzt kann man sein eigentliches Programm oder Spiel mit wesentlich weniger und übersichtlicherem Code gestalten. Für ein Unternehmen hieße das zwar das neue Mitarbeiter diese Bibliothek erst lernen müssen, wäre aber langfristig effizienter.

    Dazu kommt das sich die STL mit der Zeit weiter entwickelt. Neue Klassen werden bessere alternativen für bereits vorhandenes. Es kann einen großen unterschied machen ob ich, um von dem neuen zu profitieren, nur die Implementierung einer Wrapper Klasse ändern muss, oder den Code all meiner Programme.

    Und dann wäre da die Portierbarkeit. Wer weiß schon wie sich die Informatik Welt oder auch nur die eigenen Anwendungen entwickeln. Heute soll ein Spiel auf dem Computer laufen, morgen auf Smartphones und übermorgen im Browser. Sich und seinen Code an die Bibliothek einer Sprache (oder noch schlimmer eines Frameworks oder einer Game Engine von drittanbietern) zu binden kann auch eine Fessel sein. Ein Programme in eine andere Objekt Orientierte Sprache zu portieren, kann durchaus ein überschaubares unterfangen sein, würde sich in vielen Fällen sogar weitestgehend automatisieren lassen, wenn man sein eigenes Kleines Framework in der neuen Sprache nachbaut.

    Das mag alles etwas esoterisch klingen, aber schau dir an wie viel arbeit heute teilweise investiert wird um ältere Spiele auf mobile Plattformen zu portieren.

    Interessante Beispiele
    Google's GWT wird unter anderem von dem Java Spiele Framework LibGDX werwendet. Wofür? Um in Java geschriebene Spiele automatisch in HTML5/JavaScript kompatible Webbrowser Spiele zu konvertieren.

    Es gibt haufenweise Frameworks / Bibliotheken mit bindungen zu verschiedenen Sprachen. Cocos2d ist ein interessantes Beispiel.

    Ich fand in Richtung Vereinfachung und Wrappen die Video Aufzeichnung eines Kurses an der Stanford University mit dem Titel "Programming Methodology" großartig. Dort wird die Sprache Java als Werkzeug verwendet, die Grundlegenden Konzepte und Ideen sind aber auf jede Objekt Orientierte Sprache anwendbar. Die Videos sind von der Uni selbst auf Youtube veröffentlicht worden, wer Interesse hat: https://www.youtube.com/view_play_list?p=84A56BC7F4A1F852


Anmelden zum Antworten