Problem bei Kollision im Multplayer mit Types

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Problem bei Kollision im Multplayer mit Types

BeitragDo, Dez 08, 2011 14:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
ich habe ein kleines Problem mit der Kollision in meinem Ego Shooter. Und zwar habe ich im Main Dokument ganz oben ein Include auf die LoadResources.bb verwiesen. Darin wird ein Cube erstellt:

BlitzBasic: [AUSKLAPPEN]

Global Cube = CreateCube()
PositionEntity Cube,0,1,5
EntityType Cube,Type_OCube
HideEntity Cube


So jetzt wird also ein Cube erstellt und sofort ausgeblendet -.-
Jetzt hab ich im MainDokument 2 Konstante Variablen: Type_Map und Type_OCube
Map natürlich aufs terrain verwiesen und den Cube wie ihr oben sehen könnt auch...

dann hab ich ne Function UpdateNetwork()

darin steht wenn ein user joined:

BlitzBasic: [AUSKLAPPEN]

c.Client = New Client
c\ID = blablabla
c\Mesh = CopyEntity(Cube)


ausserdem kann man mit der maus kugeln erstellen. die kugel ist ein sprite was ich auch in der include datei lade und mit entitytype auf die konstante Type_Bullet verweise... diese kugel möchte ich mit dem Cube kollidieren lassen. also hab ich:

BlitzBasic: [AUSKLAPPEN]

Collisions Type_Bullet,Type_OCube,2,1


..etwas weiter unten vor die hauptschleife geschrieben.
dann hab ich noch ne Function wo drin steht:

BlitzBasic: [AUSKLAPPEN]

For c.Client = Each Client

For b.Bullet = Each Bullet
If EntityCollided(c\Mesh,Type_Bullet) Then
WriteByte(UDPStream,Byte_Schuss)
WriteInt(UDPSTream,c\ID) ;der getroffen wurde soll leben abgezogen werden, dafür die id übertragung
SendUDPMsg(UDPStream,INT_IP(IP),Port) ;IP und Port sind verwiesen mit ip und port Wink
End If
Next

Next


im server rufe ich das ganze ab:

BlitzBasic: [AUSKLAPPEN]


Select ReadByte(UDPSTream)

Case Byte_Schuss

ID% = ReadInt(UDPSTream)

For oc.Client = Each Client

If oc\ID = ID Then
WriteByte(UDPSTream) ; also die informationen senden nur an den der getroffen wurde...
End If

Next



Nur leider klappt das ganze alles irgendwie nicht, bin jetzt schon seid stunden am suchen -.- die kollision funktioniert überhaupt nicht... eigentlich müsste die kugel doch schon mit dem würfel kollidieren und dann stoppen, sie fliegt einfach hindurch -.- weiß jemand weiter?
Mit freundlichen Grüßen: GearTechDE

kog

BeitragDo, Dez 08, 2011 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
If oc\ID = ID Then
WriteByte(UDPSTream) ; also die informationen senden nur an den der getroffen wurde...
End If


vergisst du es da nicht zu senden?

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Dez 08, 2011 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nee hatte keine lust das alles da zu schreiben, also das SendUDPMsg mache ich schon -.- aber ich glaub nich, dass es am senden von der nachricht hängt, sondern an der Kollision.. Ich habe eine Frage, wenn ich 2 Type habe, einen für die andren Spieler und einen für die Kugeln... dann muss ich doch eigentlich mit types arbeiten und ständig in einer For Next schleife abfragen ob er es ist... muss ich dann um beide types anzusprechen:

BlitzBasic: [AUSKLAPPEN]

For c.Client = Each Client

For b.Bullet = Each Bullet

;Geht es, dass ich 2 schleifen hier so habe? sodass ich auch beide types ansprechen kann?

Next

Next


Funtioniert das so?
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragDo, Dez 08, 2011 19:19
Antworten mit Zitat
Benutzer-Profile anzeigen
hm kann es evt daran liegen:
Code: [AUSKLAPPEN]
HideEntity Cube


eventuell solltest du das copierte mesh mit Showentity wieder sichtbar und somit auch abfragbar machen Smile
Rechtschreibfehler gelten der allgemeinen Belustigung!

Blitzcraft

BeitragDo, Dez 08, 2011 20:40
Antworten mit Zitat
Benutzer-Profile anzeigen
HideEntity deaktiviert auch die Kollision von Objekten
Probiers mal mit EntityAlpha:
Code: [AUSKLAPPEN]
EntityAlpha cube,0
Screenshot aus meinem ersten Projekt

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Dez 08, 2011 21:28
Antworten mit Zitat
Benutzer-Profile anzeigen
aber das kann doch nicht sein, weil ich die kugeln und die anderen spieler ja sehe -.- ??? moment aber ich gucke mal, das hört sich irgendwie ziemlich verdächtig an...
Mit freundlichen Grüßen: GearTechDE

Tankbuster

BeitragDo, Dez 08, 2011 22:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Versuch mal, MeshesIntersect(mesh1%, mesh2%) anstatt EntityCollided zu verwenden. Wenn das funktioniert (und das wird es), kann es daran liegen, dass die Blitz-Kollision nicht dazu geeignet ist, zwei sich bewegende Objekte auf Kollision zu prüfen. Solange du ein Meshterrain oder etwas anderes unbewegliches hast, geht das gut, aber wenn sich Spieler und Kugel bewegen, kann es sein, dass die Kollision garnicht erkannt wird...

Sollte die Sache mit MeshesIntersect nicht funktionieren, machst du irgendetwas sehr falsch Wink
Twitter
Download Jewel Snake!
Windows|Android

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Dez 08, 2011 22:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Also, wenn ich in der Funktion UpdateCollisions:

BlitzBasic: [AUSKLAPPEN]

wert = MeshIntersect(b\Mesh,c\Mesh)
If wert = 1 Then

Text 0,100,"kollisions"

Else

Text 0,100,"keine kollision"

End If


dann kommt wenn ich auf jeweils den anderen würfel schiesse ein MAV und wenn ich den debugger anschmeisse sagt der mir das eins von beiden oder beide kein Mesh ist.. stimmt ja auch, die schüsse sind sprites... aber eig. sind das doch auch meshes oder nicht?

aber dürfte dieser mav nicht eigentlich garnicht kommen wenn keine kollision stattfindet?

Edit: ich lade morgen mal das komplette projekt hoch. Hiffe mir kann dann jemand helfen -.- ich bin gerade nämlich ziemlich verwirrt, da och mit kollision eigentlich fast nie probleme hatte :/
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragFr, Dez 09, 2011 11:29
Antworten mit Zitat
Benutzer-Profile anzeigen
gehtst du wirklich alle beide Type Instanzen durch?


sprich :

Code: [AUSKLAPPEN]
for A.typeA = each typeA
   for B.Type = each TypeB

          prüfen
  next
next
Rechtschreibfehler gelten der allgemeinen Belustigung!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 09, 2011 14:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ich glaube schon also so hab ich es gemacht wie du...

hier mal das Projekt, vielleicht findet jemand einen Fehler oder so etwas..

http://geartech.ge.funpic.de/StrikingDown.rar

Danke im Voraus
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragFr, Dez 09, 2011 17:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi...

also erstmal... musst du ganz ganz ganz dringen den code anders organisieren.
Momentan ist es bei dir so:


Globale
constaten
includes

### main loop###


funktionen
types festlegen
funktionen
irgendwelche funktionen
arrys definieren
funktionen

oh man da sucht man sich zum krüpel ^^


bitte mach das eher so


grafik modus setzen..

globale
constanten

includes

types festlegen
arrys festlegen


### main loop ####



funktionen
funktionen

....



zu deinem Problem:
Code: [AUSKLAPPEN]

Function UpdateCollisions()

   For b.SBullet = Each SBullet

      For c.Client = Each Client
         
         ;If EntityCollided(b\Mesh,Type_OCam) Then
            
            
            End
            ;WriteByte(UDPStream,Hit)
            ;WriteInt(UDPStream,c\ID)
            ;SendUDPMsg(UDPStream,INT_IP(IP),Port)
            
      ; End If
         
         wert = MeshesIntersect(b\Mesh,c\Mesh)
         If wert = 1 Then
            
            End
            
         End If
         
      Next
      
   Next
   
End Function



die schleife For c.Client = Each Client wird nie ausgeführt ! weil noch keine client instanz erstellt wurde.

die clients erstellst du hier:
Code: [AUSKLAPPEN]

Function UpdateNetwork()
   
   While RecvUDPMsg(UDPStream) <> 0
      
      Select ReadByte(UDPStream)
            
         Case Join
            End
            ;Auslesen
            ReadID% = ReadInt(UDPStream)
            ReadName$ = ReadString(UDPStream)
            
            ;Eintragen + setzen
            c.Client = New Client
            c\ID = ReadID
            c\Name = ReadName
            c\X = 300
            c\Y = 50
            c\Z = 250
            c\Yaw = 0
            c\Mesh = CopyEntity(OPlayer)
            PositionEntity c\Mesh,c\X,c\Y,c\Z
            RotateEntity c\Mesh,EntityPitch(c\Mesh),c\Yaw,EntityRoll(c\Mesh)




allerdings kommt nie "Case Join" und somit auch keine client instanz....


Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 09, 2011 17:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich lasse aber immer auf 2 PC´s die Clients laufen.. Aber das hat nicht funktioniert, deswegen frage ich ja -.-
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragFr, Dez 09, 2011 17:38
Antworten mit Zitat
Benutzer-Profile anzeigen
wenn ich mit 2 clients joine .. sehe ich aber keinen 2ten ^^ worauf schiest du denn
Rechtschreibfehler gelten der allgemeinen Belustigung!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 09, 2011 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht, weil du die IP adresse nicht geändert hast? die ist noch auf meine Hamachi IP registriert, änder die mal in deine lokale: 127.0.0.1
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragFr, Dez 09, 2011 19:23
Antworten mit Zitat
Benutzer-Profile anzeigen
so.. also erstmal... der code ist so unleserlich das ich mal mega aggro wurde und mit gefühlten 3 atemzügen meine wasserpfeife leer gezogen hab Twisted Evil Twisted Evil


so...
wie vorhins vermutet hidest du dein mesh ohne es wieder zu "zeigen"
Code: [AUSKLAPPEN]
HideEntity OPlayer



also bitte ein showentity einfügen, und das bevor du damit etwas machst:
Code: [AUSKLAPPEN]

Case Join

            ;Auslesen
            ReadID% = ReadInt(UDPStream)
            ReadName$ = ReadString(UDPStream)
            
            ;Eintragen + setzen
            c.Client = New Client
            c\ID = ReadID
            c\Name = ReadName
            c\X = 300
            c\Y = 50
            c\Z = 250
            c\Yaw = 0
            c\Mesh = CopyEntity(OPlayer)
            ShowEntity c\mesh
            PositionEntity c\Mesh,c\X,c\Y,c\Z
            RotateEntity c\Mesh,EntityPitch(c\Mesh),c\Yaw,EntityRoll(c\Mesh)
            EntityType c\mesh,Type_OCam




Die kollisionsprüfung habe ich mit If EntityDistance(c\mesh,b\mesh) <3 Then End hinbekommen.
Dieser befehl ist aber langsam also sollte man ihn sparsam verwenden.


warum es mit entitycollided nicht klappt, kann nur an Entitytype oder ähnlichen liegen.
Mir ist eh aufgefallen das du das nicht bei allen Meshes vergeben hast... Also Pflege das nach und dann wirds warscheinlich auch mit entitycolided klappen.

Mir ist zudem aufgefallen das du deine clients auf X=300 y=50 Z=... erstellst.
Im Spiel haben sie aber ganz andere Positionen. Eventuell solltest da auch mal drüber gehen.

Was rede ich.. der ganze code muss überarbeitet werden..

Gruß
Dottakopf
Rechtschreibfehler gelten der allgemeinen Belustigung!

GearTechDE

ehemals 'KillerJo96'

BeitragFr, Dez 09, 2011 19:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja du hast leider Recht-.- komme ja selber schon nich mehr klar -.- werde das einfach nochmal überarbeiten, wird schon irgendwie funktionieren.

Trotzdem danke für die Mühe Wink
Mit freundlichen Grüßen: GearTechDE

Dottakopf

BeitragFr, Dez 09, 2011 19:48
Antworten mit Zitat
Benutzer-Profile anzeigen
ich empfehle IDEAL anstatt die standard ide von Blitzbasic zu verwenden.
Hat tolle funktionen wie funktionen zusammenklappen und das erstellen von solchen blöcken.

Ohne IDEAL könnte ich mir das proggen überhaupt nicht mehr vorstellen !!

*Edit: danke Holzchopf.. sehr peinlich Very Happy
Rechtschreibfehler gelten der allgemeinen Belustigung!
  • Zuletzt bearbeitet von Dottakopf am Sa, Dez 10, 2011 0:25, insgesamt einmal bearbeitet

Holzchopf

Meisterpacker

BeitragFr, Dez 09, 2011 23:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Bevor du mit dem Rewrite beginnst: Überleg' dir gut, was alles schief gelaufen ist. Dann kannst du die Fehler von Anfang an vermeiden.

Und zu Dottakopfs Tipp möchte ich noch hinzufügen:
Die alternative IDE heisst IDEal und kann auf fungamesfactory heruntergeladen werden. Was heisst da kann? Sollte. Nein, muss! Ohne IDEal macht doch Programmieren in BlitzBasic gar keinen Spass Wink

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

GearTechDE

ehemals 'KillerJo96'

BeitragSa, Dez 10, 2011 12:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Öffne mein Projekt mal mit der Standart IDE, dann siehste das ich IDEal benutze Wink aber ist ja nich schlimm. Benutze sie schon seid ich angefangen habe mit BB zu programmieren Wink

Ich halte mich jetzt einfach Schlicht&Weg an den Aufbau den Dottakopf mir gepostet hat.
Ich denke so wird das ganze viel übersichtliger und hat mehr Sinn.
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group