Ego Shooter Netzwerk Frage: Wie realisiert man das?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Ego Shooter Netzwerk Frage: Wie realisiert man das?

BeitragDi, Dez 06, 2011 13:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Also,
ich habe vor einen Ego Shooter zu programmieren, bzw. hab ich das eigentlich schon gemacht, jedoch möchte ich dort jetz einen multiplayer mit UDP einbauen. Da ich UDP Jetzt ja ENDLICH verstanden habe, ist das auch nicht mehr mein Probem.

Ich habe nur noch eine Fragen, wie realisiert man das mit den Schüssen?
Wird von jeder Kugel immer die Koordinate übertragen oder wie? das würde ja ganz schönen traffic geben -.- oder macht man es so: Wenn ich auf jemand schiese und ihn getroffen habe, wird ein wenig leben abgezogen und sonst passiert nichts, sodass einfach übertragen wird, wie viel leben der jenige jetzt noch hat? Ich bin mir dabei noch nicht so ganz sicher und glaube das ich damit total falsch liege..

Lg GearTechDE
Mit freundlichen Grüßen: GearTechDE

ZaP

BeitragDi, Dez 06, 2011 13:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Lass die Clients ruhig die position der Projektile selbst berechnen, wichtig ist nur, dass ein Signal kommt, wenn jemand getroffen wurde und Hitpoints verliert.
Starfare: Worklog, Website (download)

Holzchopf

Meisterpacker

BeitragDi, Dez 06, 2011 13:41
Antworten mit Zitat
Benutzer-Profile anzeigen
~VERSCHOBEN~
Dieser Thread passte nicht in das Forum, in dem er ursprünglich gepostet wurde.

Ist ja nicht wirklich 3D-spezifisch Wink

Jede Methode hat Vor- und Nachteile. Überträgst du immer nur, wem du wie viel Leben abgezogen hast, eröffnet das Cheatern sehr viele Türen (man sendet dann einfach n paar zusätzliche ich-habe-dich-getroffen-Pakete). Überträgst du bei jedem Schuss die Koordinate (vom Erstellungspunkt + Richtung) und lässt den Server die Bewegung und Kollisionskontrolle durchführen, hat dieser am meisten Rechenaufwand. Ausserdem kann es dann sein, dass du (als Client) zwar denkst, einen Gegner getroffen zu haben, weil du auf ihn zieltest, die Nachricht aber so spät beim Server ankommt, dass der, mit den neuen Spieler +Schusskoordinaten keine Kollision feststellen kann und demnach keinen Treffer zählt.

Ich würde trotzdem die zweite Variante vorziehen - je mehr man vom Server ausführt, umso mehr Kontrolle hat dieser und umso weniger cheatanfällig wird das Spiel.

mfG
Holzchopf
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BYBinaryBorn - Yogurt ♫ (31.10.2018)
Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm

Dottakopf

BeitragDi, Dez 06, 2011 13:44
Antworten mit Zitat
Benutzer-Profile anzeigen
also das sieht dann so aus:


Pseudo deutsch/Code sprach:
Code: [AUSKLAPPEN]

Client1:
schiest eine kugel und sagt zu allen anderen Mitspielern das er jetzt geschossen hat.
--> Dabei beschreibt er in welche richtung er geschossen hat, und mit welcher waffe usw.


die anderen Clients:
empfangen, dass client 1 geschossen hat. Lesen welche Munition und mit welcher wafffe.
Erstellen nun an der Position des Client 1 einen neuen schuss und richten diesen nach dem gesendetem winkel aus. Schuss wird in flugrichtung bewegt.





So funktioniert das im Prinzip.


ich arbeite gerade an so einem Projekt.
Vielleicht möchtest du ja mal in meinem Worklog in meiner Signatur vorbei sehen.

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

Eingeproggt

BeitragDi, Dez 06, 2011 14:04
Antworten mit Zitat
Benutzer-Profile anzeigen
@Holzchopf: Ich mach mir ja auch gern so Gedanken und stimme dir ja inhaltlich zu... aber ich hab noch kein Spiel hier im Blitzforum gesehen das ernsthaft massiv mit Cheatern Probleme gehabt hätte *. Bzw. umgekehrt hab ich noch niemanden gesehen der seine Zeit damit verbringt BB-Spiele zu hacken... noch dazu wo es im Falle des Fragestellers um seinen ersten UDP-Shooter geht. Ja, jetzt könnte man wieder mit der neverending Diskussion kommen von wegen "nicht übertreiben" vs. "von grund auf gscheit lernen", aber mal ehrlich... ich nehme an das wird n Hobbyprojekt und wenn du (ehemaliger Joe) es hinkriegst, hast du schon genug Aufwand getrieben und genug gelernt Wink

(*) Alle Spiele die in die Größenordnung kommen wo die Versuchung bestehen würde zu cheaten haben auch dementsprechende Vorkehrungen, ich denke da aktuell an ChaosSpace + Nachfolger.

mfG, Christoph.
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Dez 07, 2011 14:21
Antworten mit Zitat
Benutzer-Profile anzeigen
@Eingeproggt
Ja da muss ich dir rechtgeben, es ist 1. nicht so, dass ich weiß wie ich mich vor hackern schütze. und zweitens, das spiel ist sowieso NOCH kein Spiel. Es werden lediglich bis jetzt koordinaten der einzelnen spieler übertragen, ausserdem finde ich nicht, dass etwas derartiges mit BB nötig ist, da mein spiel nicht jeder spielen wird, und 2. dann wahrscheinlich zu besseren ego shooter greift etc. ihr wisst was ich meine...

@Topic
Also die Koordinaten der Schüsse übertragen zu lassen wäre wahrscheinlich nicht so das problem, jedoch gibt das anscheinend verdammt viel Traffic. Ich denke ich mache es so, dass ein Client sendet wenn er einen Schuss schiesst, aus welcher richtung, höhe und das absenden. sonst wird es einfach zu viel traffic...

Trotzdem danke schonmal für die vielen Antworten.
Und sorry das ich mich so spät melde, ich habe den Thread aufgrund der Verschiebung nicht mehr gefunden Razz xD naja Danke
Mit freundlichen Grüßen: GearTechDE

ZaP

BeitragMi, Dez 07, 2011 15:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Das eigentliche Problem an UDP ist ja, dass nicht immer alle Nachrichten ankommen, bzw. in falscher Reihenfolge (unter normalen Umständen zwar schon, aber man sollte auf keinen Fall davon ausgehen)

Du fährst ganz gut damit, wenn nur der Host alles entscheidet und alle anderen nur nachfragen dürfen. Also in deinem Fall fragt der Client, ob er denn Schießen darf, geht gleichzeitig davon aus, dass er es darf und wartet auf die Antwort vom Host. Der Host entscheidet, ob alles seine Richtigkeit hat, und bestätigt im Normalfall, dass geschossen werden darf (evtl. kann man sich das sogar sparen, und nur antworten, wenn eigentlich nicht geschossen werden dürfte). Wenn nicht, muss der Client halt die entsprechenden Schüsse entfernen und wieder zur Gesamtmunition(?) hinzufügen.

So oder so ähnlich haben die das z.B. bei Call of Duty 2 implementiert, man merkte das, wenn man mit einer hohen Ping spielt, dann kamen die Kugeln teilweise verzögert aus der Waffe.

In jedem Fall solltest Du allen Nachrichten eine fortlaufende Nummer mitgeben, so dass Du bemerkst, wenn etwas vertauscht oder ausgelassen wurde.
Starfare: Worklog, Website (download)

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Dez 07, 2011 17:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Also hab die Kugel übertragung soweit erfolgreich abgeschlossen. Die kugeln fliegen dahin wo sie sollen, und es gibt ca. im lokalen netzwerk ne verspätung von 23ms.. ich hoffe mal das das gut ist-.- oder ich habs falsch berechnet... jedenfalls funktionierts ziemlich gut.

Jedoch hab ich jetzt ein Problem,

ich habe eine Function UpdateCollisions()

dort drin steht:

BlitzBasic: [AUSKLAPPEN]

For oc.Client = Each Client

If EntityCollided(oc\Mesh,Type_Bullet) Then

MyHealthPoints = MyHealthPoints - 2

End If

Next


Sodass bei jedem Schuss immer 2 leben abgezogen werden... das findet im Client statt...
So ich sende ja auch den byte damit der server weiß, dass jemand verletzt wurde. aber die leben werden nicht voneinander abgezogen... warum?
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragMi, Dez 07, 2011 18:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich die drei zeilen code sehe, kann ich nur davon ausgehen dass deine Kollisonsabfrage nie True ergibt.


Nur so eine Anmerkung:
Zudem sollte JEDER client also AUCH du selbst in einem Type/arry hinterlegt sein. Das betrifft dann natürlich auch alle dazugehörigen varriablen.

So geht es auch ist aber unschön


also... ergibt deine kollisionsabfrage über haupt true oder finden keine kollisionen statt Wink


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Dez 07, 2011 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Beispiel ist gerade voll für´n *** gewesen -.- xD hatte gerade i-wie nen Blackout...
Also ich habe mich selber momentan nur als Camera, und in den andren Clients werde ich als Cube dargestellt. Jeder cube bekommt bei der erstellung sofort EntityType c\Mesh,Type_OCube

damit ich diese nachher auf collision überprüfen kann...

So mach is momentan:
BlitzBasic: [AUSKLAPPEN]

For c.Client = Each Client

If EntityCollided(c\Mesh,Type_Bullet) Then

;Sende Verletzung -2 + ID von dem den ich angeschossen habe an den server, bla bla bla

End If

Next


Beim Server:
BlitzBasic: [AUSKLAPPEN]

ID% = ReadInt(UDPSTream)

For oc.Client = Each Client

If oc\ID = ID Then ;Wenn er den gefunden hat, der angeschossen wurde

WriteByte(UDPSTream,Hit) ;den byte senden das er angeschossen wurde und -2 leben weggehen...

End If
Next


hoffe jemand rafft mein problem, denn es funzt aus einem mir unbekannten Grund nicht, das leben wird einfach nicht abgezogen. Was ich jetzt probiere ist, ob die Kollision überhaupt stattfindet und es einfach an der variablenrunterzählung liegt, was ich eher weniger glaube -.-

wenn niemand ein problem findet, poste ich gerne mal den source code...
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group