Die schlaue Art zu kollidieren?
Übersicht

PacManiBetreff: Die schlaue Art zu kollidieren? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 THERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld) |
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
PacMani |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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? ![]() |
||
![]() |
tix |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group