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

@zimmer

Alter Hase

  • »@zimmer« ist der Autor dieses Themas

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

1

05.08.2017, 23:11

Algorithmus um an Objekten vorbei zu gleiten

Hallo wie Ihr bestimmt schon mitbekommen habt, arbeite ich wieder an einem Spiel. 'Trouble World' (Engine Game Maker: Studio)

Das Problem ist dass, mein Charakter beim kollidieren mit anderen Objekten einfach stecken bleibt, aber ich möchte dass er am Hindernis vorbei gleitet.

In den letzten Projekten habe ich die beweglichen Object in die gegen Richtung abprallen lassen, leider fängt die Figur an wie ein Gummiball an zu Zittern und hüpft sozusagen an dem Hindernis entlang.

könnt Ihr mir was empfehlen?

@zimmer

Alter Hase

  • »@zimmer« ist der Autor dieses Themas

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

3

06.08.2017, 17:36

hm, habe es mir angeschaut, und ich habe in meinem Spiel ein Object mit einer Unregelmäßigen Hülle(2d) und es ist keine Polygon Hülle, ich habe 3 Möglichkeiten, 2 davon möchte ich vertiefen.

1. Ich schaue mir direct den aa Algorithmus zur umgehen von Hindernissen an und finde da noch was hilfreiches.

2. eine normale erstellen weil meine Pixel Kollisionen keine Normale haben: dafür prüfe ich den leren platz um den AABB Kollision's Punkt und kann dann die Formel von der Push/Slide Variante testen.

noch eine Frage zur AABB,
wenn mein Charakter in Richtung Mausklick Position(ziel_x,ziel_y)mit der Geschwindigkeit speed läuft ist dann der richtungs vector für den AABB schritt :

Quellcode

1
2
3
AABBx=((ziel_x-player_x)/(ziel_y-player_y))*speed;

AABBy=((ziel_x-player_x)/(ziel_y-player_y))*speed;

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

06.08.2017, 17:43

Also mal davon abgesehen, dass das mit AABB wohl relativ wenig zu tun hat, ist es doch sicherlich höchst unwahrscheinlich, dass die Formel für x dieselbe ist wie für y. Meinst du nicht?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

@zimmer

Alter Hase

  • »@zimmer« ist der Autor dieses Themas

Beiträge: 1 135

Wohnort: NRW Germany

  • Private Nachricht senden

5

07.08.2017, 14:59

Ja Sorry, da musste noch was ergänzt werden, ich dachte ich muß da unbedingt Höhere Vector Säzte benutzen aber am Ende waren meine Formeln Schlechter als am Anfang.
Noch zu ergenzen: Meine 3. Möglichkeit: die Grafiken als Vector Grafiken zu machen, das Spiel Programmiere ich bewust in einer 800x600px auflösung, eventuell, würden die Grafiken doch besser als Vector Graficken aussehen, wenn sich Bilder Bewegen.
Ich habe es überarbeitet und es wird nun auch geprüft ob auf dem Weg ein Hindernis ist und wenn, dann wird versucht erst in x Richtung dann in y richtung kein Hindernis zu finden und dann wird erst bewegt. AABB(nicht iAABB) und AABB2 sind kleine Objecte die mir die Prüfungen gezeigt haben

Quellcode

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
45
46
/// movement+attack
// per Maus click eine Zielposition bestätigen 
if (device_mouse_check_button(0, mb_left))
{
    i=mouse_x;
    j=mouse_y;
}
distance=distance_to_point(i,j);
if (distance > range)// ist der player am ziel angelangt? range ist z.b.5 um ziel i,j
{
    //egal wie groß die destance, die AABB prüfung soll 32 pixel vom player weg sein
    distanceAABBfac=32/distance;
    //distanceAABBfac in richtung Ziel i,j
    iAABB=(distanceAABBfac*(i-x))+x;
    jAABB=(distanceAABBfac*(j-y))+y;
    speed=5;
    //prüfung in y Ziel Richtung
    if( place_free(iAABB, jAABB) )
    {
        //Payer bewegung
        move_towards_point( iAABB, jAABB, speed );    
//AABB.x=iAABB;
//AABB.y=jAABB;
    }
    else
    {
    //prüfung in y Ziel Richtung
    // x oder y alleine steht für Position des Objectes(hier Player) welches dieses Script hat
        if( place_free(x, jAABB) )
        {
            move_towards_point( x, jAABB, speed );
//AABB2.x=x;
//AABB2.y=jAABB;
        }
//prüfung in x Ziel Richtung
        else if( place_free(iAABB, y) )
        {
            move_towards_point( iAABB, y, speed );
//AABB2.x=iAABB;
//AABB2.y=y;
        }           
    }
}
//speed=0 =keine bewegung
else speed=0;
   

Werbeanzeige