collision-abfragen oder gridfunktionen? (!Problem!)

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

  • collision-abfragen oder gridfunktionen? (!Problem!)

    Halli Hallo liebe Forenuser und sonstige Mitmenschen,

    Einleitung:

    Wie ihr vielleicht schon im Thema 'Erkennung gleicher Objekte in einer Reihe' mitbekommen habt:
    Es handelt sich um einen Columns-Klon de.wikipedia.org/wiki/Columns der so widerspenstig ist
    dass ich schon wieder ein Problem hab dazu folgende Veranschaulichung:


    Hierzu hänge ich mal die GM Datei an (GameMaker6 Datei)
    Problem.rar

    Wenn man sich das ganze mal angegickt hat sieht man dass ich 3 Blöcke verwende:

    1.Block: Diesen Block steuere ich (obj_ConRed)
    2.Block: Dieser Block checkt sein Umfeld ab (Es müssen mind.3 Blöcke sein dass die Aktion im Code ausgeführt wird (obj_JewRed))
    3.Block: Dieser Block spielt einen animierten Sprite ab der eine um 2 pixel grössere Weite hat als die anderen Sprites (obj_DesRed)

    So vielleicht erkennt ihr mein Problem wenn nicht erkläre ich nochmals:

    Es müssen mind.3 Blöcke sein dass die Aktion im Code ausgeführt wird (funktioniert)
    wenn es mehrere sind funktionierts auch
    aber wenn ich eine Situation wie im Bild (oben) habe gehts nicht aber ich muss doch rund herum checken ob noch mehrere rote objekte im Umkreis liegen

    ACHTUNG: DIE BLAUEN UND ORGANGEN OBJEKTE SIND NOCH NICHT PROGRAMMIERT
    Danke im Vorraus für baldige Hilfe

    THX DSS
    Ihc hab so voll den ij
  • Dafür würd ich eigentlich wirklich ein grid verwenden, dann kannst du superleicht bestimmen, wieviele Blöcke in einer Reihe sind etc...
    Du kannst ja die Id der Objekte in dem grid speichern und die grid-Position wird immer aktualisiert: gridX = x/gridAuflösung
    Du checkst immer, wenn du eine Bewegung machen möchtest, ob der Block weiter unten besetzt ist und wenn ja, dann lass in einfach nur bis zur entsprechenden Position fallen.
    Abfragen sind auch sehr easy.
    "das war meine letzte flamewar PM an dich ."
  • Puhh habe wirklich keine Ahnung wie ich das anstellen soll, da
    kommen immer wieder ERRORS.Ich hab das mit dem GM noch nicht
    so drauf dass ich zB. deine Ideen jetzt einfach so in einen Code
    umformulieren könnte.Im Prinzip weiß ich ja wie es funktioniert aber
    die Umsetzung in die GML ist halt am Anfang noch schwer. Kannst du mir vielleicht
    einen Tipp geben wie ich so was anstelle? Musst ja nicht gleich n´fertigen
    Code posten...
    trotzdem THX
    Ihc hab so voll den ij
  • ja mach doch ein globales grid:

    GML-Quellcode

    1. global.grid = ds_grid_create(...)


    und ne globale variable, die die grösse der einzelnen felder bestimmt:

    GML-Quellcode

    1. global.gridSize = 32


    das grid repräsentiert jetzt sozusagen die spielwelt.

    jeder block braucht dann noch variablen, die seine positionen innerhalb dieses grids bestimmt:

    GML-Quellcode

    1. gridX = floor( x/global.gridSize );
    2. gridY = floor( y/global.gridSize );


    dabei musst du aber auch die veränderung der positionen abchecken, um das objekt in den entsprechenden feldern zu registrieren bzw wieder abmelden.

    GML-Quellcode

    1. var newGridX, newGridY;
    2. newGridX = floor( x/global.gridSize );
    3. newGridY = floor( y/global.gridSize );
    4. ds_grid_set(global.grid,gridX,gridY,noone);
    5. ds_grid_set(global.grid,newGridX,newGridY,id);
    6. gridX = newGridX;
    7. gridY = newGridY;


    und kollision checken und dann anhalten könntest etwa so:

    GML-Quellcode

    1. var realGridY;
    2. realGridY = y/gobal.gridSize
    3. if (ds_grid_get(global.grid,gridX,gridY+1)!=noone)
    4. {
    5. if ((realGridY-gridY)<=(1/global.gridSize))
    6. {
    7. y = gridY*global.gridSize;
    8. vspeed = 0;
    9. gravity = 0;
    10. }
    11. }
    12. else
    13. {
    14. vspeed = whatever;
    15. gravity = whatyawant;
    16. }
    Alles anzeigen

    das ist jetzt speziell für gravitation, ungetestet, verstehs, und schreib dein eigenes

    hoffe das hilft
    "das war meine letzte flamewar PM an dich ."
  • Ok ich habs einigermaßen verstanden...

    Wenn ich das jetzt richtig verstanden habe mache ich das hier in ein "Kontroll-objekt" ins create-event

    GML-Quellcode

    1. global.grid = ds_grid_create(...)
    2. global.gridSize = 32


    und denn rest ins step-event oder?

    SRY for my noobness

    kann mir jmd. vielleicht sagen wo es ein tutorial
    für sowas gibt (gm6) ich hab in der Suche gesucht aber ich bin nicht richtig fündig geworden
    Ihc hab so voll den ij

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Dick-Software Studios ()

  • Jap, richtig so =)

    Nur den "Step-Code" machst du in die jeweiligen Block-Objekte

    Im Prinzip kannste jetzt mit ds_grid_get alles von wegen Kollision und so abchecken, wie im letzten Codeausschnitt.


    GML-Quellcode

    1. var realGridY;
    2. realGridY = y/gobal.gridSize //die aktuelle grid-y-Position ungerundet
    3. if (ds_grid_get(global.grid,gridX,gridY+1)!=noone) //Wenn sich an der Position unter mir etwas befindet
    4. {
    5. if ((realGridY-gridY)<=(1/global.gridSize)) //Wenn die vertikale Distanz von realGridY bis zu gridY+1 kleiner oder gleich ein Pixel ist(glaube ich...)
    6. {
    7. y = gridY*global.gridSize; //Setze y auf die Position von gridY
    8. //Da sich etwas unter mir befindet, halten wir an, weil wir ja jetzt auf dem utneren Objekt aufliegen.
    9. vspeed = 0;
    10. gravity = 0;
    11. }
    12. }
    13. else // Wenn unter mir nichts is
    14. {
    15. vspeed = whatever;
    16. gravity = whatyawant;
    17. }
    Alles anzeigen
    "das war meine letzte flamewar PM an dich ."
  • Jetzt hab ich im step-event
    von den blöcken:

    GML-Quellcode

    1. var realGridY;
    2. realGridY = y/gobal.gridSize //die aktuelle grid-y-Position ungerundet
    3. if (ds_grid_get(global.grid,gridX,gridY+1)!=noone) //Wenn sich an der Position unter mir etwas befindet
    4. {
    5. if ((realGridY-gridY)<=(1/global.gridSize)) //Wenn die vertikale Distanz von realGridY bis zu gridY+1 kleiner oder gleich ein Pixel ist(glaube ich...)
    6. {
    7. y = gridY*global.gridSize; //Setze y auf die Position von gridY
    8. //Da sich etwas unter mir befindet, halten wir an, weil wir ja jetzt auf dem utneren Objekt aufliegen.
    9. vspeed = 0;
    10. gravity = 0;
    11. }
    12. }
    13. else // Wenn unter mir nichts is
    14. {
    15. vspeed = 5;
    16. gravity = 1;
    17. }
    Alles anzeigen


    und im create-event von obj_kontrolle:

    global.grid = ds_grid_create(320,464)
    global.gridSize = 32

    dann zeigt er mir einen ERROR:

    Error unknown variable global*****

    Muss ich die ganzen variablen denn erst definieren
    ich komm da grad nicht mehr so mit Sorry

    willst du mir vielleicht nicht ein examplechen machen?
    ich hänge jetzt schon seit 2 Monaten am gleichen Problem ;(
    naja ich will hier mal nicht den Flennie spielen

    thx DSS
    Ihc hab so voll den ij
  • Ja nach dem was die Fehlermeldung sagt, hast du eine Variable nicht definiert... Wie gesagt, der Code ist eben nur ein Code den man verstehen sollte, und wo blindes kopieren nich wirklich hilft... Wenn ich Lust und Zeit un Laune hab, mach ich vielleicht mal n kleins Example ;)

    btw fehlt da oben bei nem global ein "l"... ;)
    "das war meine letzte flamewar PM an dich ."
  • Benutzer online 1

    1 Besucher