[Need Help] GML to C# - Bekannte Objektsystem wie im Game Maker in C# ...

  • C#

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • [Need Help] GML to C# - Bekannte Objektsystem wie im Game Maker in C# ...

    Hi,
    ich bin gerade auf dem Weg den Game Maker hinter mir zu lassen und neues Land in C-Sharp (C#) zu beschreiten.
    Hab mich auch schon ziehmlich schnell hineingefunden und schon einiges umsetzen können.

    Lange Rede kurzer Sinn:
    Im Game Maker hatte ich mal eine kleine Physikengine (Sandbox) geschrieben. Wenn ich die Maustaste drücke wird ein Ball (Kugel bzw. Kreis 2D) erstellt (sprite).
    Dieser Ball ist ein Object. Er überprüft um ein anderer Ball im Radius ist (Kollision). Wenn ja dann berechnet er die Distance und Direction und beide stoßen sich dann ab (x,y; other.x,other.y, etc).
    Das funktioniert im GM weil jedes Objekt für sich arbeitet aber dennoch mit anderen über die ID in kontakt treten kann.
    Wie setze ich das in C# um?
    Ich habe mir ja schon überlegt alles in Array zu stecken und mittels for-schleife die einzelnen Pseudo-Objekte durchzugehen.
    Zum Beispiel bekommt jeder dann xPos[n] und yPos[n] usw.
    Aber da gibts doch bestimmt ne andere Lösung die ähnlich (oder sogar gleich) ist wie im Game Maker.
    >>> Dies soll eine Signatur darstellen und ebenso den Zweck entfremden wie so oft in Foren. Dieser wäre den Leser über eine Kontaktaufnahme zu informieren. In der Paxis wird dieser aber verwendet um so halbwitzige bis überhaupt nicht komische Kommentare wie dieser zu verbreiten. Immerhin frisst dieser Signatur ausnahmsweise kein großen Platz weg.
  • Kurz: Ähnlich wie im GM, mit Klassen und Instanzen dieser Klassen.

    Wenn du aber noch gar keine Ahnung von C# und OOP hast, dann kannst du das ganze gleich wieder vergessen. Lern erst mal richtig die Sprache und ihre Konzepte bevor du dich an ein Spiel oder eine Physikdemo ranwagst. Immerhin musst du ja das ganze auch Rendern, was wiederum das Lernen einer Bibliothek oder API (z.B. Direct3D) erfordert.

    © 2008 by Teamgrill Productions
  • Schon klar!
    Mir gehts auch erstmal darum einen bezugspunkt zu finden.
    Und was das zeichnen angeht hab ich mir schon was ohne openGL oder DirectX oder xma gebastelt.
    Ich zeichne mit den direkten Funktionen aus Graphics. Ich erstelle zuvor erstmal eine Bitmap Grafik auf die ich dann zeichne.
    Das hat den vorteil das diese erst gezeigt wird wenn das Zeichnen in diesem Moment beendet wurde (vsync ersatz).
    Das ganze wird dann auf ner PictureBox geladen.

    Mit Objekten meinte ich ja auch eigentlich Instanzen.
    Ich weiß wie ich klassen und funktionen erstellen kann und darauf zugreife.
    allerdings kann ich mir jetzt noch nicht so richtig vorstellen wie ich das am besten mache um instanzen zu erzeugen wie im GM.

    Warum soll ich das gleich wieder vergessen? xD Nicht immer gleich aufgeben! ;)
    Ich denke ich kann mich da schon "ranwagen".
    Für konstruktive Beiträge würd ich mich daher freuen.

    Ich überlege evtl. ne Klasse (GM: Objekt) anzulegen worin ich dann beim erstellen eine fortlaufende ID wie beim GM erstelle.
    Dann eine Funktion (GM: Create, Step, usw Events) erstelle die dann erstmal prüft ob sie mit einer anderen "Instance" kollidiert.
    Nur wie? Da die standard library von c# keine per-pixel kollision anbietet reicht es bei kugeln bzw kreisen die distance abzufragen.
    Hmm, ... jede Instanze fragt also jede andere Instanze ab. Ich denke da an Ressourcen (CPU) die dadruch in die Knie geht. ^^

    PS @Admins&Mods: Warum ist der "Sonstiges" Foranabschnitt worin sich auch "Andere Programmiersprachen" befindet nicht zugänglich wenn man nicht angemeldet ist?
    >>> Dies soll eine Signatur darstellen und ebenso den Zweck entfremden wie so oft in Foren. Dieser wäre den Leser über eine Kontaktaufnahme zu informieren. In der Paxis wird dieser aber verwendet um so halbwitzige bis überhaupt nicht komische Kommentare wie dieser zu verbreiten. Immerhin frisst dieser Signatur ausnahmsweise kein großen Platz weg.
  • Die CPU geht dadurch garantiert nicht in die Knie, es ist ja schließlich einfacher, mal 20 distanzen zu überprüfen [EDIT] - das sind dann 190 wertvergleiche - als alle 1024 x 768 (786432) pixel, und das schafft ja selbst der Gamemaker (obwohl ich durchaus vermute, dass der zusätzlich mit distanzen arbeitet um rechenzeit zu sparen)

    Ich würde spontan sagen: speicher alle instanzen deiner Kreis - Klasse in ner Liste, die du dann in jeder Distanz durchgehst und die distanzen überprüfst, das dürfte eigentlich machbar sein. Wenn nicht, sags einfach.

    PS: mit C# hab ich noch nie gearbeitet, dafür mit C++, also kann ich dir zwar Ansätze aber geben, mit Code aber weniger anfangen.
  • Hmm, ... jede Instanze fragt also jede andere Instanze ab. Ich denke da an Ressourcen (CPU) die dadruch in die Knie geht

    Man sollte natürlich nicht jede Instanz mit jeder anderen auf Kollisionen prüfen, da braucht man schon eine gute Strukturierung, um unnötige Überprüfungen zu vermeiden. Spontan fallen mir Quadtrees ein.

    Zu deiner Rendermethode will ich mich jetzt nicht äußern. :S

    © 2008 by Teamgrill Productions
  • Machs doch einfach erstmal so.
    Lass jedes objekt jedes andere abfragen.
    Wenn du dann irgendwann schlechte performance bekommst (Was ich nicht glaube),
    dann kannst du immer noch optimieren.

    PS: Keine Arrays sondern listen benützen.

    Quellcode

    1. Initialize()
    2. {
    3. List<Ball> meineListe = new List<Ball>();
    4. Ball b = new Ball(...);
    5. meineListe.Add(b);
    6. }
    7. Update(float timekey)
    8. {
    9. foreach (Ball a in meineListe)
    10. {
    11. foreach (Ball b in meineListe)
    12. {
    13. if (VectorDistance(a.Position,b.Position)< a.Radius+b.Radius)
    14. {
    15. Bake_a_Cake();
    16. }
    17. }
    18. }
    19. }
    Alles anzeigen
  • Das wäre dann ein Aufwand von O(n²)...
    Da bin ich gespannt, welche Performance er zusammen bringt, wenn er Tausende Instanzen untereinander vergleicht (Distanzchecks sind auch nicht gerade das schnellste).
    Vor allem wenn man vor hat eine Physikengine zu schreiben, sollte man sich über soetwas Gedanken machen.

    © 2008 by Teamgrill Productions
  • Erstmal machen, dann optimieren.

    Und was ist mit Planung?
    Ich würde das Implementieren einer guten Strukturierung nicht als Optimierung ansehen, sondern als einen Schritt, der aus guter Planung hervorgeht.
    Es bringt nichts einfach mal drauf los zu programmieren, wenn man sowieso weiß, dass man später das Grundgerüst umbauen muss.

    © 2008 by Teamgrill Productions
  • Wenn er wie er sagt kompletter Anfänger ist in der Programmiersprache, wird er sowieso irgendwann zu einem Punkt kommen wo er alles umschmeißt. Ich bin immernoch der Meinung erstmal alles auf den einfachst möglichen weg zu machen ist sinnvoll, aber natürlich hast du auch Recht.

    Er wird sich selber entscheiden müssen welche arbeitsweise er nimmt ;)