Collision_circle Frage

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

  • Collision_circle Frage

    if !collision_circle(xx,yy,12,wand,1,0)

    ich möchte einen bestimmten radius von den gegnern (alle haben 24x24 pixel größe) und möchte die 24x24 testen ob sie eine collision haben. wie kann ich da machen?

    && !collision_circle(xx,yy,24,alle_gegner,1,0)

    probiert, aber weiß nicht wirklich wie das funktioniert, mit dem collision_circle.... kann mir das jemand ein bisschen erklären wie es damit gehen müsste?

    gamemaker.info/de/manual/403_04_collision <- sagt mir nicht wirklich viel :rolleyes:



    :) :)
    Grüße...
  • Ich will mich ja net aufregen aber vielleicht schaut ihr selber mal in die Hilfe, bevor ihr ihm falsche Ratschläge gebt... :thumbdown:

    GML-Quellcode

    1. collision_circle(xc,yc,radius,obj,prec,notme)

    xc=x-koordinate des mittelpunkts.
    yc=y-koordinate des mittelpunkts.
    radius= radius des Kreises.
    Und der Rest erklärt sich von selbst.

    © 2008 by Teamgrill Productions
  • Gib ihnen eine Maske, das hilft ungemein ^^

    Ausserdem musst du, wenn du wissen willst OB eine Kollision STATTFINDET nicht

    GML-Quellcode

    1. if !collision_circle


    sondern simpel

    GML-Quellcode

    1. if collision_circle


    nehmen.

    Ich empfehle dennoch Masks, das ist 1. Leichter und 2. öhhh leichter... und 3. ich denke effektiver ^^

    collision_circle(xc, yc, radius, obj, prec, notme)Diese Funktion prüft, ob eine Kollision zwischen dem (gefüllten) Kreis mit Kreismittelpunkt an Position (xc,yc) mit gegebenem Radius und Instanzen des Objektes obj vorliegt. Beispielsweise kannst du damit überprüfen, ob ein Objekt dicht an einer bestimmten Stelle liegt.


    Das sagt, dass du mit der Funktion >collision_circle(x,y,radius,obejkt,prec,notme)< rausfinden kannst OB eine Kollision stattfindet.
    Hierbei ist halt x/y das Zentrum mit dem Radius
    Spoiler anzeigen
    (bei einem 24x24 Objekt wäre das wohl 12, bzw wenn du die Ecken mit eindecken willst wäre es ceil(sqrt(12*12+12*12)) = 17)
    .
    Obj. sagt, mit wem die collision stattfinden soll und prec sagt ob precise collision checking benutzt werden soll
    Spoiler anzeigen
    (pixelgenaue kollision oder bounding box)
    und notme sagt, ob die ausführende Instanz
    Spoiler anzeigen
    (das Obj. mit dem Code)
    ausgeschlossen werden soll.

    Ausserdem gibt meines Wissens nach jede Collision Funktion die ID des Collision Partners zurück, was bedeutet, du kannst

    GML-Quellcode

    1. Hit = collision_circle(x,y,12,objekt,1,1);
    2. with(Hit)
    3. {>>Insert Action Here<<}


    Machen um bei der Collision mit dem collidierendem Objekt etwas zu tun ^^

    Falls noch Fragen offen sind, nur zu... ich hab eh nix zu tun.

    PS: Ich glaube das is mein bisweilen längster Post hier und ich hab so viel mist geschrieben haha. Aber ich denke es ist zu 99% Richtig
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Schattenphoenix ()

  • Danke eure posts, und vorallem an schattenphoenix,

    du meintest ja wenn noch was offen ist dann >nur zu<


    also ich habe es so:

    im left pressed event:
    xx=(floor(mouse_x/24)*24)
    yy=(floor(mouse_y/24)*24)

    if collision_circle(xx,yy,12,wand,1,0)
    && collision_circle(xx,yy,12,all_monster,1,0)
    { instance_create(xx,yy,haus1); }


    dass wenn ich links-klick drücke baut er ein haus1, jedoch nur, wenn keine collision mit wand und all_monster entsteht.

    nun weiß ich nicht genau wie das klappen sollte, hab es ja mit dem radius von 12 gemacht, aber sollte ich vllt all_monster.x und wand.x nehmen? oder xx,yy...? oder ganz anders?

    Grüße :)
  • ttothef schrieb:

    also ich habe es so:

    im left pressed event:
    xx=(floor(mouse_x/24)*24)
    yy=(floor(mouse_y/24)*24)

    if collision_circle(xx,yy,12,wand,1,0)
    && collision_circle(xx,yy,12,all_monster,1,0)
    { instance_create(xx,yy,haus1); }


    dass wenn ich links-klick drücke baut er ein haus1, jedoch nur, wenn keine collision mit wand und all_monster entsteht.

    nun weiß ich nicht genau wie das klappen sollte, hab es ja mit dem radius von 12 gemacht, aber sollte ich vllt all_monster.x und wand.x nehmen? oder xx,yy...? oder ganz anders?

    Grüße :)
    In dem Fall wäre es wirklich besser, eine Mask zu nehmen und "if(place_empty(xx,yy);"
    Spoiler anzeigen
    (überprüft, ob der Platz komplett leer ist (hier wird als Collision dein Sprite bzw deine Mask genommen))

    Oder halt unter Umständen auch place_free(xx,yy) welches nur prüft ob ein Solid Objekt im Weg ist.

    Ansonsten, wenn es bei deinem Circle dingens bleiben soll, solltest du die Mitte des Kreises entsprechend deinem Grid anpassen, wenn du ein 24x24 Grid hast und, ich denke mal die Sprites alle 24x24 mit Origin 0|0 dann müsste in dem Fall das Zentrum um 12|12 verschoben werden.

    Das würde bedeuten, du machst:

    GML-Quellcode

    1. if(!collision_circle(xx+12,yy+12,12,deinobjekt,1(bzw 0),0) and (mouse_check_button_pressed(mb_left))
    2. {
    3. instance_create(xx,yy,deinobjekt);
    4. }


    Wobei ich halt nicht weiss, wo die Origin deiner Sprites liegt, generell kann man wohl sagen, dass es, bei Origin = Mitte immer x+0,y+0 sein muss und bei Origin = 0|0 muss dann halt +12 sein.

    Versuchs damit, wenn du mehr Hilfe brauchst, schreib mich im ICQ an, ich geh nich immer jeden Thread durch und könnte das hier schnell übersehen.
    So far, Schattenphoenix~
    _____________________________________________________________________________
    "Who needs a stairway to heaven...
    If there is an elevator to hell... ?
    "
    - Vergessen
    "Auch ein perfektes Chaos ist etwas vollkommenes."
    - Jean Genet
  • Benutzer online 1

    1 Besucher