[B3d] Kollisionstutorial

Übersicht BlitzBasic FAQ und Tutorials

Neue Antwort erstellen

 

FBI-blitz

Betreff: [B3d] Kollisionstutorial

BeitragMo, März 07, 2005 18:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Kleines Tutorial für 3D-Kollisionen für Anfänger:



Um eine Kollisionsabfrage in einem 3D-Spiel funktionsfähig hinzukriegen, werden folgende Befehle benötigt:
Code: [AUSKLAPPEN]
Entitytype
Collisions
Countcollisions
Entityradius
Text
Updateworld
Renderworld
Flip

Etc.
Erst erstellen wir die Kamera und ein Licht:
Code: [AUSKLAPPEN]
GRAPHICS3D 640,480
SETBUFFER BACKBUFFER()
camera=CREATECAMERA()
ROTATEENTITY camera,45,0,0
POSITIONENTITY camera,0,15,-10
light=CREATELIGHT()
ROTATEENTITY light,45,0,0

Diese Befehle müsstest du eigentlich kennen!
Dann erstellen wir drei Objekte: Eine Kugel, einen Würfel und einen Zylinder::
Code: [AUSKLAPPEN]

sphere=CREATESPHERE(32) ;Kugel erstellen
POSITIONENTITY sphere,0,11,0 ;Positionieren

cube=CREATECUBE()
 
ENTITYCOLOR cube,0,100,0
POSITIONENTITY cube,0,-5,0
SCALEENTITY cube,10,10,10

cylinder=CREATECYLINDER(32)
 ENTITYCOLOR cylinder,255,0,0
POSITIONENTITY cylinder,0,7,0
SCALEENTITY cylinder,2,2,2


Die Kugel stellt hier den Spieler dar. Jetzt kommen wir zu den neuen Befehlen:

Mit ENTITYTYPE wird dem Objekt ein Typ zugewiesen. Dieser wird nachher bei der kollisionsabfrage noch gebraucht. Also:
Code: [AUSKLAPPEN]
ENTITYTYPE sphere,1
ENTITYTYPE cube,2
ENTITYTYPE cylinder,2


Der erste Parameter ist das Objekt, der zweite der Typ. Du könntest auch 2642 oder eine x-beliebige Zahl nehmen. Währe aber unübersichtlicher...
Jetzt müssen wir noch die Reichweite festlegen, d.h., in welcher Entfernung das Objekt kollidiert. Stell dir den Radius wie ein Schutzschild vor. Den Radius legst du mit entityradius fest:
Code: [AUSKLAPPEN]
ENTITYRADIUS sphere,1

Erster Parameter: Objekt, der zweite ist der Radius!

Jetzt kommen wir zur Hauptschleife. Mit den Pfeiltasten kann man die Kugel bewegen:
Code: [AUSKLAPPEN]
WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   UPDATEWORLD
   RENDERWORLD
   FLIP
WEND
END


Soweit, so gut. Und jetzt kommen wir zur Kollision:
Wir brauchen einen Befehl, der überprüft, ob zwei Objekte miteinander kollidieren. Der heißt collisions. Er überprüft aber nicht die Kollision zwischen zwei Objekten, sondern zwischen zwei Typen. Die hast du vorher festgelegt (mit entitytype). Der Befehl überprüft also, ob also ein Objekt mit dem einen Typ mit einem Objekt mit dem zweiten Typ kollidiert. Zwei Parameter haben wir schon mal: den ersten (Typ 1) und den zweiten (Typ 2). Als dritter wird die Methode gewählt. Folgende stehen zur auswahl:

1=Kugel-Kugel-Kollision
2=Kugel-Polygon-Kollision
3=Kugel-Würfel-Kollision

Diese erkläre ich jetzt nicht, da wir immer den 2. verwenden werden!
Und der vierte Parameter gibt an, was passieren soll, wenn eine Kollision stattfindet!
Folgende Reaktionen stehen zur auswahl:

1=stoppen
2=sliden (normal)
3=sliden (nur raufsliden)

Stoppen ist klar. Sliden bedeutet, dass das kollidierende Objekt (Typ 1) sich einen Weg an dem Objekt vorbeisucht.
Kleine Anmerkung: In BB selbst gibt es KEINE Möglichkeit zu wählen, dass nach einer Kollision gar nichts passieren soll.
Wir verwenden nur Parameter 1. Schon haben wir den Befehl collisions erarbeitet:
Code: [AUSKLAPPEN]
COLLISIONS 1,2,2,1

Entspricht: Kollidiert ein Objekt mit Typ 1 (In diesem Fall Kugel) mit einem Objekt mit Typ 2 (in diesem Fall Würfel und Zylinder), und zwar über die Kugel-Polygon-Methode, dann stoppt der Typ 1.

Das bauen wir jetzt nur noch in die Schleife ein:
Code: [AUSKLAPPEN]
WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   COLLISIONS 1,2,2,2
   UPDATEWORLD
   RENDERWORLD
   FLIP
WEND
END

Ganz wichtig hier aber: Das Updateworld. Nur so wird richtig überprüft.

Jetzt kommt etwas kompliziertes: Der Index-Wert. Natürlich können während eines Schleifendurchlaufs mehrere Kollisionen stattfinden. Jeder Kollision wird eine Nummer zugewiesen. Diese bezeichnet man auch als Index. Die Anzahl der Kollisionen ermittelt man mit countcollisions. Wenn dieser Befehl z.B. 5 zurückgibt, wissen wir, dass 5 Kollisionen stattgefunden haben. Und die erste hat den Index 1, die zweite 2, die dritte 3, die vierte 4 und die fünfte eben 5! Jetzt können wir auch ganz leicht rausfinden, mit welchem Objekt genau die Kugel kollidiert hat: Mit collisionentity. Als Parameter geben wir erstens das Ursprungsobjekt (Typ1 – Kugel) an, und als zweiten den Index. Um auch alle Kollisionen zu erfassen, machen wir das ganze in einer Schleife:
Code: [AUSKLAPPEN]
   col=COUNTCOLLISIONS(sphere)
   TEXT 0,0,"Anzahl Kollisionen: "
   FOR index=1 TO col
      TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,index)
   NEXT

Das Programm sagt sooft, wie es Kollisionen gibt, das jeweilige Objekt. Das bauen wir auch noch in die Hauptschleife ein:
Code: [AUSKLAPPEN]
WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   COLLISIONS 1,2,2,2
   UPDATEWORLD
   RENDERWORLD
   col=COUNTCOLLISIONS(sphere)
   TEXT 0,0,"Kollision(en):"
   FOR i=1 TO col
      TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,i)
   NEXT
   FLIP
WEND
END


Und fertig.
Jetzt könnt ihr das alles in den BB-Editor kopieren und laufen lassen! (Nicht vergessen, das wo die Objekte erstellt werden und der Radius sowie der Typ zugewiesen wird, mitzunehmen!)


FBI-blitz
  • Zuletzt bearbeitet von FBI-blitz am Mo, Apr 17, 2006 19:17, insgesamt einmal bearbeitet
 

morszeck

BeitragMo, März 07, 2005 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Bitte folgendes:

- immer den kompletten Quellcode oder Tutorial hier posten und nicht ein Link zu einem Zip

- keine Word oder sonstige macroverseuchte Formate verwenden. Auch hat nicht jeder Word...

Danke

Unplugged

BeitragSa, Jul 30, 2005 18:01
Antworten mit Zitat
Benutzer-Profile anzeigen
- immer den kompletten Quellcode oder Tutorial hier posten und nicht ein Link zu einem Zip
- keine Word oder sonstige macroverseuchte Formate verwenden. Auch hat nicht jeder Word...

Wieso diese seltsamen Regeln?
User posted image

Kryan

BeitragSa, Jul 30, 2005 18:36
Antworten mit Zitat
Benutzer-Profile anzeigen
mein word funktioniert nicht - also hat er recht mit den regeln
außerdem lade ich mir nich ne zip runter...zu aufwendig

ER HAT VOLLKOMMEN RECHT !!!!!!!!! ^^
Webspaceanbieter?
Klick hier!
Kultige Spieleschmiede?
Klick hier!

wunderkind

BeitragSa, Jul 30, 2005 18:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Man muss es ja nicht gleich so schroff ausdrücken wie Kryan. Aber bitte poste den Quellcode doch tatsächlich hier im Klartext. Dieser Forenbereich hat schließlich auch Archiv- und Nachschlagecharakter. Wenn du eines Tages deine Zip-Datei vom Server entfernst, dann können die Besucher des Forums das Tutorial nicht mehr lesen.

Selbstverständlich ist es kein Problem, wenn du den Link oder sonstige Verweise zusätzlich angibst.


Viele Grüße
Dein Blitzforum.de Service Team

Klip

BeitragSo, Sep 04, 2005 20:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Link funktioniert leider nicht mehr.

Kannst du das Tutorial nicht nochmal neu hochladen?
 

IonPainter

BeitragMo, Sep 05, 2005 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
wunderkind hat Folgendes geschrieben:
Wenn du eines Tages deine Zip-Datei vom Server entfernst, dann können die Besucher des Forums das Tutorial nicht mehr lesen.


wie Recht er hatte... Rolling Eyes

Goodjee

BeitragDi, Feb 07, 2006 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
ja, gib mal nen neuen link, ode poste den code, das könnte ich mal gebrauchen.....sofern es gut ist. Laughing
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

Blitzard

BeitragDo, Feb 16, 2006 16:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Übrigens is der Link 404
User posted image

Goodjee

BeitragDo, Feb 16, 2006 16:27
Antworten mit Zitat
Benutzer-Profile anzeigen
http://www.igelgames.de/blitzb...lision.htm

habe nett nachgefragt...und schon ne PN bekommen, aber vllt bracuht das ja noch einer.
"Ideen sind keine Coladosen, man kann sie nicht recyclen"-Dr. House
http://deeebian.redio.de/ http://goodjee.redio.de/

otta

BeitragDo, Feb 16, 2006 22:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Also ich poste jetzt einfach mal den Code hier rein weil ein htm file genauso schnell verschwinden kann wie ein zip Wink .

Code: [AUSKLAPPEN]

;KOLLISION
;
;
;
;Um eine Kollisionsabfrage in einem 3D-Spiel funktionsfähig hinzukriegen, werden folgende Befehle benötigt:
;
;

Entitytype

Collisions

Countcollisions

Entityradius

Text

Updateworld

Renderworld

Flip

;Etc.
;
;
;
;
;
;Erst erstellen wir die Kamera und ein Licht:
;
;

GRAPHICS3D 640,480
SETBUFFER BACKBUFFER()
camera=CREATECAMERA()
ROTATEENTITY camera,45,0,0
POSITIONENTITY camera,0,15,-10
light=CREATELIGHT()
ROTATEENTITY light,45,0,0

 
;
;Diese Befehle müsstest du eigentlich kennen!
;
;
;
;Dann erstellen wir drei Objekte: Eine Kugel, einen Würfel und einen Zylinder::
;
 

sphere=CREATESPHERE(32) ;Kugel erstellen
POSITIONENTITY sphere,0,11,0 ;Positionieren

cube=CREATECUBE()
 
ENTITYCOLOR cube,0,100,0
POSITIONENTITY cube,0,-5,0
SCALEENTITY cube,10,10,10

cylinder=CREATECYLINDER(32)
 ENTITYCOLOR cylinder,255,0,0
POSITIONENTITY cylinder,0,7,0
SCALEENTITY cylinder,2,2,2

 
;
;Die Kugel stellt hier den Spieler dar. Jetzt kommen wir zu den neuen Befehlen:
;
;Mit ENTITYTYPE wird dem Objekt ein Typ zugewiesen. Dieser wird nachher bei der kollisionsabfrage noch gebraucht. Also:
;
 

ENTITYTYPE sphere,1

ENTITYTYPE cube,2

ENTITYTYPE cylinder,2

 
;
;Der erste Parameter ist das Objekt, der zweite der Typ. Du könntest auch 2642 oder eine x-beliebige Zahl nehmen. Währe aber unübersichtlicher...
;
;
;
;Jetzt müssen wir noch die Reichweite festlegen, d.h., in welcher Entfernung das Objekt kollidiert. Stell dir den Radius wie ein Schutzschild vor. Den Radius legst du mit entityradius fest:
;
 
ENTITYRADIUS sphere,1

 
;
;Erster Parameter: Objekt, der zweite ist der Radius!
;
;
;
;Jetzt kommen wir zur Hauptschleife. Mit den Pfeiltasten kann man die Kugel bewegen:
;
 

WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   UPDATEWORLD
   RENDERWORLD
   FLIP
WEND
END

 

 

;
;
;Soweit, so gut. Und jetzt kommen wir zur Kollision:
;
;
;
;Wir brauchen einen Befehl, der überprüft, ob zwei Objekte miteinander kollidieren. Der heißt collisions. Er überprüft aber nicht die Kollision zwischen zwei Objekten, sondern zwischen zwei Typen. Die hast du vorher festgelegt (mit entitytype). Der Befehl überprüft also, ob also ein Objekt mit dem einen Typ mit einem Objekt mit dem zweiten Typ kollidiert. Zwei Parameter haben wir schon mal: den ersten (Typ 1) und den zweiten (Typ 2). Als dritter wird die Methode gewählt. Folgende stehen zur auswahl:
;
;1=Kugel-Kugel-Kollision
;2=Kugel-Polygon-Kollision
;3=Kugel-Würfel-Kollision
;
;Diese erkläre ich jetzt nicht, da wir immer den 2. verwenden werden!
;
;Und der vierte Parameter gibt an, was passieren soll, wenn eine Kollision stattfindet!
;
;Folgende Reaktionen stehen zur auswahl:
;
;1=stoppen
;2=sliden (normal)
;3=sliden (nur raufsliden)
;
;Stoppen ist klar. Sliden bedeutet, dass das kollidierende Objekt (Typ 1) sich einen Weg an dem Objekt vorbeisucht.
;
;Wir verwenden nur Parameter 1. Schon haben wir den Befehl collisions erarbeitet:

COLLISIONS 1,2,2,1

 

;Entspricht: Kollidiert ein Objekt mit Typ 1 (In diesem Fall Kugel) mit einem Objekt mit Typ 2 (in diesem Fall Würfel und Zylinder), und zwar über die Kugel-Polygon-Methode, dann stoppt der Typ 1.
;
;
;
;Das bauen wir jetzt nur noch in die Schleife ein:
;
 

WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   COLLISIONS 1,2,2,2
   UPDATEWORLD
   RENDERWORLD
   FLIP
WEND
END

 

;Ganz wichtig hier aber: Das Updateworld. Nur so wird richtig überprüft.
;
;Jetzt kommt etwas kompliziertes: Der Index-Wert. Natürlich können während eines Schleifendurchlaufs mehrere Kollisionen stattfinden. Jeder Kollision wird eine Nummer zugewiesen. Diese bezeichnet man auch als Index. Die Anzahl der Kollisionen ermittelt man mit countcollisions. Wenn dieser Befehl z.B. 5 zurückgibt, wissen wir, dass 5 Kollisionen stattgefunden haben. Und die erste hat den Index 1, die zweite 2, die dritte 3, die vierte 4 und die fünfte eben 5! Jetzt können wir auch ganz leicht rausfinden, mit welchem Objekt genau die Kugel kollidiert hat: Mit collisionentity. Als Parameter geben wir erstens das Ursprungsobjekt (Typ1 – Kugel) an, und als zweiten den Index. Um auch alle Kollisionen zu erfassen, machen wir das ganze in einer Schleife:
;
 

   col=COUNTCOLLISIONS(sphere)
   TEXT 0,0,"Anzahl Kollisionen: "
   FOR index=1 TO col
      TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,index)
   NEXT

 

;Das Programm sagt sooft, wie es Kollisionen gibt, das jeweilige Objekt. Das bauen wir auch noch in die Hauptschleife ein:
;
 

 

WHILE NOT KEYDOWN(1)
   x#=0
   y#=0
   z#=0
   IF KEYDOWN(203)=1 THEN x#=-0.1
   IF KEYDOWN(205)=1 THEN x#=0.1
   IF KEYDOWN(208)=1 THEN z#=-0.1
   IF KEYDOWN(200)=1 THEN z#=0.1
   MOVEENTITY sphere,x#,-0.1,z#
   COLLISIONS 1,2,2,2
   UPDATEWORLD
   RENDERWORLD
   col=COUNTCOLLISIONS(sphere)
   TEXT 0,0,"Kollision(en):"
   FOR i=1 TO col
      TEXT 000,i*20,"Entity="+COLLISIONENTITY(sphere,i)
   NEXT
   FLIP
WEND
END

 
;
;Jetzt sind wir fertig.
;
;
;
;
;
;Jetzt könnt ihr das alles in den BB-Editor kopieren und laufen lassen! (Nicht vergessen, das wo die Objekte erstellt werden und der Radius sowie der Typ zugewiesen wird, mitzunehmen!)
;
;
;
;Noch Fragen? Bitte an: fabian.beutel@igelgames.de


viel Spaß
AthlonXP 2800+, Radeon 9600XT,160GBHDD,512 MB DDR Ram (neuer Rechner neues Glück;))

Aktuelles Projekt:
momentan Projektlos

Neue Antwort erstellen


Übersicht BlitzBasic FAQ und Tutorials

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group