COllision nur an Vorderkante
Übersicht

![]() |
MegamagBetreff: COllision nur an Vorderkante |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo.
In meinem Space-Shooter gibt es Bonus. Der besteht aus zwei Kugeln und einer weiteren Kugel, die mit EntityAlpha auf 0 gesetzt wurde. Jene bekam den Type C_Bonus. Der Player, elcher ein ".3ds"-Model ist bekam den Type C_Player. Dann habe ich Code: [AUSKLAPPEN] Collisions C_Bonus,C_Player,2,1
geschrieben und auch schon mit anderen Werten ausprobiert. In der Update-Funktion vom Bonus ist Code: [AUSKLAPPEN] If EntityCollided(b\box , C_Player)
b\box ist die "CollisionSphere". Aber wenn der Player jetzt von vorne dagegen fliegt, dann ist alles ok, der Bonus verschwindet, man bekommt Punkte usw. Aber wenn er nun versucht von oben, unten, oder hinten dagegen zu fliegen, fliegt er einfach durch den Bonus durch, bis er ihn wieder mit der Vorderkante berührt. Ich habe auch schon versucht dem Player eine Box zu- zuweisen, aber da ist es dasselbe. EntityRadius und EntityBox funktionieren auch nicht. Übrigens gilt das ganze auch für Schüsse und überhaupt alles, was den Player berühren soll. Bisher fiel mir das nie auf, weil ich immer von vorne dagegen ge- flogen bin aber jetzt... Sagt mir bitte, was ich dagegen tun soll/kann und wer mehr Code braucht, soll das bitte sagen. |
||
DarkDragon-1993 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Bissl mehr Code wär tatsächlich net schlecht. Dann könnten wir zu zweit an einer Lösung grübeln ![]() |
||
![]() |
Megamag |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok, nehmen wir mal nur den Bonus:
Code: [AUSKLAPPEN] Const C_Player = 5
Const C_Bonus = 6 Collisions C_Bonus,C_Player,2,1 player = LoadMesh("Models\Playervoid.b3d") EntityFX player,1 ScaleMesh player,0.05,0.05,0.05 PositionEntity player,0,0,20 EntityType player,C_Player Type T_Bonus Field x# Field y# Field z# Field ent1 Field ent2 Field kind Field box End Type Function create_Bonus(x#,y#,z#,kind) b.T_Bonus = New T_Bonus b\kind=kind b\box = CreateSphere() PositionEntity b\box,x,y,z EntityAlpha b\box,0 EntityType b\box,C_Bonus If kind=1 Then b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,255,0,0 EntityColor b\ent2,255,0,0 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=2 b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,0,0,255 EntityColor b\ent2,0,0,255 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=3 b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,0,255,0 EntityColor b\ent2,0,255,0 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=0 FreeEntity b\box Delete b EndIf End Function Function update_bonus() For b.T_Bonus = Each T_Bonus TranslateEntity b\ent1,-0.1,0,0 TranslateEntity b\box,-0.1,0,0 If EntityCollided(b\box,C_Player) Then If b\kind=1 Gunup = gunup+1 If b\kind=2 shieldup = shieldup+1 If b\kind=3 misup = misup+1 FreeEntity b\ent1 FreeEntity b\box Delete b EndIf Next End Function |
||
DarkDragon-1993 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Okay, heute kann ich nicht mehr lange, deswegen werde ich den Code mit nach Hause nehmen, durchblicken und morgen wiederkommen, in Ordnung? | ||
![]() |
Megamag |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie du willst. ![]() |
||
DarkDragon-1993 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was ich schonmal sagen kann:
Hier weis das Programm nicht, was x, y, z, kind ist, würde ich mal sagen, denn sie sind schließlich "Felder" vom Type T_Bonus. Code: [AUSKLAPPEN] Function create_Bonus(x#,y#,z#,kind) b.T_Bonus = New T_Bonus b\kind=kind b\box = CreateSphere() PositionEntity b\box,x,y,z EntityAlpha b\box,0 EntityType b\box,C_Bonus If kind=1 Then b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,255,0,0 EntityColor b\ent2,255,0,0 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=2 b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,0,0,255 EntityColor b\ent2,0,0,255 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=3 b\ent1 = CreateSphere() b\ent2 = CreateSphere() ScaleEntity b\ent1,.5,.5,.5 ScaleEntity b\ent2,.25,.25,.25 EntityColor b\ent1,0,255,0 EntityColor b\ent2,0,255,0 EntityAlpha b\ent1,.5 EntityParent b\ent2,b\ent1 PositionEntity b\ent1,x,y,z ElseIf kind=0 FreeEntity b\box Delete b EndIf End Function Ich würde das b.T_Bonus = New T_Bonus vor die Funktion setzen, und die Funktion so aufrufen: [code] b.T_Bonus = New T_Bonus function Beispiel( b\x#, b\y#, b\z#, b\kind ) ; Tu was End Function und jetzt muss ich schon off. Vllt hats geholfen? mfG DarkDragon-1993 |
||
![]() |
Megamag |
![]() Antworten mit Zitat ![]() |
---|---|---|
Natürlich sind das Felder von T_Bonus.
Wenn die Funktion aufgerufen wird, steht da ja auch: Code: [AUSKLAPPEN] create_Bonus(50,0,20,1)
oder so, verstehst du? |
||
DarkDragon-1993 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Nein, ich verstehs nicht. Und ich weiß ehrlichgesagt auch nicht, wo das Problem ist...
Muss weitergrübeln ![]() |
||
DarkDragon-1993 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Jetzt hab ichs verstanden, aber das Problem noch immer nicht... | ||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du noch einen Doppelpost machst wirst Du verstehen müssen warum der Thread geschlossen wird.
Benutz bitte den EDIT-Button. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
robotx |
![]() Antworten mit Zitat ![]() |
---|---|---|
Macht es einen Unterschied, wenn man Quell und Zielobjekt vertauscht?
Meiner Meinung nach sollte es doch so heißen Code: [AUSKLAPPEN] If EntityCollided(C_Player, b\box)
mfg robotx |
||
www.botbomb.robotzgames.de
www.robotzgames.de |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kollisionen gehen unter 3D immer nur aus der Bewegung aus, und das auch nur auf die ''Vordreseite'' eines Triangles. Das heisst: Wenn ein Triangle vom Kollisionsobjekt aus gesehen im Uhrzeigersinn gezeichnet wurde und das Triangle als ''kollidierbar'' gekennzeichnet ist. Ausserdem muß sich beispielsweise ein EntityRadius immer von einem Kollisionsfreiem Raum auf eine Fläche zubewegen. Bewegt sich die Kollisionsfläche selbst, kommt es sehr häufig zum ''durchflug'' ohne Kollision.
Soweit ich informiert bin, kann ein geladenes Mesh sowohl normal gezeichnete Triangles als auch nur Kollisionstriangles haben. Damit würde man zum Beispiel sehr detailierte Modelle zeichnen können, wo aber nicht jedes noch so kleine Triangle auf Kollision geprüft werden muß, sondern lediglich eine grobe Struktur des Objektes selbst. Wen dem so ist, dann könnten in deinem Modell Teile davon fehlen. Davon habe ich aber nicht so viel Ahnung. |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group