Variable bei Kollision testen

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

  • Variable bei Kollision testen

    Ich hab da auch mal ein Problem, welches - das müsste ich vorher sagen - nicht mit der Verwendung von parents gelöst werden kann.
    Ich habe in meinem Game diverse Instanzen von einem Objekt names obj_Typ. Diese haben alle eine Variable mit dem Namen name (ein string).
    Nun möchte ich, das obj_Typ mit einen collision_circle überprüft, ob sich weitere Instanzen von obj_Typ in einer gewissen Entfernung befinden und (jetzt kommts) die Variable name "Heinz" ist.
    das müsste etwa so aussehen:

    GML-Quellcode

    1. temp_typ=collision_circle(x,y,300,obj_Typ,true,true);
    2. if temp_typ.name='Heinz'
    3. {show_message('Hallo Heinz!');}

    Das Problem an der Sache ist nur, das collision_circle immer nur die id einer Instanz ausgibt. Also wenn sich noch andere obj_Typ Instanzen in einer Entferneung von 300 befinden, deren Variable name aber nicht "Heinz" ist, endet die Funktion oft bei diesen.
    Ich bräuchte aulso eine Funktion wie diesese:

    GML-Quellcode

    1. if collision_circle(x,y,300,obj_Typ.name='Heinz',true,true)
    2. {show_message('Hallo Heinz!');}

    Das funktioniert aber wohl nicht. Zumindest habe ich nichts dergleichen in der Hilfe gefunden. Hat jemand eine Idee?
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Da wüsste ich in dieser Reihenfolge auch keine Lösung. Man könnte höchstens alle Objekte mit dem Variableninhalt Heinz nehmen und testen, ob eines von denen im Bereich liegt.

    GML-Quellcode

    1. var i, curr_instance;
    2. for(i=0;i+=1;i<instance_number(obj_Typ)){
    3. curr_instance=instance_find(obj_Typ,i);
    4. if curr_instance.name='Heinz' {
    5. if collision_circle(x,y,300,curr_instance,true,true) {
    6. show_message('Hallo Heinz!');
    7. }
    8. }
    9. }
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Original von Windapple
    Da wüsste ich in dieser Reihenfolge auch keine Lösung. Man könnte höchstens alle Objekte mit dem Variableninhalt Heinz nehmen und testen, ob eines von denen im Bereich liegt.

    Das dürfte aber ganz schön auf die Leistung gehen. Es gibt eine menge obj_Typ in dem Spiel ;)
    gibt es nicht die Möglichkeit nur die Instanzen im collision_circle zu testen?
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Ich hab leider nicht ganz verstanden, was genau dein obj_Typ mit jedem der anderen obj_Typ machen soll, aber ich würd das so regeln:

    GML-Quellcode

    1. with(ob_Typ)
    2. {
    3. if ((instance_id!=other.instance_id)&&(distance_to_point(other.x,other.y)<=/*Radius*/)&&(name=='Heinz'))
    4. {
    5. with(other)
    6. {
    7. //Was auch immer nun geschehen soll.
    8. }
    9. }
    10. }


    Edit: Gahr! Zu langsam...
    Edit2: Und fehlerhaft war das außerdem... Hab die Bedingung mit dem Heinz vergessen...
  • Ich glaube da könnte die Funktion instance_deactivate_object nützlich sein:

    GML-Quellcode

    1. var col;
    2. col = collision_circle(x,y,300,obj_Typ,true,true);
    3. while (col != -1) {
    4. if (col.name = "Heinz") {
    5. break;
    6. }
    7. instance_deactivate_object(col);
    8. col = collision_circle(x,y,300,obj_Typ,true,true);
    9. }
    10. instance_activate_object(obj_Typ);
    11. if (col != -1) {
    12. show_message("Hallo Heinz!");
    13. }
    Alles anzeigen


    Das dürfte von der Leistung her auch ganz ordentlich sein.
  • Original von WIN
    Original von Windapple
    Da wüsste ich in dieser Reihenfolge auch keine Lösung. Man könnte höchstens alle Objekte mit dem Variableninhalt Heinz nehmen und testen, ob eines von denen im Bereich liegt.

    Das dürfte aber ganz schön auf die Leistung gehen. Es gibt eine menge obj_Typ in dem Spiel ;)
    gibt es nicht die Möglichkeit nur die Instanzen im collision_circle zu testen?


    Man kommt nicht an den Inhalt des Collission Circle ran, deswegen kann man auch nicht bestimmen welche Instanzen da im Umkreis von 300 Pixeln liegen. Man kann nur die Instanzen nehmen und einzeln durchprüfen.
    "Die Erde ist ein Irrenhaus. Dabei könnte das bis heute erreichte Wissen der Menschheit aus ihr ein Paradies machen. Dafür müsste die weltweite Gesellschaft allerdings zur Vernunft kommen."
    - Joseph Weizenbaum
  • Original von Windapple
    Man kommt nicht an den Inhalt des Collission Circle ran, deswegen kann man auch nicht bestimmen welche Instanzen da im Umkreis von 300 Pixeln liegen. Man kann nur die Instanzen nehmen und einzeln durchprüfen.

    zu schade.
    ich werde mal die version von Bl@ckSp@rk ausprobieren und mich melden wie es läuft.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Original von Gregor
    Warte mal... ist das game ein online spiel oder nicht-online spiel?Bei zweiterem mach einfach:

    GML-Quellcode

    1. if point_distance(x,y,player.x,player.y)<=300 { show_message("Hallo "+string(name)+"!") }
    falls ich das problem falsch verstanden habe sorry!

    nein, das spiel ist ein reines offlinespiel. zudem sollen nur die obj_Typ instanzen, deren variable name="Heinz" ist hallo sagen.

    EDIT: das funktioniert sehr gut. leider gibt es dadurch allerdings grafikfehler wenn die sprites der objecte übereinander liegen. werde mal sehen ob ich das auch noch hinbekomme.
    Battle Command - WeltraumEchtzeitStrategie | Meine GM Spiele auf Box.net
    GCM/FA/O d-(--)@>---xpu s-:- !a C++$@ U- P L+ E W++ N o K-- w++ O? M V PS PE-- Y PGP t 5 X R+++ tv+ b DI D G e+ h? r-- x
  • Original von WIN
    EDIT: das funktioniert sehr gut. leider gibt es dadurch allerdings grafikfehler wenn die sprites der objecte übereinander liegen. werde mal sehen ob ich das auch noch hinbekomme.


    Wie genau sehen denn die Grafikfehler aus? Könnte vielleicht sein, dass durch das instance aktivieren und deaktivieren die draw Reihenfolge verändert wird. Wenn das der Fall ist vielleicht einfach mal jeder instance eine andere depth zuweisen, oder statt instance_deactivate_all() die deaktivierten instancen einzeln in der Reihenfolge in der sie deaktiviert wurden wieder aktivieren.
  • Benutzer online 1

    1 Besucher