COllision nur an Vorderkante

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

Megamag

Betreff: COllision nur an Vorderkante

BeitragMi, Jun 18, 2008 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 18, 2008 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Bissl mehr Code wär tatsächlich net schlecht. Dann könnten wir zu zweit an einer Lösung grübeln Smile

Megamag

BeitragMi, Jun 18, 2008 12:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 18, 2008 12:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, heute kann ich nicht mehr lange, deswegen werde ich den Code mit nach Hause nehmen, durchblicken und morgen wiederkommen, in Ordnung?

Megamag

BeitragMi, Jun 18, 2008 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie du willst. Smile
 

DarkDragon-1993

BeitragMi, Jun 18, 2008 12:30
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Jun 18, 2008 12:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 27, 2008 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, ich verstehs nicht. Und ich weiß ehrlichgesagt auch nicht, wo das Problem ist...
Muss weitergrübeln Very Happy
 

DarkDragon-1993

BeitragFr, Jun 27, 2008 12:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Jetzt hab ichs verstanden, aber das Problem noch immer nicht...

BladeRunner

Moderator

BeitragFr, Jun 27, 2008 12:10
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Jun 27, 2008 13:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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

hectic

Sieger des IS Talentwettbewerb 2006

BeitragFr, Jun 27, 2008 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
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

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group