Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vererbung (Entity und co.) #241

Open
HierGibtEsDrachen opened this issue Feb 21, 2018 · 15 comments
Open

Vererbung (Entity und co.) #241

HierGibtEsDrachen opened this issue Feb 21, 2018 · 15 comments
Labels
question A concrete question about the project

Comments

@HierGibtEsDrachen
Copy link

HierGibtEsDrachen commented Feb 21, 2018

Laut Klassen XML Kommentar ist eine Entity ein selbständiges Objekt im Spiel, als solche braucht sie ohnehin eine Update Funktion. Wer sich wegen Performance sorgen macht:
Perf.zip
Physikalischen Berechnungen z.Z. noch [xxx]Component in Basics, sollten eine eigene Basisklasse erhalten.

Die Component Klasse sollte überdacht werden, da sie momentan als Statespace verwendet wird und somit definiert was eine Entity ist bzw. kann.
Des weiteren sollte es eine generelle Unterscheidung von beweglichen und unbeweglichen Entities geben und bewegliche Entities sollten alle dafür notwendigen Parameter in der Basisklasse halten. Sich bewegen zu können ist eine grundlegende Funktion und sollte auch als solche implementiert werden. Sowie die dazugehörige Kollision #202.

Ein Ofen der Eisen schmelzen kann und dafür z.b. 1 Stunde benötigt oder auch ein elektrischer Schaltkreis (jaja Zukunftsmusik) stellt hingegen eine Sonderfunktion dar.
Wie weit die Standartimplementierung der Bewegung gehen soll ist allerdings ein anderes Thema.
Gerader Stoß oder auch Schiefer Stoß etc..
Einleitung der Bewegung über Kräfte und Momente?

@ManuelHu ManuelHu added suggestion A suggestion for a new feature / function question A concrete question about the project labels Feb 21, 2018
@ManuelHu
Copy link
Member

Mal zu den EntityComponents meinen Senf:

  • BodyComponent macht ohne PositionComponent keinen Sinn (und ich würde fast sagen umgekehrt sind die Use-Cases beschränkt)
  • ControllableComponent, HeadComponent, sind definitiv eigene Komponenten (Hund vs. Spieler)
  • InventoryComponent und ToolbarComponent würde ich auch getrennt lassen (ein Last-Esel hat ein Inventar, aber keine Toolbar)
  • Bei der RenderComponent könnte man fast sagen, Entities ohne 3D-Model gibt es nicht??

Evtl. macht es Sinn ein paar der EntityComponents aus der Basics in OctoAwesome.dll zu verschieben.

Aus den Basics kann die MassComponent weg (nicht verwendet). Die Kollision würde evtl. im "Core" Sinn machen.

Auf Körper wirken derzeit Kräfte (z.B. Gravitation) und Powers (die aufgebrachte Leistung), soweit ich weiß.

@jvbsl
Copy link
Member

jvbsl commented Feb 21, 2018

Dein Performancetest ist ziemlich nichts sagend, die Methode ist nicht virtual braucht somit keine vererbbare vtable was ja bei calls gerne viel Perf kostet, zusätzlich ist deine Methode noch leer, was dafür sorgt, dass C# die Methode im Release gleich gar nicht aufruft, so als gäbe es diesen call gar nicht, dann ist das ganze natürlich höchst performant.(Wurde sogar von marcus getestet)

Außerdem bin ich doch eindeutig eine Entität, aber ich mach ja auch nichts, das sagen zumindest immer alle ausm TeamSpeak.
Entities müssen nicht unbedingt etwas tun, ich meine hier geht es ja auch einfach evtl. um das EntityComponent System(was man aber mMn tatsächlich überarbeiten sollte), wobei kleine Pflanzen wie graß dazu zählen könnte, weil man die nur bedingt als normale Blöcke rendern will und auf entfernung sehr speziell(LOD z.b.) behandelt, oder auch ausblendet,

Edit: RenderComponent ohne Model kann vieles sein, was dynamisch z.B. Vertices erzeugt, oder einfach direkt vertices rendert, whatever, da braucht man nicht den bloat von Model reinhauen(auch wenn ich da grad tatsächlich am optimieren bin)

@HierGibtEsDrachen
Copy link
Author

Ja Meister ...
Auf was ich eigentlich hinaus wollte ist das der bool Check weniger kostet als die TypeOf() Methode?

@jvbsl
Copy link
Member

jvbsl commented Feb 21, 2018

Endlich erkennts mal jemand :P
naja typeof sollte generell weggelassen werden, mir ist im Moment leider auch nicht wirklich klar auf welche Stelle du ansprichst. Bedenke, dass viele Leute hier viel Code gar nicht oder vor Ewigkeiten gesehen haben.
Wenn ichs richtig verstanden habe dürfte das ein Grundsätzliches Problem des aktuellen Komponenten systems sein? Was somit später ja wegfallen würde. Ich meine von irgendwelchen Heap Objekten zwei unterschiedliche Listen zu halten alle Updateables alle Renderables etc. in einer Liste ist ja auch nur ne Referenz und ansonsten kann man zu Jederzeit über ein gescheites Komponentensystem diese Informationen auslesen ohne groß typüberprüfungen o.ä.

@HierGibtEsDrachen
Copy link
Author

HierGibtEsDrachen commented Feb 22, 2018

kann mir mal einer sagen was damit gemeint ist? was ist denn schön :D
oder warum das unschön ist, also wie du es dir vorgestellt hast.
`
if (e.Id == 0)

            return;

        //TODO:Sehr unschön     <-----------------------           

        if (e.Components.ContainsComponent<BoxCollisionComponent>())

            CheckBoxCollision(gameTime,e,movecomp,poscomp);

`

@HierGibtEsDrachen
Copy link
Author

Also hab es mir mal die letzten paar Tage genauer angeschaut. Ich würde mich dran versuchen, und das Entity-,Component- und Extensionsystem genauer durch denken um zu definieren wie es sein sollte bzw. wie es umgesetzt werden könnte. Kann aber jetzt schon sagen, dass die Änderungen umfangreich sein werden. Deswegen mach ich mal eine PP über die ihr euch dann drüber machen könnt.

@HierGibtEsDrachen
Copy link
Author

HierGibtEsDrachen commented Feb 24, 2018

Hätte mal paar fragen. Ist es möglich die UI auch dynamisch zu erstellen? Da durch Extensions unbekannte Elemente im Spiel auftauchen, sollte die UI die entsprechenden Screens für die Interaktionen dynamisch erzeugen können. Ein bisschen Richtung WPF wäre ganz gut xD
Hier schon mal ein Beispiel: Die ToolbarComponente verschwindet aus Octoawesom.dll und wandert komplett in Basiscs.dll. Ja ich weiß es wurden Stimmen laute das eher Komponenten in die Octoawesom.dll geschoben werden sollten, aber wenn wir das Anfangen können wir es mit den Extensions auch gleich bleiben lassen und brauchen keine Komponenten.
Hab mir dazu ein paar Interfances überlegt die es dem Client und Server ermöglichen sollen mit Komponenten besser umgehen zu können.

@jvbsl, was hälst du davon die Entitys Instanziert zu rendern. Weiß jetzt zwar nicht was im Model.Draw() genau passiert aber glaub das Zeichnet ja einfach nur ein Model? Mit einem IDrawable Interface für Entitys würde das erleichtern und deine LOD Überlegungen auch möglich machen. Kann das Model auch anders gerendern werden als über Model.Draw() indem man z.B. den Buffer rauszieht und direkt mit dem Buffer arbeitet?

Da ihr grade sowieso an der Simulation bastelt. Ist es möglich und haltet ihr es für sinnvoll (also ich schon) die Simulation.cs aus Octoawesome.dll in die Runtime.dll zu schieben.
Ich bin der Meinung, dass wenn eine Extension die Simulation kennt hat man etwas falsch gemacht.

@ManuelHu
Copy link
Member

ManuelHu commented Feb 24, 2018

Da ihr grade sowieso an der Simulation bastelt. Ist es möglich und haltet ihr es für sinnvoll (also ich schon) die Simulation.cs aus Octoawesome.dll in die Runtime.dll zu schieben.
Ich bin der Meinung, dass wenn eine Extension die Simulation kennt hat man etwas falsch gemacht.

Kann man schon so sehen - Aber wie sollte eine Erweiterung, sie z.B. Wauzi-Spawneggs implementiert, diesen injizieren? - Derzeit wäre das dann nicht mehr möglich.

Hätte mal paar fragen. Ist es möglich die UI auch dynamisch zu erstellen? Da durch Extensions unbekannte Elemente im Spiel auftauchen, sollte die UI die entsprechenden Screens für die Interaktionen dynamisch erzeugen können. Ein bisschen Richtung WPF wäre ganz gut xD

Hängt davon ab, was du mit dynamisch meinst. Prinzipiell kann ich die UI mit Code verändern und Controls ein/aushängen. XAML/XML wie bei WPF ist nicht möglich und auch nicht in Planung. Es fehlt aber eine API, die Erweiterungen Zugriff auf die UI gewährt. Grundsätzlich ist es auch schwerer: Control injizieren, wenn ja wo (ein Screen kann immer nur ein Control als Child haben). Der Inventardialog ist z.B. aber kein Control, sondern ein Screen der daneben noch an einen vom Nutzer änderbares Tastaurkürzel gebunden ist.

Es gibt seit über einem Jahr die Idee, das UI erweiterbar zu machen, nur ist noch niemand dazugekommen.

EDIT: Screens und Controls sind stinknomrale Klassen, die von einer Basisklasse erben.

@HierGibtEsDrachen
Copy link
Author

Bin wohl ein bisschen zu weit vom Denken her...
Wenn durch eine Extension ein Ofen hinzugefügt wird der Ressourcen verarbeiten kann, dann benötige ich dafür eine Art Dialog zwischen dem Player und dem Ofen. Da es aber eine Extenison ist und der Client den Ofen nicht kennt (wie es gerade mit dem Inventar oder der Toolbar ist) wird dafür eine Mechanismus benötigt der einen Entity interactionscreen aufruft. In dem sowohl das Inventar des Players, des Ofens und noch weitere Bedienelemente sind. Dadurch könnte per Drag and Drop Material in den Ofen befördert werden und anschließend müsste nur noch ausgewählt werden was hergestellt werden soll.

@ManuelHu
Copy link
Member

Schon klar. Aber so weit sind wir noch lange nicht ;-) Ressourcen haben wir keine und von interaktion mit Entities kann noch keine Rede sein - wir haben ja noch nicht mal eine Kollision. Ui wird definitiv irgendwann erweiterbar sein, ist aber nicht prio 1.

Du hast quasi jetzt aber selbst ein Argument geliefert warum Komponenten zumindest als Basisset in der octoawesome.dll liegen sollen - damit dritterweiterungen von gewissen Standards (hier Inventar) ausgehen können.

@HierGibtEsDrachen
Copy link
Author

HierGibtEsDrachen commented Feb 24, 2018

Interface ^^
Moment Moment, ich Krieg es da schon rein dass die Basiserweiterung nicht in Octoawesome liegen müssen und wenn ich Zaubern muss.
Versteh mich nicht falsch ^^ ich will auch keinen nötigen etwas zu tun, ich wollte es nur wissen.

@Gallimathias Gallimathias removed the suggestion A suggestion for a new feature / function label Feb 25, 2018
@HierGibtEsDrachen
Copy link
Author

Was haltet ihr von einer IEntityDefinition?

@Gallimathias
Copy link
Member

Wenn du einen konkreten Vorschlag einer Implementierung hast dann mache bitte entweder ein neues Issue auf, oder implementiere es einfach selber ^^ @HierGibtEsDrachen

@HierGibtEsDrachen
Copy link
Author

Ich wollte wissen ob wir da auch eine (brauchen) / (haben wollen würden). Bin ja wie gesagt am Entity - Component- und Extensionsystem und ein bisschen Refaktorisierung + UI ....
Viel spaß das zu Mergen wenn ihr es einbaut xD

Also sagt mir eure Meinung zu den IEntityDefinitions oder wir lassen es hard gecoded in der IExtension Implementierung. (:

@Gallimathias
Copy link
Member

@HierGibtEsDrachen Da ich nicht weiß was deine IEntityDefinition machen soll kann ich dir keine Antwort darauf geben. Ich kann leider nicht in deinen Kopf blicken ;).

Ich sehe dein eingehendes Issue als Frage/Anmerkung. Die Implementierung einer IEntityDefinition ist ein eigenes Thema bzw. Issue. Oder eben ein Teil eines Issues.

@OctoAwesome OctoAwesome locked as off-topic and limited conversation to collaborators Feb 27, 2018
@OctoAwesome OctoAwesome unlocked this conversation Mar 5, 2018
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
question A concrete question about the project
Projects
None yet
Development

No branches or pull requests

4 participants