Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

11

22.02.2007, 09:26

@f-Wölkchen: Wie gesagt die Polygone heraussortieren und schnitttest machen, zu deinem Sliden: du längst einfach eine distanz zur wand fest ab der die kollision true ergibt...

12

22.02.2007, 15:57

Zitat

"Abstoßen" von dem Block in die richtige richtung! (man soll also nicht einfach in den Block hinein kommen! sondern dran entlang sliden!)


Und was soll passieren wenn die kollision true ist??

Gruß Flo

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

13

22.02.2007, 16:51

kollision = true, man kann nicht weiter laufen...

14

22.02.2007, 17:07

Wenn man aber nicht mehr weiterlaufen kannn, dann bleibt das spiel ja stehen!! kannst dich nicht mehr bewegen und hängst vor der wand :-D
rofl
lol

Gruß Flo ;)

big_muff

Alter Hase

Beiträge: 460

Wohnort: Schweiz

Beruf: Informatikstudent (4. Semester)

  • Private Nachricht senden

15

22.02.2007, 17:30

Ich hab mir jetzt nicht angeschaut wie du das gemacht hast, aber ich kann ja mal sagen wie ich das machen würde:

Ich hab mir mal dein Levelformat angekuckt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
******************************
*      *                     *
*      *                     *
*      *****         *********
*          *                 *
*   L      *    L            *
*          *                 *
*                            *
*          *******           *
*     ******     *           *
*      L   *     *      L    *
*          *                 *
******************************

Ich weiss zwar nicht was das L ist aber egal. Du wirst diese Daten wohl irgendwo in einem 2D-Array oder einem entsprechenden Speicherblock haben.

Ich würde jetzt aus der Position des Spieler berechnen in welchem "Block" er sich gerade befindet, der 2D-Index des Blocks sozusagen. Diese Berechnung sollte recht einfach sein, ich weiss jetzt leider nicht wo dein Nullpunkt ist aber es wird irgendetwas wie:

C-/C++-Quelltext

1
2
xIndex=floor(SpielerPosition.X/Laenge_eines_Blocks);
yIndex=floor(SpielerPosition.Z/Laenge_eines_Blocks);

Das machst du mit der alten Position und der neuen Position die der Spieler hätte wenn er uneingeschränkt dahin laufen könnte wo er wollte.

Im allgemeinen wirst du wohl nur einen Block weit kommen in einem Frame aber um allgemein zu bleiben: Diese 2 Position spannen ein Rechteck auf (Hier als # dargestellt. S ist Start. E ist Ende):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
******************************
*      *                     *
*      *######E              *
*      *#######      *********
*       #######              *
*   L   S###### L            *
*          *                 *
*                            *
*          *******           *
*     ******     *           *
*      L   *     *      L    *
*          *                 *
******************************

Besser wäre wohl eine Linie aus # mit dem Linien-Algorithmus aber da man sich sowieso nicht so viele Blöcke bewegt wäre das wohl etwas übertrieben.
Nun prüftst du jeden Block in diesem Rechteck ob da ein Hinderniss ist und wenn ja machst du eine Rechteck-Linie-Kollision die sehr einfach ist. Dann speicherst du den Schnittpunkt, wenn es einen gibt und gehst weiter durch die Blöcke durch. Wenn du einen neuen findest mit dem es einen Schnittpunkt gibt speicherst du den näheren.

Bist du nun durch alle Blöcke im Rechteck durch hast du den Schnittpunkt gefunden.

Um das "entlang sliden" zu realisieren musst du wissen ob der Schnittpunkt in einer Ebene parallel zur X- oder in einer parallel zur Z-Achse liegt. Das ist auch einfach festzustellen, denn wenn er in einer Ebene parallel zu X-Achse liegt ist die Z-Koordinate des Schnittpunktes durch die Länge eines Blocks (bis auf eine sehr kleine Ungenauigkeit) ein Ganzzahlwert.

In jedem Fall setzt du die alte Position nun auf den Schnittpunkt.
Liegt jetzt der Schnittpunkt auf einer Ebene parallel zu X-Achse heisst das das du nun nur noch entlagn der X-Achse entlang gleitest. Die neue Position hat nun also die Z-Koordinate der alten Position aber die X-Koordinate der Position die ursprünglich das Ziel war. Analog kannst du dir das wohl auch für einen Punkt parallel zur Z-Achse denken.

Diese alte und neue Position die du jetzt hast musst du leider noch mal durch die ganze Kollisionsroutine laufen lassen, da während dem entlang gleiten durchaus noch eine Kollision stattfinden könnte. Du kannst die neue Position übernehmen sobald:
a.) keine Kollision aufgetreten ist oder
b.) Die alte Position gleich der neuen ist (dann steht du senkrecht vor einer Wand)

Leider wird das nicht die gewünschten Ergebniss liefern, da du so in die Würfel hineinsehen wirst wenn du an ihnen entlang gleitest. Um das zu beheben musst du bei der Rechteck-Linien-Kollision die Ausmasse des Rechtecks ein wenig vergrössern (um ein wenig mehr als die Near Clipping plane), ausserdem musst du alle Blöcke in einem ein wenig grösserem Rechteck prüfen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
******************************
*      *########             *
*      *######E#             *
*      *########     *********
*       ########             *
*   L   S#######L            *
*          *                 *
*                            *
*          *******           *
*     ******     *           *
*      L   *     *      L    *
*          *                 *
******************************

Wenn du dich nach oben rechts bewegst musst du oben und rechts eine Linie anhängen, da du sonst den Hindernis-Blöcken zu nahe treten könntest.

Puh, Fertig!!!

Ich weiss jetzt nicht ob das die beste Lösung ist, aber es müsste so funktionieren.
Nur Idioten halten Ordnung, ein Genie beherrscht das Chaos.[size=7]

[/size]HardFate - Ein Start, Ein Ziel, Viele Wege[size=7]

[/size]Ein Mitglied der VEGeiCoUndGraSonMaWiGeS Bewegung.

16

24.02.2007, 19:51

Ufff....
Das ist schon recht viel! ;)
Es geht aber auch bestimmt einfacher! (zwar langsamer aber einfacher!)
Also hier nochmal meine idee:

Man hat eine Kiste:

1*****2
* *
* *
4*****3

Jetzt prüft man zuerst ob man mit einer Kiste kollidiert:

C-/C++-Quelltext

1
2
3
4
5
6
7
if (Kz<z1 &&
    Kz>z3 &&
    Kx<x3 &&
    Kx>x1)
{
//Kollision

 }


Hier ist K=Kamera

Dann guckt man aufwelcher seite man sich befindet!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if (Kx<x && Kz>z4 && Kz<z1)
{
//links von der kiste

}
if (Kx>x && Kz>z4 && Kz<z1)
{
//rechts von der kiste

}
if (Kz>z && Kx>x1 && Kx<x2)
{
//dahinter

}
if (Kz>z && Kx>x1 && Kx<x2)
{
//davor

}


So! Wenn man nun die Seiten weißt, dann braucht man doch nur noch nach hinten lenken, wobei der Blickvector nicht mit einbezogen werden draf!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
if (Kz<z1 && 
    Kz>z3 && 
    Kx<x3 && 
    Kx>x1) 
{ 

if (Kx<x && Kz>z4 && Kz<z1) 
{ 
Position.x  -= 14.1424 * speed;
Position.z  -= 0.124537 * speed;
Richtung.x  -= 14.1424 * speed;
Richtung.z  -= 0.124537 * speed; 

into_Logbuch("Seite 1",true);
}else{ 
if (Kx>x && Kz>z4 && Kz<z1) 
{ 
Position.x  += 14.1424 * speed;
Position.z  += 0.124537 * speed;
Richtung.x  += 14.1424 * speed;
Richtung.z  += 0.124537 * speed; 
into_Logbuch("Seite 2",true);
}else{ 
if (Kz>z && Kx>x1 && Kx<x2) 
{ 
Position.x  -= -14.142 * speed;
Position.z  -= -0.0367136 * speed;
Richtung.x  -= -14.142 * speed;
Richtung.z  -= -0.0367136 * speed;  
into_Logbuch("Seite 3",true);
}else{ 
if (Kz>z && Kx>x1 && Kx<x2) 
{ 
Position.x  += -14.142 * speed;
Position.z  += -0.0367136 * speed;
Richtung.x  += -14.142 * speed;
Richtung.z  += -0.0367136 * speed; 
into_Logbuch("Seite 4",true);
}
}
}
}
 
}


Ich habs noch nicht probiert, werd es aber jetzt mal ;)
Die idee kam mir gerade als ich dein post gelesen habe :-D
Naja...
Gruß Flo

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

17

24.02.2007, 20:24

@ F-Wölkchen
gehört jetzt nicht zum thema, aber das du in gl programmierst habe ich mal ne frage. was macht diese funktion: glTranslatef.
mit welcher direct3d funktion ist die zu vergleichen?

18

24.02.2007, 21:48

Da gibt es glaub ich keine funktion in direktx.
sie transformiert ein objekt.
Man muss nicht gleich mir matrizen arbeiten.
da gibt es verschiedene funktionen:

glTranslatef (transformieren), glRotatef (rotieren), glScalef (Skalieren)

Es erleichtert die arbeit um einiges!

Gruß Flo

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

19

24.02.2007, 22:27

ok danke. ich denke in direct3d muss ich das mit matrizen dan handeln.

Werbeanzeige