Springe zum nächstgelegenen freien Punkt

  • GM 8

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

  • Springe zum nächstgelegenen freien Punkt

    Bild
    (Er will das Bild iwie nicht direkt anzeigen, sry.)
    1: Die roten Fleder sind instanzen einen bestimmten Objektes
    2: Hier (in der Mitte) wird eine weitere Instanz kreiert.
    3: Diese soll jetzt automatisch den nächstgelegenen Punkt finden, der frei ist und dort hinspringen. Wichtig dabei ist, dass es sicher der nächstgelegene Punkt ist.
    ...
    Ich hab selbst einfach gerade mal überhaut keine Idee, wie das anzufangen ist. Deshalb frag ich hier.
    ~

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

  • wenn es nur wenige felder sind (so wie in dem bild), könntest du einfach für jedes Feld die entfernung zum Mittelpunkt (dem Feld wo das Objekt erstellt wird) bestimmen (point_distance). Dann musst du nur noch abfragen ob das feld belegt ist. Dann nimmst du einfach das Feld mit der kürzesten Entfernung von den freien Feldern.

    Wenn du ein ganz großes Gitter hast, könnte es sein, dass diese Lösung zu viel rechenleistung frisst und dein Spiel evtl einfrieren könnte.
  • erst mal musst du den Sprungpunkt wissen, wenn du ihn nicht weisst musst du ihn per Schleife und Collision_rectangle ( mach das mit den Feldern, geht einfacher, und spar
    Speicher s.u , oder zähl die instancen und geh jeden durch, danach wieder gucken mit Raster, recht easy)
    errechnen, wo er denn ist, wenn du ihn hast:
    machst du einen "Rastersprung":
    neueX=((ceil(XSprungpunkt/Rastergröße))*Rastergröße)-(1/2*sprite_width)
    neueY=((ceil(YSprungpunkt/Rastergröße))*Rastergröße)-(1/2*sprite_height)
    also z.b:
    xp=((ceil(mouse_x/32))*32)-16
    yp=((ceil(mouse_y/32))*32)-16
    Hier hab ich jetzt als Beispiel die Maus genommen, um dir das bildicher zu machen.
    In dem Beispiel bewege ich das 32/32 Objekt auf einem 32*32 raster (imaginäres raster) irgendwo hin, danach wird die
    Position ermittelt (mouse_x,mouse_y in dem BSP) geteilt durch die rastergröße genommen, und aufgerundet, dann weisst
    du in welchem 32*32 feld sich das Objekt befindet, du rechnest die jetzt ermittelte Feldpositon wieder mal die Feldgröße 32
    und rechnest es danach - die sprite - Größe sodass (Bei mir ist das Origin in der Mitte, das -16 ist nur damit das Objekt nicht
    AUF den Feldschnittpunkten ist, sondern IN dem Feld drin!) das Objekt in der Mitte landet. der trick ist, das Ceil nur aufrundet und
    durch die Rastergröße die aktuelle Positon im Ratser angibt. Jeder Wert kann also einem Feld zugeordnet werden...
    Mfg nis ;D
    Wie viele von euch wissen, dass Rot und Grün Gelb ergibt?

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

  • Haha :D Schuldige...
    Ich denk das kann man iwie so machen:

    Quellcode

    1. for(i=0;i<=60;i+=4) {if collision_rectangle(self.x+16,self.y-16,self.x+16+i,self.y+16,obj_Collision,true,self)>=0 {
    2. a=collision_rectangle(self.x+16,self.y-16,self.x+16+i,self.y+16,obj_Collision,true,self)

    (Größe des Objekts natürlich dem collision rectangle anpassen) durch a=col_rec bekomsmt du die ID raus...
    Die i-Schritte kannst du dementsprechend verkleinern/vergrößern
    ... das Problem ist, dass es (relativ) viel Aufwand betreibt, wenn du mehrere Richtungen etc. abtestest und für alle Objekte
    ist aber notfalls definitiv machbar...
    Ich würds dann bei einer einfachen "Feldabfrage" belassen... bedeutet:
    Du legst ein 2darray an, welcher alle Feldpositonen beinhaltet (also z.b_ 32*32 Felder)
    ein "Würfel"(also deine Objekte) füllt dann dieses array(dann weisst du das dieses Feld "gefüllt ist")
    bedeutet Feldposition (2/1) ist von einem Würfel besetzt, (2/0) ist aber frei...
    danach gehst du halt den array mit einer doppelten Schleife durch und prüfst ob die Punkte die relativ
    zu dem aktuellen Sprungwürfel am nächsten+frei sind! Dabei musst du dir ein Algorhytmus
    überlegen in welchem Ryhtmus halt die Felder um den Sprungwürfel getestet werden und wenn mehrere
    auf der gleichen "Array-Feld" entferung musst du dich entscheiden
    ok?
    hoffe ist verstanden? ;D anders wüsst ichs nicht zu mindest Platzsparend :D

    Hoffe bist nicht sauer, dass ich es nicht alles direkt vorprogrammiert hab, aber ich hab selbst grad viel zu tun+denke

    das es beim prorgammiern auch darauf ankommt Spass an der Problemlösung zu haben :D
    Aja ich hab jetzt ziemlich selbstverständlich geredet da ich dich mal auf einem gewissen
    Prorgammier Niveau angesiedelt hab -> da ich deine "Selbsteinschätzung" nicht sehe, wär hilfreich zu wissen :P


    mfg nis
    Wie viele von euch wissen, dass Rot und Grün Gelb ergibt?

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

  • Hi,
    ich weiß jetzt nicht, wie Du die Felder abspeicherst bzw. ansprichst. Aber ich denke mal, dass Du irgend wie die einzelnen Felder ansprechen kannst und diese dann überprüfen, ob sie frei sind oder nicht.
    Dann würde ich es folgendermaßen lösen:
    Du überprüfst alle umgebenen Felder Deiner Instanz schichtenweise, ob diese frei sind oder nicht:
    Spoiler anzeigen

    GML-Quellcode

    1. //Schicht 1
    2. for (yy = -1; yy < 2; yy += 1)
    3. for (xx = -1; xx < 2; xx += 1)
    4. //wenn Feld[x + xx, y + yy] = frei, dann merken
    5. //Schicht 2
    6. for (yy = -2; yy < 3; yy += 1)
    7. for (xx = -2; xx < 3; xx += 1)
    8. //wenn Feld[x + xx, y + yy] = frei, dann merken
    9. //usw.
    Alles anzeigen

    wurden in einer Schicht freie Felder gefunden, kannst Du die Schleife beenden, und aus allen gefunenen freien Feldern (sollten nicht all zu viele sein...) mit point_distance oder ähnlichem das (oder die; könnten ja mehrere gleich weit entfernt sein...) nächstliegende herausfischen.

    [hide="Legende zum Bild:"]Blau: Deine "springende" Instanz
    Grün: zu überprüfende "Schicht" von Feldern
    Gelb: gefundene frei Felder in der aktuellen "Schicht"[/hide]
    Bilder
    • FreiesFeld.png

      16,69 kB, 1.538×356, 79 mal angesehen
    "Es gibt nie ein glückliches Ende, denn es endet nichts." - Schmendrick
  • ganz einfach, ein Event (event_user(0))
    in den Objekten welches bei Bewegung, beim Start aufgerufen wird und:
    die aktuelle x/y Position als Feld umwandelt(s.o mit ceil(...)) und in einem 2darray speichert
    alle anderen müssen ja dann frei sein^^
    bedeutet
    a[2,3]=1
    Feld 2,3 ist besetzt
    Wie viele von euch wissen, dass Rot und Grün Gelb ergibt?
  • Benutzer online 1

    1 Besucher