Kollisionen erstellen
Übersicht

blitzkingBetreff: Kollisionen erstellen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi,
bin grad dabei ein kleines Spiel zu programmieren, weiß aber nicht wie das mit den Kollisionen geht Könnte mir einer mal kurz erklären, wie man eine einfache Kolllision erstellt ![]() |
||
masterman123 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
den objekten type zuweisen so
Code: [AUSKLAPPEN] entitytype bla bla,1
und dann collisions 1,2,2,1(stoppen)/2(sliden)/3(nachobensliden) oder collisions 2,1,2,... |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Collisions![]() ![]() ![]() |
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
blitzking |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
ich habe es probiert wie ihr gesagt habt aber die kugel gehtimmer durch dass andere objaekt hindurch
Code: [AUSKLAPPEN] Graphics3D 640,480,32,2
SetBuffer BackBuffer() cam=CreateCamera() light=CreateLight() tex_2=LoadTexture("C:\Program Files\Blitz3D Demo\samples\firepaint3d\blitzlogo.bmp") cone=CreateCone() PositionEntity cone,0,2,6 EntityType cone,2 cylinder=CreateSphere() PositionEntity cylinder,0,-2,5 EntityTexture cylinder,tex_2 EntityType cylinder,2 Collisions 1,2,2,1 While Not KeyDown(1) If KeyDown( 200 )=True Then MoveEntity cylinder,0,0,0.1 If KeyDown( 208 )=True Then MoveEntity cylinder,0,0,-0.1 If KeyDown( 203 )=True Then MoveEntity cylinder,-0.1,0,0 If KeyDown( 205 )=True Then MoveEntity cylinder,0.1,0,0 If KeyDown( 30 )=True Then MoveEntity cylinder,0,0.1,0 If KeyDown( 44 )=True Then MoveEntity cylinder,0,-0.1,0 If KeyDown( 16 )=True Then pitch#=pitch#+1 RotateEntity cylinder,pitch#,h,l HidePointer RenderWorld Flip Wend End |
||
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Du hast beiden Objekten den selben Type gegeben. Gib dem "cylinder" mal den Type 1. | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
Eingeproggt |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo hast du denn UpdateWorld![]() |
||
Gewinner des BCC 18, 33 und 65 sowie MiniBCC 9 |
blitzking |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Danke ![]() |
||
KhanLeoBetreff: wie Prüfung auf unterschiedliche Kollisionen vereinfachen ? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hi Blitzer,
ich würde gerne eure Meinung zu folgendem Problem hören : ich baue einen Weltraum-Shooter, bei dem alle Schiffe Schutzschilde haben. Daraus ergeben sich nach meinem Modell folgende Kollisionskombinationen : 1. Schutzschild - Schuß 2. Schutzschild - Schutzschild 3. Schiff - Schuß 4. Schiff - Schiff (5. Schutzschild - Schiff soll es nicht geben) Schiffe, Schutzschilde und Schüsse sind in Types angelegt. Ich habe die Kollisionsabfrage von B3D jetzt so verstanden, dass ich nicht direkt rausfinden kann, welche zwei Objekte gerade kollidiert sind, sondern durch alle Kollisionsobjekte laufen und diese auf Kollisionen überprüfen muß, richtig ? Daher sieht meine bisherige Lösung so aus : Code: [AUSKLAPPEN] <Pseudo-Code> Global colShield = 1 Global colShip = 2 Global colShot = 3 Collisions colShield, colShot, 2, 1 Collisions colShield, colShield, 2, 2 Collisions colShip, colShot, 2, 1 Collisions colShip, colShip, 2, 2 ... For each tSchutzschild If EntityCollided(tSchutzschild, colShot) True Then fctTreffer End If next For each tSchutzschild If EntityCollided(tSchutzschild, colShield) True Then fctKollision End If next For each tSchiff If EntityCollided(tSchiff, colShot) True Then fctTreffer End If next For each tSchiff If EntityCollided(tSchiff, colSchiff) True Then fctKollision End If next ... Wenn ich jetzt z.B. nur zwei Kollisionen in einem Durchlauf habe, muß ich bei z.B. 20 Raumschiffen insgesamt 4 x 20 = 80 Überprüfungen durchführen ?! Daher meine Frage : geht das nicht effizienter ? Denn wenn sich z.B. die Objektanzahl erhöht oder ich zusätzliche Objekt-Types (Asteroiden o.ä.) zum kollidieren einbringen will, steigt der Aufwand ja immens ! Freue mich auf eure Denkanstöße ! Lars |
||
![]() |
Johannes´ |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bevor du auf Kollision prüfst, kannst du ja mit EntityDistance prüfen, ob eine Kollision überhaupt möglich ist, also ob die Objekte dafür nah genug beieinander sind. Das würde, denke ich, den Rechenaufwand um einiges senken. | ||
![]() |
XeresModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
EntityCollided![]() Ich glaub eigentlich nicht, dass die Kollision selbst so ineffizient abläuft, dass man sich wegen ein paar Objekten sorgen machen müsste. |
||
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) |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
An KhanLeo :
Du könntest es auch einfacher machen. In meinem Weltraumspiel haben die Schiffe nur eine Kollisionskugel die sowohl für die Schilder, als auch für das Schiffskörper gelten. Die Schilder sind ja recht nahe an dem Schiffskörper dran, die unterscheiden sich in Form und Ausdehnung nicht zu stark. Der Mensch sieht es doch nicht, ob ein Schuss der schnell ankommt tatsächlich den Schild oder den Rumpf darunter trifft. Wichtig ist nur, daß du eine Variable hast, die besagt, ob die Schilder aktiv oder aus sind. Wenn die Schilder aktiv sind, dann nimmt das Schiffskörper keinen Schaden, nur die Stärke der Schilder wird reduziert (und wird passende Treffer-Grafik Effekt und Sound abgespielt). Wenn die Shilds down sind, dann wird der Schaden aus den Hitpoints des Rumpfes abgezogen (und wird passende Treffer-Grafik Effekt und Sound abgespielt). . Das ist alles. Du brauchst kein extra Kollisionsobjekt für Schilder und Rumpf. Das einzige Kollisionsobjekt gilt für das gesamte Schiff allgemein. P.S.: Ich sollte noch erwähnen, daß ich inzwischen nicht nur echte Kollision für die Schiffe habe. Die echte Kollision (muß immer Sphere sein, wegen Bewegung) wird nur dazu verwendet, zu prüfen, ob das Schiff mit einem anderen Schiff oder mit der Umgebung kollidiert. Für Treffer durch Schüsse verwende ich eine "virtuelle" Kollisions Box. Keine echte Collision. Ich prüfe nur, ob ein Schuss sich innerhalb einer Collision Box eines Schiffes befindet oder nicht. Wenn ja, dann wurde das Schiff getroffen. Das hat den großen Vorteil, daß die oft längliche Schiffe durch einen langgezogenen Collision Box viel besser erfaßt werden können, als durch eine Kugel. Und es gab noch einen wichtigen Grund dafür, aber der fällt mir gerade nicht ein ![]() |
||
Blitzjockey |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Omenaton_2 hat Folgendes geschrieben: Und es gab noch einen wichtigen Grund dafür, aber der fällt mir gerade nicht ein
![]() Womöglich das bekannte "2 bewegende Objekten"-Problem? Das heisst, wenn sich, während 1 "UpdateWorld" 2 Objekten bewegen (Der Schuss und das Schiff) dann ist es theoretisch möglich das es von B3D nicht erfasst wird. Im Position 1 befinden sich beide noch "weit" auseinander, im Position 2 (das heisst, nach der UpdateWorld) befindet sich auf grund hoher Geschwindigkeit das Schuss-Objekt schon innerhalb das Schild/Schiff, und B3D registriert es schon nicht mehr als Kollision, da sich beide nicht schneiden. |
||
KhanLeo |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo zusammen,
vielen Dank für eure zahlreichen Vorschläge ! Das mit der Schildvariable und den Sounds etc. hatte ich schon eingerichtet. Ich dachte halt, ich brauche eine Extra-Form, weil bei manchen Schiffen eine Kugel einen zu großen Freiraum zum Mesh umschließen würde (z.B. ein Sternzerstörer mit seinen hohen Aufbauten und seiner langen Form). Aber wenn das menschliche Auge dem Geschehen gar nicht so schnell folgen kann, dann werde ich mich mal der Methode von Omenaton_2 anschließen. Ich habe nur diese "virtuelle Kollisionsbox" noch nicht ganz verstanden : legst du ein echtes Box-Mesh um das Schiff-Mesh, oder definierst du einen Bereich, der dann überprüft wird ? Wie erstellst du diesen Bereich und was prüfst du dabei ? Danke schon mal für die Hilfe ! mfg Lars |
||
Blitz3D 1.94
Milkshape 1.8.5 BenQ Joybook S73G mit ATi Radeon Mobility X1600 // WinXP SP3, ATi Catalyst 9.2 |
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
KhanLeo hat Folgendes geschrieben: Hallo zusammen,
Ich habe nur diese "virtuelle Kollisionsbox" noch nicht ganz verstanden : legst du ein echtes Box-Mesh um das Schiff-Mesh, oder definierst du einen Bereich, der dann überprüft wird ? Wie erstellst du diesen Bereich und was prüfst du dabei ? Nein, kein echtes Box-Mesh. Deshalb schreibe ich "virtuell", also nicht wirklich existierend. Ich definiere nur einen Bereich. Dazu gebe ich die Breite, Höhe und Tiefe der Box an und zusätzlich eine eventuelle Verschiebung der Platzierung. (Normaler weise wird diese Box exakt dahin platziert, wo auch das Hauptschiffskörper platziert ist, es kann aber nützlich werden diesen Box etwas noch zu verschieben, vor allem in der Höhe.) Dann wird laufend (es reicht nur ein Mal ca alle 100ms) gecheked, ob einer der Schüsse innerhalb des definierten Kollisionsbereiches eines Schiffes liegt oder nicht. Es wird rein nach Koordinaten gechecked. Bei einer Box sind eigentlich nur 2 schräg gegenüber liegende Eckpunkte wichtig. Wenn man die kennt, kennt man alle Anderen und die Seiten auch. (Die nenne ich "VCB_Punkt_1" und "VCB_Punkt_7".) Hier ist ein Stück Code für den Check: Code: [AUSKLAPPEN] For StatObj.STATIC_OBJ = Each STATIC_OBJ
Enemies% = NEIN If StatObj\SchonDestroyed = NEIN And StatObj\Life_State = 1 Then VCB_Punkt_1_X# = EntityX(StatObj\CollBoxMESH, 1) - StatObj\CollisionBox_Width + StatObj\CollisionBox_X_Diff VCB_Punkt_1_Y# = EntityY(StatObj\CollBoxMESH, 1) + StatObj\CollisionBox_Height + StatObj\CollisionBox_Y_Diff VCB_Punkt_1_Z# = EntityZ(StatObj\CollBoxMESH, 1) + StatObj\CollisionBox_Depth + StatObj\CollisionBox_Z_Diff VCB_Punkt_7_X# = EntityX(StatObj\CollBoxMESH, 1) + StatObj\CollisionBox_Width + StatObj\CollisionBox_X_Diff VCB_Punkt_7_Y# = EntityY(StatObj\CollBoxMESH, 1) - StatObj\CollisionBox_Height + StatObj\CollisionBox_Y_Diff VCB_Punkt_7_Z# = EntityZ(StatObj\CollBoxMESH, 1) - StatObj\CollisionBox_Depth + StatObj\CollisionBox_Z_Diff Drin% = NEIN If EntityX(Shot2\Mesh_1, 1) > VCB_Punkt_1_X# And EntityX(Shot2\Mesh_1, 1) < VCB_Punkt_7_X# Then If EntityY(Shot2\Mesh_1, 1) < VCB_Punkt_1_Y# And EntityY(Shot2\Mesh_1, 1) > VCB_Punkt_7_Y# Then If EntityZ(Shot2\Mesh_1, 1) < VCB_Punkt_1_Z# And EntityZ(Shot2\Mesh_1, 1) > VCB_Punkt_7_Z# Then If SHOTAllg_HerausgeberObjID <> StatObj\ID Then ; Nicht von eigenem Shot treffen lassen Drin = JA ShotSollWeg = JA Gosub DoShotColl_ToStatObj Exit EndIf EndIf EndIf EndIf EndIf Next If Drin = JA Then Return If PlayerShip\SchiffGrafischNichtDa = JA Or SterbePhase > 0 Then Return ;--- Check für Player Ship ----------------------------------------------------------------------- Bei Check für Player Ship wird das so ähnlich gemacht, nur hat das PlayerShip andere Struktur als die Static Objects, die bei mir eine veraltete Bezeichnung für die komplexe bewegliche Objekte wir die Gegner Raumschiffe ist. Noch eine Anmerkung. Nur vorübergehend erstelle ich tatsächlich eine gut sichtbare Box an den angegeeben Koordinaten und mit den agegebenen Maßen, nur um sehen zu können, ob ich die Maßen auch richtig eingeschätzt habe. Diese Zeilen in denen eine echte Box erstellt wird werden dann umgehend auskommentiert. |
||
Siggi |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bei den blitz3d samples gipt es auch ein beispiel | ||
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Siggi, achte beim Antworten auf Beiträge unbedingt darauf, wie alt diese Bereits sind. Die letzte Antwort hier kam im August, vor vier Monaten. Bei solchen Zeitspannen kann man i.d.R. davon ausgehen, dass es
a) gelöst wurde (wenn auch vom Fragesteller selbst) oder b) es ihn nicht mehr interessiert. Melde dich also möglichst nur zu Wort, wenn das Thema noch eine gewisse Aktualität aufweist. mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group