Zwei Kreise die nicht ineinander gehen dürfen

  • GM 8

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Zwei Kreise die nicht ineinander gehen dürfen

    Hallo gm-d Community,

    ich stehe mal wieder vor einem kleinem Problemchen, und hoffe jemand kann mir weiterhelfen.
    Folgendes:

    Ich habe zwei Kugeln mit dem Radius 23.
    Die eine Kugel ist unbeweglich im Raum platziert, die andere folgt der Maus mit

    GML-Quellcode

    1. x = mouse_x;
    2. y = mouse_y;


    Nun möchte ich gerne, das wenn ich mit der Maus auf die unbewegliche Kugel gehe, die andere Kugel die der Maus folgt sich nicht über die andere legt, sondern eher den Weg herum sucht und praktisch herumgleitet.

    Hab schon ein wenig mit collision_circle usw. rumprobiert, aber hab noch nichts hinbekommen was mich zufrieden stellt. Jemand ne Idee oder Lösung?

    Gruß,
    Shari
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)
  • GML-Quellcode

    1. draw_sprite(spr_kreis, 0, px1, py1);
    2. draw_sprite(spr_kreis, 0, px2, py2);
    3. px2=mouse_x; //Aktualisierung der Positionsdaten der Kugel von der Maus.
    4. py2=mouse_y; //Aktualisierung der Positionsdaten der Kugel von der Maus.
    5. while(point_distance(px1, py1, px2, py2)<32){ //Führt While solange aus bis Kugel weiter als 32px von der anderen Kugel entfernt ist!
    6. var angle=point_direction(px1, py1, mouse_x, mouse_y); //Winkel der zu umfliegenden Kugel zur Maus.
    7. px2-=sin((angle)/360*2*pi)*1; //Winkel Berechnung x
    8. py2-=cos((angle)/360*2*pi)*1; //Winkel Berechnung y
    9. }


    Ich nenns mal Anti-Gravitation. relativ einfach. px2 und py2 sind die Positionsdaten der Kugel von der Mouse. Nähert sich das Objekt näher als 32 (die größe des Kreises) dem anderen Kreis (px1 und py1) wird die Kugel statt angezogen einfach "weggezogen".
    Der Effekt, sie wandert herum ^^

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von C5_Booster ()

  • Davon ausgehend, dass der Ursprung deines Sprites die Mitte der Kugel ist:

    GML-Quellcode

    1. radius = 23;
    2. distance = point_distance(obj_unbeweglich.x, obj_unbeweglich.y, mouse_x, mouse_y);
    3. angle = point_direction(obj_unbeweglich.x, obj_unbeweglich.y, mouse_x, mouse_y);
    4. if (distance > 2*radius) {
    5. x = mouse_x;
    6. y = mouse_y;
    7. } else {
    8. x = obj_unbeweglich.x + lengthdir_x(2*radius, angle);
    9. y = obj_unbeweglich.y + lengthdir_y(2*radius, angle);
    10. }
  • Hab die Variante von dir genommen, boxxar und es funktioniert wunderbar.
    Vielen vielen Dank. Dir auch C5 Booster für deine Mühe :)

    So, jetzt ist mir nur gerade aufgefallen. Ich habe ja mehrere dieser unbeweglichen Kugeln.
    Hab das ganze jetzt mit Parents und instance_nearest gelöst, klappt also auch wunderbar bei mehreren Kugeln.

    Nur wenn der Fall eintritt, das die unbweglichen Kugeln so nah zusammenliegen, dass ich mit der beweglichen über beide kommen könnte, dann funktioniert das ganze nicht mehr und es gibt ein wildes hin und hergespringe der beweglichen Kugel.

    Nochmal ne Idee jemand??

    Gruß,
    Shari
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Sharivari ()

  • Kannst ja einfach 'ne Distanzabfrage bauen. Also:

    GML-Quellcode

    1. var s, d, xx, yy;
    2. s = point_distance (x, y, objekt.x, objekt.y);
    3. d = point_direction(x, y, objekt.x, objekt.y);
    4. if s < radius
    5. { xx = - lengthdir_x (radius - s + 1, d);
    6. yy = - lengthdir_y (radius - s + 1, d);
    7. if place_free (x + xx, y + yy)
    8. { x += xx;
    9. y += yy; } }

    Ob das funktioniert, kann ich dir nicht sagen; Habe mich lange nicht mehr mit GM richtig befasst. Eine besonders schöne Schreibweise erscheint mir mein Code auch nicht, aber naja.
  • Nein, wir schreiben nicht komplett das gleiche wie du. Während du die eine Instanz pixelweise aus der anderen herausschiebst berechnen wir die neue Position einfach direkt. Zum einen ist das Endergebnis nicht notwendigerweise das gleiche (insbesondere sollte man mal mit Radien arbeiten, die nicht Ganzzahlig sind), zum anderen ist dein Quelltext ein super Beispiel für "wie verschwende ich unnötig Rechenzeit und mache dabei gleichzeitig meinen Code unleserlich". Dutzende male pro Step irgendwelche Winkelfunktionen auswerten ist sicherlich nicht sinnvoll.

    P.S.: Bevor jetzt das geflame losgeht: Ich weiß, das mein Code laufzeittechnisch nicht optimal ist und das man das ganze ohne Winkelfunktionen hätte lösen können, aber ich hatte das Gefühl dass der das beste Verhätlnis aus Lesbarkeit und Performance hat.
  • Hab die Lösung gefunden, war eigentlich ganz einfach.
    Ich nutze also wie folgt den Code:

    GML-Quellcode

    1. radius = 23;
    2. distance = point_distance(obj_unbeweglich.x, obj_unbeweglich.y, mouse_x, mouse_y);
    3. angle = point_direction(obj_unbeweglich.x, obj_unbeweglich.y, mouse_x, mouse_y);
    4. if (distance > 2*radius) {
    5. x = mouse_x;
    6. y = mouse_y;
    7. } else {
    8. x = obj_unbeweglich.x + lengthdir_x(2*radius, angle);
    9. y = obj_unbeweglich.y + lengthdir_y(2*radius, angle);
    10. }


    Dann hab ich das ganze einfach nochmal ergänzt:

    GML-Quellcode

    1. if collision_circle(x,y,22,obj_unbeweglich,true,true){
    2. x = xprevious;
    3. y = yprevious;
    4. display_mouse_set(xprevious,yprevious);}


    Funktioniert wunderbar :)
    Dieser Beitrag wurde bereits 1909 mal editiert, zuletzt von »Sharivari« (Morgen, 19:89)