39Dll: Ein simples Spiel

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

    • @Phoenix:
      Was bringt mir eine höhere Geschwindigkeit (bei UDP), wenn ich mit TCP/IP eh schon an die Grenzen des GameMaker stoße? Oder hab ich da jetzt was falsch verstanden? Und natürlich ist es bei einem TDS wichtig zu wissen wo der andere gerade hinschaut und dumm aussehen tuts auch noch. Und auch bei einem TDS braucht man einige Nachrichten die auch 100% ankommen sollen. Und auserdem kappier ich nicht was du mir mit diesem Satz sagen willst?

      Schwer sowas zu realisieren ist es wirklich nicht, und ich sage ganz
      ehrlich, die, die das nicht lösen können, sollten ( noch ) nicht aus (
      39 )DLL - Tuts zu lernen --> Tuts sind zum lernen da,

      Vom Satzaufbau her schon ein bischen strange, oder? ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GrinchXL ()

    • Naja, bei UDP ist der Traffic geringer...das ist auch schon ein Vorteil wenn die Leitung nicht die Beste ist.
      Klar sollte man sehen können wo der andere hinguckt, aber auch nicht immer...zB nicht wenn der andere nicht in der nähe oder im selben raum ist...
      UDP ist wohl nur recht selten sinvoll :)
    • Mein Satzbau ist so strange, wie man will :P

      " Und natürlich ist es bei einem TDS wichtig zu wissen wo der andere gerade hinschaut und dumm aussehen tuts auch noch." - Da steht bei mir 'n kleines "?" auf 'm Kopf ;)
      Naja, aber ganz falsch kann er auch nicht sein, halt nur ein bissl verschachtelt ;)
      So wichtig war der von dirmir besagte Satz nu' auch net ^^
      Außerdem könnte man z.B. 'ne Kombination aus UDP und TCP/IP nehmen, zwar etwas umständlich, würde aber den ein oder andern ( längeren ) Lag fernhalten...


      @Titan : Das wär' schön, ein DLL-Programm...
      Ne du, DLL's sind programmiert in "richtigen" Programmiersprachen - z.B. C++, Delphi ( soweit ich weiß ) und weitere. Das ist nicht einfach zu machen, es gibt sie auch nicht wie Sand am Meer oder Spiele auf der GMC ( ^^ ) aus diesem Grund.
      Die 39DLL ist von einem auf der GMC gemacht worden ( 39ster heißt er, oder? ). Von "uns" ( Meißt von Bl@ckSp@rk ;) ) gibt es z.B. die Online-Highscore DLL.

      Außerdem @Look in Titan's Statusanzeige:Du hast leider keine Pro, also könntest du - Wenn es echt ein "DLL-Programm" gäbe - Die DLL im Game Maker gar nicht Testen...

      (Hab' ich Titans Post richtig verstanden? :wacko: )

      EDIT:Ok, Grinch, ich geb' dir Recht :whistling:
      Meine Posts sind echt immer etwas "Komisch" :D
    • Außerdem könnte man z.B. 'ne Kombination aus UDP und TCP/IP nehmen, zwar etwas umständlich, würde aber den ein oder andern ( längeren ) Lag fernhalten...


      So. Also nur UPD erachte ich fast immer als Schwachsinn. Selbst bei einem TDS. Bei einem TDS müssen nämlich z.B. die Schüsse IMMER ankommen, wenn ich jetzt noch weiter überlegen würde, würde mir auch noch mehr einfallen, aber naja...

      Verbindung aus UPD und TCP ist auch nicht das Wahre, wenn die Spieler selbst hosten müssen. Da dann die Spieler, die hosten, und Router besitzen, gleich 2 Ports freischalten müssen.
    • Verbindung aus UPD und TCP ist auch nicht das Wahre, wenn die Spieler selbst hosten müssen. Da dann die Spieler, die hosten, und Router besitzen, gleich 2 Ports freischalten müssen.

      Naja, hast du auch wieder Recht :3
      also kann man sagen : TCP/IP sollte man nehmen, es laggt, aber das ist nich' umbedingt wichtig... -.-*

      ABER z.B. bei -0NL1N3- 's 39DLL-Engine werden ja auch zwei Ports geöffnet.
      Obwohl das ja auch wieder Quasch is', der, der den Server "Steuert", sollte für sowas bereit sein...
    • @Titan : Das wär' schön, ein DLL-Programm...

      Ne du, DLL's sind programmiert in "richtigen" Programmiersprachen -
      z.B. C++, Delphi ( soweit ich weiß ) und weitere. Das ist nicht einfach
      zu machen, es gibt sie auch nicht wie Sand am Meer oder Spiele auf der
      GMC ( ^^ ) aus diesem Grund.

      Die 39DLL ist von einem auf der GMC gemacht worden ( 39ster heißt er, oder? ). Von "uns" ( Meißt von Bl@ckSp@rk ;) ) gibt es z.B. die Online-Highscore DLL.



      Außerdem @Look in Titan's Statusanzeige:Du hast leider keine Pro, also könntest du - Wenn es echt ein "DLL-Programm" gäbe - Die DLL im Game Maker gar nicht Testen...



      (Hab' ich Titans Post richtig verstanden? :wacko: )
      Ja, du hast mich fast richtig verstanden.
      Das dlls mit richtigen computersprachen geschrieben werden ist mir klar aber wo finde ich ein vernünftiges programm?
      Ich hole mir heute die pro verion warscheinlich...
    • Titan schrieb:

      @Titan : Das wär' schön, ein DLL-Programm...

      Ne du, DLL's sind programmiert in "richtigen" Programmiersprachen -
      z.B. C++, Delphi ( soweit ich weiß ) und weitere. Das ist nicht einfach
      zu machen, es gibt sie auch nicht wie Sand am Meer oder Spiele auf der
      GMC ( ^^ ) aus diesem Grund.

      Die 39DLL ist von einem auf der GMC gemacht worden ( 39ster heißt er, oder? ). Von "uns" ( Meißt von Bl@ckSp@rk ;) ) gibt es z.B. die Online-Highscore DLL.



      Außerdem @Look in Titan's Statusanzeige:Du hast leider keine Pro, also könntest du - Wenn es echt ein "DLL-Programm" gäbe - Die DLL im Game Maker gar nicht Testen...



      (Hab' ich Titans Post richtig verstanden? :wacko: )
      Ja, du hast mich fast richtig verstanden.
      Das dlls mit richtigen computersprachen geschrieben werden ist mir klar aber wo finde ich ein vernünftiges programm?
      Ich hole mir heute die pro verion warscheinlich...


      Dazu eignet sich jedes Programm, mit dem du in der jeweiligen Sprache programmieren kannst, du musst beim kompilieren nur sagen, dass du eine dynamische Bibliothek (also eine DLL) und kein Programm erstellen willst (in einigen IDEs musst du das auch schon direkt beim erstellen des Projektes angeben).
      D.h. welche Programme sich nun genau eignen, hängt von der Sprache ab, die du dir ausgesucht hast; ein Programm, das nur dazu gedacht ist, DLLs in allen möglichen Sprachen zu programmieren, gibt es nicht.

      Wenn du allerdings so eine eierlegende Wollmilchsau suchst, mit der du in allen Sprachen Programmieren kannst, dann nimm eclipse. Dort kannst du über Plugins jederzeit die Sprache, in der du Programmierst, wechseln (normalerweise ist es Java, mit CDT ist es C++, und mit anderen Plugins kannst du in anderen Sprachen programmieren). Dieses Programm nimmt einem im allgemeinen jedenfalls eine Menge Arbeit ab.

      Und falls dir eclipse nicht zusagt, hast du jederzeit die Möglichkeit, einfach einen Texteditor zu nehmen (z.b. vim), die Quelltexte niederzuschreiben und hinterher den Compiler von Hand drüberzujagen.
    • wo ist denn das problem, 2 ports zu öffnen?

      @titan
      schau dir mal visual c++ express an..
      c++ is aber nich ohne, aber das lass ich ma deine sorge sein

      edit: verdammt.. -.- doppelpost..
      "das war meine letzte flamewar PM an dich ."
    • blubberblub schrieb:

      wo ist denn das problem, 2 ports zu öffnen?

      @titan
      schau dir mal visual c++ express an..
      c++ is aber nich ohne, aber das lass ich ma deine sorge sein

      edit: verdammt.. -.- doppelpost..


      Das Problem an der Sache ist die benutzerfreundlichkeit die dann ,gerade bei den leuten die mit Hardware wenig am Hut haben, sehr nachlässt.
      Ein gutes Programm / Spiel nimmt dem User soviel technische Probleme ab wie möglich.
      Wenn der User vor dem nutzen / spielen noch an der Hardware Ports freigeben muss so trägt dass nicht zu Benutzerfreundlichkeit bei.
      :/
    • @Phoenix:
      Nochmal kurz was dazu :P : Eigentlich störts mich überhaupt nicht wenn ein Post grammatikalisch faslch ist oder Rechtschreibfehler hat, bin ja auch nicht viel besser ;), ich wollte eigentlich nur mal von dir wissen was du denn nun mit dem Satz gemeint hast, da ich ja maßgeblich an der Diskussion beteiligt bin und den Satz wirklich nicht 100% verstanden hab. Für mich ist das so rübergekommen, damit ich mich besser erst mal in den GameMaker einarbeiten soll, bevor ich mich mit der 39DLL beschäftige.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von GrinchXL ()

    • @Grinch: Ne, eigentlich meinte ich eher nach dem Motto "Lieber estmal die Game Maker-Grundlagen lernen und dann mit der 39DLL rumproggen", wenn das nicht komisch klingt ;)

      Außerdem bezieht sich das nicht auf einen einzelnen ( auf dich schon ma' gar nich' ;) ), sondern auf 's allgemeine.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Phoenix ()

    • Zu diesem Teil fällt mir noch was ein:

      GML-Quellcode

      1. // In diesem Skript senden wir die Koordinaten des eigenen Spielers
      2. writeshort(x); writeshort(y);
      3. writeshort(image_angle); writeshort(direction);
      4. writeshort(speed);


      writeshort() sendet je zwei Bytes. Oft läßt sich das auf ein Byte reduzieren, dann verwendet man writebyte(). Natürlich muß dann der Empfänger auch die Daten mit readbyte() auslesen. Innerhalb einer message kann man beides verwenden.
      Ich zum Beispiel nehme immer nur ein Byte für den Winkel. Wie Ihr eine Zahl von zwischen 0 und 360 in den Bereich 0-255 skaliert, wißt Ihr hoffentlich. Wenn nicht, einfach durch 1.4 teilen. Falls die Differenz zwischen image_angle und direction sich nicht verändert, braucht man auch dafür insgesamt nur einen Wert.
      Für x und y gilt ähnliches: Wenn man writeshort() verwendet, packt 39ster den Wert wie gesagt in zwei Bytes. Das sind dann ganze Zahlen zwischen -32768 und +32768, weil das Vorzeichen im allerhöchsten Bit gespeichert (oder einfach am Ende 32768 abgezogen) wird. Stellt Euch dazu ein Raster vor mit 256x256 Pixel pro Zelle. Das Hi-Byte gibt an in welcher Zelle man ist, und das Lo-Byte gibt die Position innerhalb dieser Zelle an. Wenn also der Spieler eine Zelle verläßt, und nur dann, muß man das Hi-Byte senden. Um die Koordinaten in Hi- und Lo- Bytes zu zerlegen, nehmt Ihr "div 256 und "mod 256". Naja, und für "speed" reicht natürlich auch ein Byte.
      Für manche Sachen, wo nur ein Bit benötigt wird, kann man dieses Bit auch noch irgendwo mit reinklemmen.

      Ich würde also tatsächlich 3-4 verschiedene Messages verwenden (siehe "Swich"-Variable), je nach dem, was genau gesendet werden muß. Das hängt natürlich davon ab, wie die Figur bewegt wird. Bei mir sieht das dann ungefähr so aus:
      Spoiler anzeigen

      GML-Quellcode

      1. check=0;
      2. dirsend=direction / 1.40265;
      3. xhi= x div 256; yhi= y div 256;
      4. xlo= x mod 256; ylo= y mod 256;
      5. if (xhiOld!=xhi) or (yhiOld!=yhi) {check+=1;xhiOld=xhiy;hiOld=yhi} // könnte man auch noch einzeln abfragen. Kommt aber selten genug vor denke ich.
      6. if (dirsOld!=dirsend) {check+=2; dirsOld=dirsend}
      7. if (actsOld!=action) {check+=4; actsOld=action}
      8. ClientSend(128+check)
      Alles anzeigen

      und im "ClientSend" steht dann dazu

      GML-Quellcode

      1. case 128: writebyte(xlo);writebyte(ylo);
      2. break;
      3. case 129: writebyte(xlo);writebyte(ylo); writebyte(xhi); writebyte(yhi);
      4. break;
      5. case 130: writebyte(xlo);writebyte(ylo); writebyte(dirsend);
      6. break;
      7. case 131: writebyte(xlo);writebyte(ylo); writebyte(xhi); writebyte(yhi); writebyte(dirsend);
      8. break;
      9. case 132: writebyte(xlo);writebyte(ylo); writebyte(action);
      10. break;
      11. case 133: writebyte(xlo);writebyte(ylo); writebyte(xhi); writebyte(yhi); writebyte(action);
      12. break;
      13. case 134: writebyte(xlo);writebyte(ylo); writebyte(dirsend); writebyte(action);
      14. break;
      15. case 135: writebyte(xlo);writebyte(ylo); writebyte(xhi); writebyte(yhi); writebyte(dirsend); writebyte(action);
      16. break;
      Alles anzeigen

    • BlaXun schrieb:

      BlaXun: Das Problem mit Game Maker ist halt dass immer nur soviele Scripte durchgegangen werden können wie Room Speed gesetzt ist.
      Wenn wir die Nachrichten im STEP event bearbeiten und Room SPeed bei 30 liegt dann können wir das nur 30 mal abarbeiten.
      Wenn es schon 27 Nachrichten sind in der Sekunde dann können noch 3 dazu...und dann ist aber schon ende.
      So, da mich das nicht losgelassen hat, dass ich anderer Meinung war habe ich einmal an meinem Top-Down-Shooter für 2 Spieler getestet.

      alles mit 30 fps:

      Ich habe einfach mal Testweise 5000 Pakete auf Tastendruck versendet. Lokal sieht das wie folgt aus:
      ~5300 Pakete pro Sekunde bei mir mit 0% Paketverlust.

      Übers Internet sieht das ganze ganz anders aus. Meine Verbindung konnte ~800 Pakete versenden die beim anderen Benutzer ankommen. Aber ich selbst hatte vom anderen nur ~270 empfangen können.

      Jedenfalls ist die Aussage da oben meiner Meinung nach Falsch. Es können pro Step mehrere Nachrichten bearbeitet werden. Nur die Anzahl ist durch die Verbindung beschränkt. Das Riesenproblem ist nur: Wenn wirklich 5000 Pakete losgeschickt wurden und nur 270 Ankommen will ich gar nicht wissen, wo und wie die Pakete verlorengegangen sind. Aber 270 wird man im Normalfall auch kaum erreichen, und wenn dann hat man etwas falsch gemacht.

      Übrigens ich übersende jeden Step 1 Pakete alleine für die Spielerposition, den Blickwinkel, den Ping und den empfangen Ping. Das alleine macht schon 29-31 Pakete pro Sekunde. Sieht allerdings flüssig aus wie auf Lokal.

      Das ist hier zwar nur für ein 2 Spieler Spiel und ich kann BlaXuns Problem durchaus verstehen, denn sobald man von mehreren Benutzern wie bei SlimeOnline von jeder Seite Pakete empfangen und Senden muss hat das schon größere Auswirkungen und zieht dementsprechend Probleme mit sich. Deswegen würde ich am liebsten auch Server in einer Programmiersprache meiner Wahl schreiben wenn ich es denn könnte :(

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Dur'Rean ()

    • @Dur`Rean:
      Das macht schon irgendwie Sinn, ich hab da allerdings eine Theorie: Was ist jetzt aber wenn ein Paket rein kommt während der GameMaker des Empfängers gerade das Empfangsscript abgearbeitet hat und muß noch andere Sachen erledigen bevor er wieder zum nächsten Step kommt. Ich denke dabei an eine gewisse unsynchronität der Abarbeitsfolge der beiden Rechner, in der Zeit muß die Message ja warten. Kann allerdings auch sein das meine Überlegung kompletter Schwachsinn ist ;)
      Was ich mir aber sehr gut vorstellen kann, ist ganz einfach damit man die Internetleitung total überlastet, wenn man irgendeine Message jeden Step verschickt. Man Bombadiert ja regelrecht die Leitung, man füllt praktisch viel mehr Wasser auf einmal in eine Wasserleitung als sie transportieren kann, was passiert? Das Wasser schwabbt am Einfüllstuzen wieder raus. :P Hab auch irgendwo mal den Ausdruck Datenstau gelesen, so könnt ich mir das ganze vorstellen, das würde auch dein Packetverlust übers Internet erklären.
      Ich wette mit dir das du auch noch Probleme mit deiner Methode bekommen wirst, jeden Step so viele Sachen zu übertragen, wenn du mal mit jemanden dein Spiel testest, der eine etwas langsamere Internetverbindung hat, wirst du wahrscheinlich die Auswirkungnen zu sehen bekommen, ich hab die Erfahrung auch schon gemacht ;)

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von GrinchXL ()

    • Dur'Rean schrieb:

      BlaXun schrieb:

      BlaXun: Das Problem mit Game Maker ist halt dass immer nur soviele Scripte durchgegangen werden können wie Room Speed gesetzt ist.
      Wenn wir die Nachrichten im STEP event bearbeiten und Room SPeed bei 30 liegt dann können wir das nur 30 mal abarbeiten.
      Wenn es schon 27 Nachrichten sind in der Sekunde dann können noch 3 dazu...und dann ist aber schon ende.
      So, da mich das nicht losgelassen hat, dass ich anderer Meinung war habe ich einmal an meinem Top-Down-Shooter für 2 Spieler getestet.

      alles mit 30 fps:

      Ich habe einfach mal Testweise 5000 Pakete auf Tastendruck versendet. Lokal sieht das wie folgt aus:
      ~5300 Pakete pro Sekunde bei mir mit 0% Paketverlust.

      Übers Internet sieht das ganze ganz anders aus. Meine Verbindung konnte ~800 Pakete versenden die beim anderen Benutzer ankommen. Aber ich selbst hatte vom anderen nur ~270 empfangen können.

      Jedenfalls ist die Aussage da oben meiner Meinung nach Falsch. Es können pro Step mehrere Nachrichten bearbeitet werden. Nur die Anzahl ist durch die Verbindung beschränkt. Das Riesenproblem ist nur: Wenn wirklich 5000 Pakete losgeschickt wurden und nur 270 Ankommen will ich gar nicht wissen, wo und wie die Pakete verlorengegangen sind. Aber 270 wird man im Normalfall auch kaum erreichen, und wenn dann hat man etwas falsch gemacht.

      Übrigens ich übersende jeden Step 1 Pakete alleine für die Spielerposition, den Blickwinkel, den Ping und den empfangen Ping. Das alleine macht schon 29-31 Pakete pro Sekunde. Sieht allerdings flüssig aus wie auf Lokal.

      Das ist hier zwar nur für ein 2 Spieler Spiel und ich kann BlaXuns Problem durchaus verstehen, denn sobald man von mehreren Benutzern wie bei SlimeOnline von jeder Seite Pakete empfangen und Senden muss hat das schon größere Auswirkungen und zieht dementsprechend Probleme mit sich. Deswegen würde ich am liebsten auch Server in einer Programmiersprache meiner Wahl schreiben wenn ich es denn könnte :(


      In meiner Aussage ging es doch nciht darum wie viele Nachrichten ankommen, sondern darum dass es aufgrund der GM Struktur nicht möglich ist alle Nachrichten im vorgesehenen Zeitraum abzuarbeiten.
      Das TCP Protokoll ist dafür zuständig dass die Nachrichten zu 100% ankommen. Bei UDP wäre das anders da UDP nicht mit der Sicherheit arbeitet dass die Nachrichten auch ankommen.

      Alle Pakete kommen an, okay, aber können die Nachrichten auch umgesetzt werden?
      Versuch dass mal, du wirst merken dass es ab der 30ten Message zeitverzögert abläuft.

      Edit:
      So, mal GrinchXls Post gelesen.

      Genau so ist es, die Nachrichten überfluten die Anwendung und diese kommt nicht hinterher, das ist das Problem was ich meinte.
      Dass die Nachrichten alle ankommen ist im LAN ja vollkommen in ordnung, aber die Zeitverzögerung aufgrund der Message-Anzahl wird deutlich bemerkbar.

      Im LAN kannste ruhig mit STEPS zum versenden arbeiten, aber dann ist es auch schon soweit und zusatz Messages werden "hintendran" gehängt beim Abarbeiten der Nachrichten.
      Wenn das ganz nun noch mehr als 2 Spieler hat dann wirds übel.

      Mein Aussage bleibt meiner Meinung nach richtig :P
      Wäre aber sogar froh wenn das Jemand wiederlegen könnte da mich diese Einschränkung an GM wirklich nervt.
    • Gerne.

      Hier ist mal das Spiel wo ich aktuell dran werkel und es getestet habe.

      2x das Spiel öffnen, eins hosten mit dem anderen verbinden.
      WSAD steuerung, 1-2 waffe wechseln (nachladen ist aktuell kaputt), maus zielen, mittlere maustaste gegner erstellen ;)

      Mit der Leertaste werden 500 Schüsse und damit 500 pakete in eine zufällige richtung erstellt. Wenn sie erst nacheinander abgearbeitet werden, ergeben sie keinen eindeutigen Ring. Das tun sie aber größtenteils und es gibt bei mir seltener Abweichungen, ja. Es gibt sie. Aber der Großteil wird sofort abgearbeitet.

      megaupload.com/de/?d=BBOK6VQK

      und sorry für megaupload, aber einen vernünftigen freehoster zu finden ist so eine sache.
    • Also , room speed 30 ist wirklich Mist. Ich benutze IMMER 60, bzw. die automatische Synchronisierung (60)
      Ich habe schon oft gesehen, daß Leute room speed auf 999 setzen. Spätestens beim "dedicated" Server sollte man das hier auch überlegen.
      Eine Alternative wäre z.B. room speed 120, und dann sowas wie "jeden 2.Step" oder "jeden 4. Step" anstatt Step-Events verwenden.