Die schlaue Art zu kollidieren?

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

 

PacMani

Betreff: Die schlaue Art zu kollidieren?

BeitragDo, März 11, 2010 17:33
Antworten mit Zitat
Benutzer-Profile anzeigen
In meinem derzeitigen Spiel gibt es zwei Objekte, vereinfacht ausgedrückt Autoscooter, die, wenn sie sich gegenseitig rammen, voneinander wegdriften sollen (Impuls und Übergabe der eigenen Geschwindigkeiten). Ein Type hat alle Autoscooter untergebracht, also laufe ich die Types immer durch und überprüfe sie nach Kollisionen. Das funktioniert aber überhaupt nicht problemlos, da einige Scooter einfach stehenbleiben und ich nichtmal weggepuscht werde (vermutlich wegen der Art, Types bei mir zu durchlaufen?). Hier mal der Code-Ausschnitt:

Code: [AUSKLAPPEN]
Const CarCollisions=1
Collisions CarCollisions,CarCollisions,1,2

Type TRedCar
   Field Entity
   Field ID%
   Field PlayerControlled%
   Field YawLeft%
   Field Acceleration#
   Field XSpeed#
   Field ZSpeed#
End Type
Global NRedCar.TRedCar
Global NRedCar2.TRedCar


;Innerhalb der Hauptschleife
For NRedCar=Each TRedCar
   Local CollidedCarXSpeed#,CollidedCarZSpeed#
   For i=1 To CountCollisions(NRedCar\Entity)
      Select GetEntityType(CollisionEntity(NRedCar\Entity,i))
         Case CarCollisions
            Local CollidedCar=EntityCollided(NRedCar\Entity,CarCollisions)
            For NRedCar2=Each TRedCar
               If NRedCar2\Entity=CollidedCar Then
                  MoveEntity NRedCar2\Entity,NRedCar\XSpeed,0,NRedCar\ZSpeed
                  CollidedCarXSpeed=NRedCar2\XSpeed
                  CollidedCarZSpeed=NRedCar2\ZSpeed
                  NRedCar2\XSpeed=NRedCar\XSpeed
                  NRedCar2\ZSpeed=NRedCar\ZSpeed
                  NRedCar\XSpeed=-CollidedCarXSpeed
                  NRedCar\ZSpeed=-CollidedCarZSpeed
               End If
            Next
      End Select
   Next
Next

Xeres

Moderator

BeitragDo, März 11, 2010 17:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Blitz eigene Kollision erfordert ein still stehendes und ein bewegtes Objekt um ordentlich zu funktionieren; wenn sich beide Objekte bewegen, kann es Probleme geben.
Du könntest einfach eine Kugel-Kugel Überprüfung machen d.H. die Abstände messen und wenn der kleiner ist als zwei mal der Radius, gibt es eine Kollision.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

PacMani

BeitragDo, März 11, 2010 17:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ist bereits Kugel-zu-Kugel, zwar nicht selbst ausgerechnet, aber würde das einen Unterschied machen? Die beiden Gegenstände werden sofort nach der Kollision einen Tucken voneinander wegbewegt, um beim zweiten Schleifendurchlauf nicht nocheinmal zu kollidieren (weswegen sie dann ineinander stecken würden). Es bewegen sich halt nur einige der vom gleichen Type abgeleiteten Objekte nicht, eines tut es aber immer (ich tippe da stark auf die Erstellungsreihenfolge).

tix

BeitragFr, März 12, 2010 23:46
Antworten mit Zitat
Benutzer-Profile anzeigen
hab das gefühl da werden kollisionen doppelt geprüft

auto a mit auto b
werte werden geändert
in der selben schleife dann noch mal
auto b mit auto a
werte werden wieder geändert

könnte den effekt negieren
innerhalb der schleifen werden die kollisionen jedenfalls nicht akttualisiert
deshalb doppel effekt wirkung effekt negation
frag mich auch ob der pusch von xspeed so groß is das er wirklich auffällt

naja isn ansatz evl hilfts ja Wink ^^
 

PacMani

BeitragSa, März 13, 2010 11:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das ist mir dann auch aufgefallen... deswegen habe da jetzt "UpdateWorld" reingemacht, nachdem ich ein Auto einen Tucken wegbewegt habe... aber ist das dann noch sauber programmiert? Smile Funktioniert aber erstmal ganz gut.

tix

BeitragSa, März 13, 2010 19:42
Antworten mit Zitat
Benutzer-Profile anzeigen
neenee
das nich so gut
weil leistungs verschwendung
du machst ja dann alles doppelt und dreifach
ich hab mal nach gekuckt

da ich mir nich sicher bin ob reset auch in den listen aller anderen colls aktualisiert
denk ich geht das so

Code: [AUSKLAPPEN]

;daten holen
for i = each cars
  if entitycollided(i,autocol) = true then
    for k = 1 to countcollisons(x)
      colobj = collisionentity(i,k)
      if getentitytype(colobj) = autocol then
        i.xcolspeed=i.xcolspeed+colobj.xspeed
        i.ycolspeed=i.ycolspeed+colobj.yspeed
      end if
    next
  end if
next

;daten aktualisieren
for i = each cars
  if entitycollided(i,autocol) = true then
    i.xspeed=i.xspeed+i.xcolspeed
    i.yspeed=i.yspeed+i.ycolspeed
    i.xcolspeed=0
    i.ycolspeed=0
  end if
next


^^
das müsste eig so klappen
auch wenns evl nich so aussieht
es macht nur was wirklich getan werden muss

es folgt dem prinzip jeder kümmert sich nur um sich selbst

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group