Grid zeichnen

  • GM 7
  • Hallo, zusammen

    Ich hab ein kleines Problem. Ich möchte bei meinem Level eine art Grid herstellen, die man sieht und auf der man bauen kann. Alles was nicht zur Grid gehört kann nicht bebaut werden. Man kann nur in den Quadraten (Felder) bauen.

    Wisst ihr, wie ich das verwirklichen könnte?


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Habe dafür ein Skript in mein Game "The 2D Game" geschrieben, da ich für dieses Spiel auch eine Grid erstellen wollte.
    Hier mein Skript

    draw_gitter

    GML-Quellcode

    1. {
    2. draw_set_color(argument2);
    3. for (i = 0; i < room_width; i += argument0)
    4. draw_line(i,0,i,room_height);
    5. for (j = 0; j < room_height; j += argument1)
    6. draw_line(0,j,room_width,j);
    7. }


    Anwendung:
    draw_gitter(32,32,c_red);

    Argument0 = Die Senkrechten Linien;
    Argument1 = Die Waagerechten Linien;
    Argument2 = Farbe;

    sollte sich selbst erklären ;D

    _________
    EDIT :

    Fallst dir das nicht reicht, im meiner siggi ist ein Link zu einem Spiel von mir "The 2D Game" (wie schon gesagt) und die Open Source kann man auch ziehen, wenne sowas in der art meinst, dann kannste ja im Open Source nachgucken wie des geht.

    MFG
    Metalknight

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

  • Die Frage in dem Fall ist, wie du es hinkriegst Flächen von dem Skript auszunehmen.
    Vllt. wäre es am einfachsten ein Objekt zu erstellen, dem ein Sprite zu geben (Rechteck/Quadrat in Gittergröße) und dieses überall hinzustellen, wo nicht gebaut werden darf.
    Dadurch, dass das Objekt ein Sprite hat, ist es ersichtlich, dass dort nix plaziert werden kann, du solltest die Draw-Funktion nur evtl ausschalten, solange du nicht in dem entsprechenden Menü bist (oder wie auch immer du es handhabst).

    Ausserdem für dein Gitter noch hilfreich ist evtl dieses:

    GML-Quellcode

    1. gridhsize = argument0;
    2. gridvsize = argument1;
    3. x = floor(x/gridhsize)*gridhsize;
    4. y = floor(x/gridvsize)*gridvsize;


    Benutzen mit z.B.

    GML-Quellcode

    1. grid_align(32,32)


    Um Objekte am Raster/Gitter anzuheften.


    EDIT:
    <sarcasm>
    Dafür kannst du uns was zu Essen spendieren, ich hab Hunger ^^
    </sarcasm>
    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
  • Danke erstmal für die vielen Antworten.

    Ich versuche einmal alles aus.

    Danke und Mfg :)
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • MewX schrieb:

    Warum Objekte? Sachen können einfach nicht plaziert werden, wenn der x bzw. y Wert kleiner oder Größer als die Gridkoordinaten ist.
    Ich verstehe ehrlich nicht was du damit meinst, wenn du gewisse Stellen im Grid nicht bebaubar haben willst, dann kannst du mit einer Ortsangabe bzw. einem Collision_rectangle event auch immer nur gewisse Flecken abdecken.

    Ich fände die Möglichkeit, Objekte zu positionieren besser, weil da da automatisch eine gewisse farbe verwenden könntest, die signalisiert, dass dort nich gebaut werden kann.

    Ansonsten, würde ich deine Idee gerne etwas genauer erläutert haben, ich verstehe nämlich nicht genau, was du meinst.
    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
  • Also, das mit dem Grid hat supi geklappt.

    Nun habe ich noch Mühe mit der Umsetzung betrefflich bauen und nicht bauen.
    Ich habe mal überall Objekte hingesetzt, wo man nicht bauen darf.

    Meine Vorstellung...

    Der Spieler klickt auf ein Feld. Das Feld wo man draufklickt kriegt eine andere Rahmenfarbe, oder wird farbig ausgefüllt. Dann kann man in der Leiste unten ein Objekt anklicken (zum bauen) und dann erscheint das Gebäude in dem gewählten Feld, falls genügend Geld vorhanden ist.

    Estmal bis dahin ist es mir wichtig.

    Dannach möchte ich noch, dass eine Box erscheint, beim angeklickten Objekt, wo man dann die Möglichkeit hat zu updaten, verkaufen etc.
    Aber wie gesagt. Das ist nicht schwer, das schaffe ich alleine.


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Schattenphoenix schrieb:

    MewX schrieb:

    Warum Objekte? Sachen können einfach nicht plaziert werden, wenn der x bzw. y Wert kleiner oder Größer als die Gridkoordinaten ist.
    Ich verstehe ehrlich nicht was du damit meinst, wenn du gewisse Stellen im Grid nicht bebaubar haben willst, dann kannst du mit einer Ortsangabe bzw. einem Collision_rectangle event auch immer nur gewisse Flecken abdecken.

    Ich fände die Möglichkeit, Objekte zu positionieren besser, weil da da automatisch eine gewisse farbe verwenden könntest, die signalisiert, dass dort nich gebaut werden kann.

    Ansonsten, würde ich deine Idee gerne etwas genauer erläutert haben, ich verstehe nämlich nicht genau, was du meinst.

    Ich glaub wir reden komplett aneinander vorbei, deshalb ein Erklärungsversuch:

    Mein Vorschlag behandelt die simple Mechanik dahinter. Was du anscheinend willst ist eine grafische Signalisierung dessen. Aber auch dafür halte ich Objekte für suboptimal - kann das einfach zusammen mit dem Objekt das man bauen will Zeichnen lassen - also zuerst die Build-Mask zeichnen (ein Raster aus z.b. roten und grünen Tiles, wie in Warcaft) und darüber dann den Sprite des zu platzierenden Objektes.

    Den ganzen Bildschirm mit Objekten vollzukleistern ist keine gute Idee. Im Allgemeinen sollte man den Einsatz von vielen Objekten im GM generell vermeiden.
  • Ich habe leider immer noch nicht genau verstanden, wie ich das jetzt verwirklichen soll.
    Könntet ihr mir vielleicht erklären, wie ich einzelne Felder auswählen kann und die Rahmenfarbe ändern. :?:

    Ich weiss leider nicht, wie ich das machen soll :|

    Danke für alle Antworten.


    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Also habe mal etwas gemacht
    Es basiert auf meinen oben Geschriebenen Skript.
    Dieser wurde ein bisschen verändert.

    Ich habe es so gemacht, das dort Objekte sind, wo man nicht hinklicken kann/darf/soll.
    Wenn man in den Objekt-Eigenschaften das Häckschen von " Visible" wegmacht, ist der gleiche effekt da, nur das man die Objekte dafür nicht sieht.

    Makieren der Felder.rar

    Edit:
    Um zum Beispiel zu machen, dass man nun in diesen Feld was bauen kann, muss du einfach nur überprüfen ob mx und my nicht -1 sind, und dann bei instance_create an stelle von x die Variable mx nehmen, und bei y die variable my, rest slltest selber können.

    Hoffe das wa so etwa was du meintest.

    Edit 2:
    Sehe grade habe da vergessen im Create Event von obj_controller mx und my auf -1 zu stellen. Du musst die 0 auf -1 bei beiden stellen, damit am anfang nicht das erste Kästchen ausgewählt ist.

    MFG
    Metalknight

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

  • Ok. Vielen Dank. Das war genau das, was ich brauche. :thumbsup:

    Melde mich wieder.

    Mfg

    EDIT:

    Also. Das mit dem Auswählen hat alles schön gefunzt. Aber ich habe noch ein kleines Problem.
    Wie schon einmal oben beschrieben, soll mein Objekt durch einen Klick auf ein Icon (auch ein Objekt) erstellt werden.
    Das geht auch, aber da wir nicht definiert haben, dass wir dieses Objekt zwar anklicken dürfen, aber die Position von "my" und "mx" bleiben soll, wird das Objekt auf dem Icon platziert. Dann habe ich einfach deinen Code erweitert und noch die Kollision mit dem Icon gemacht.

    GML-Quellcode

    1. if (collision_point(mouse_x,mouse_y,obj_icon,true,true) && mouse_check_button(mb_left))
    2. {
    3. mx = -1;
    4. my = -1;
    5. exit;
    6. }

    So muss ich aber immer zuerst das Objekt anklicken und dann das Feld, weil die "mx" und "my" werte auf -1 gesetzt werden. Das möchte ich ändern.

    Anstatt die Werte auf -1 zu setzen, muss man irgendwie den Variablen die Werte des vorhergeklickten Feldes geben.
    Dann würde es gehen. Leider weiss ich nicht wie ich das machen soll :|

    Hoffe du hast verstanden, was ich meine. :D

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Also das dürfte nicht schwer sein ;D

    1.)
    Erstelle ein neues Objekt und nenne es einfach "prt_icons" (prt = parent)
    Lass dies einfach leer und drücke auf "OK"

    2.)
    Mache alle Icons zu child-objekte, indem du als Parent das objekt "prt_icons" nimmst.

    3.)
    Füge diesen Code bei den IF-Abfragen auch noch durch:

    GML-Quellcode

    1. !collision_point(mouse_x,mouse_y,prt_icons,true,true)

    Bei dieser Abfrage wird geguckt ob an der Stelle mouse_x und mouse_y mit den Object prt_icons (oder den Child objekten !!!!!) keine (!) kollision stattfindet.

    4.)
    Wenn keine Kollision mit einen Child-Objekt von prt_icons stattfindet, so wird das innere der if-abfragen gestartet.

    Hier den Code den ich aus mein Beispiel genommen habe:
    Spoiler anzeigen

    GML-Quellcode

    1. {
    2. if (collision_point(mouse_x,mouse_y,object0,true,true) && !collision_point(mouse_x,mouse_y,object0,true,true) && mouse_check_button(mb_left))
    3. {
    4. mx = -1;
    5. my = -1;
    6. }
    7. else if (!collision_point(mouse_x,mouse_y,object0,true,true) && !collision_point(mouse_x,mouse_y,prt_icons,true,true) && mouse_check_button(mb_left))
    8. {
    9. mx = floor(floor(mouse_x)/32)*32;
    10. my = floor(floor(mouse_y)/32)*32;
    11. }
    12. }
    Alles anzeigen


    Edit:
    Habe ich net getestet, aber müsste Funktionieren soweit ich den Überschlagen habe. ;D

    MFG
    Metalknight
  • Ok. Danke. Es klappt.

    Habe eben noch wenig mit Parens gearbeitet. ^^

    Mfg


    EDIT:

    Etwas kleines muss ich noch wissen.
    Wenn sich schon ein Objekt auf dem Feld, wo ich bauen will, befindet, soll nichts passieren bzw. mx und my = -1 setzen.

    Nun, wie macht man das?

    Mit if(place_free(mx,my)) hats nicht gefunzt
    Mit if(point_meeting(mx,my,prt_build) hats auch nichts gebracht (prt_build ist ein leeres childobjekt) :(
    Was für eine Formel muss ich nehmen? ?(

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Ich würde diese Formel nehmen:

    GML-Quellcode

    1. if (!collision_rectangle(mx,my,mx+32,my+32,prt_icons,true,true))
    2. {
    3. // tue dies...
    4. }


    collision_rectangle, guckt nach ob in diesen viereckt sich das objekt prt_build befindet. wenn nicht (!) dann macht er den code.

    Wenn du für icons und buildings das gleiche parents (im beispiel ja prt_icons) benutzt, so musst du alle abfragen wie gesagt mit prt_icons machen, damit das auf alle childs zu trifft.

    Mal wieda nicht getestet, sollte aber laufen ;D

    MFG
    Metalknight
  • Gut, das geht auch :) danke viel mals.

    Leider gibt es da noch etwas :rolleyes: .
    Ich möchte eine Box (Rechteck) zeichnen, die erscheint, wenn ich ich das Objekt anklicke. --> Dafür wähle ich deinen Code von oben --> Wenn sich das Objekt im Gebiet befindet und man klickt, wird die Box angezeigt.

    Das wäre nicht das Problem.

    Wenn ich jetzt mit dem aktuellen Code arbeite, wird, wenn ich auf ein Feld klicke, wo schon ein Objekt ist, und anschliessend auf ein leeres
    Feld klicke, ein Objekt erstellt. Das möchte ich gerne vermeiden.

    Darum habe ich einfach bei der Abfrage von dir, noch die (!collision) abgefragt und dann "mx" und "my" auf -1 gesetzt. Das würde als solches auch gehen.

    Nun, wenn ich die Abfrage aber so mache, kann ich die Felder, die schon besetzt sind, nicht mehr anklicken, da "mx" und "my" -1 sind.
    Dadruch geht dann die Box zum Zeichnen nicht mehr.

    Verstehst du, was ich meine?

    Ich knobel schon ewig daran ^^


    Hast du mir einen Tipp?

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Dieses mal muss ich zugeben versteh ich es nicht so ganz aber ich versuch es mal. =D

    Was ich meine:
    Du erstellst ein gebäude, und wenn du auf leere Felder klickst, kommt dort auch wieda das Gebäude, richtig???

    Mein Tipp:
    Im create event kommt eine variable die auf 0 steht. (zumbeispiel: build_this = 0; )

    Wenn man auf ein icon klickt wird diese Variable je nach gebäude die Variable auf einen anderen Wert gesetzt (1,2,3,... usw.)
    In dem man die Icon Objecte so bearbeitet, dass wenn man auf das icon klickt (die childs) je nach icon dieser code kommt:
    obj_controller.build_this = 1;
    als beispiel.

    Wenn nun build_this != 0 ist, wird ein gebäude gebaut. Aber erst nach dem neusetzten von mx und my, damit man die neusten Infos hat.
    Danach wird die info von build_this der Funktion scr_new_building(); weitergegeben, indem eine switch schleife ist, die prüft welches objekt wo gebaut werden soll.

    Aus meine beispiel

    GML-Quellcode

    1. else if (!collision_point(mouse_x,mouse_y,object0,true,true) && mouse_check_button(mb_left))
    2. {
    3. mx = floor(floor(mouse_x)/32)*32;
    4. my = floor(floor(mouse_y)/32)*32;
    5. if (build_this != 0)
    6. scr_new_building(build_this,mx,my);
    7. }


    So könnte scr_new_building aussehen:

    GML-Quellcode

    1. {
    2. switch(argument0)
    3. {
    4. case 1: instance_create(obj_building_1,argument1,argument2); break;
    5. case 2: instance_create(obj_building_2,argument1,argument2); break;
    6. default: break;
    7. }
    8. }


    Mit rechtsklick sollte man am besten die build_this variable auf 0 stellen können.
    Oder wenn man i.wo draufklickt wo man nichts machen kann.

    Gewonnt ungestet aber es sollte funktionieren xD

    MFG
    Metalknight
  • Ich denke zwar, das du das mit deiner Aussage gemeint hast...
    Hier nochmals genauer...

    Ich klicke auf ein Feld, wo ich das Gebäude platzieren will. Dann klicke ich auf das Icon und das Gebäude wird dort platziert.
    Wenn ich nun ein anderes Feld anklicke, wird es dort auch noch einmal platziert.

    Dannach geht es wieder so weiter.

    Also ich versuche deinen Tipp umzusetzen.

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • ups... Wenn du den Tipp von mir oben benutzt hasst, und auch den GML Code so benutzt hast, seh ich grade fehlt dort was.

    GML-Quellcode

    1. else if (!collision_point(mouse_x,mouse_y,object0,true,true) && mouse_check_button(mb_left))
    2. {
    3. mx = floor(floor(mouse_x)/32)*32;
    4. my = floor(floor(mouse_y)/32)*32;
    5. if (build_this != 0)
    6. scr_new_building(build_this,mx,my);
    7. }


    sollte zwar so weit richtig sein, aber die Variable build_this wäre nach den Bauen immernoch != 0. man müsste einfach hier noch build_this = 0; am ende einfügen.

    Also ganz einfach das hier:

    GML-Quellcode

    1. else if (!collision_point(mouse_x,mouse_y,object0,true,true) && mouse_check_button(mb_left))
    2. {
    3. mx = floor(floor(mouse_x)/32)*32;
    4. my = floor(floor(mouse_y)/32)*32;
    5. if (build_this != 0)
    6. {
    7. scr_new_building(build_this,mx,my);
    8. build_this = 0;
    9. }
    10. }
    Alles anzeigen


    Logischerweiße wird also dann build_this auf 0 gestellt, aber nur wenn man etwas gebaut hat.

    Wenn man nun auf ein neues Feld klickt, so wird wieder Überprüft ob build_this != 0 ist. Da man dies aber auf 0 gestellt hat nach dem Bauen, passiert beim nächsten anklicken nichts mehr.

    Würde man wie gesagt das vergessen dann würde build_this != 0 sein, und die if-schleife true ergeben, somit der code (scr_new_building()) ausgeführt werden, und ein neues gebäude gebaut werden.

    Hoffe es war verständlich und das was du meinst ^^.

    MFG
    Metalknight
  • Könntest du mir ein kleines beispiel-gm-file machen? Ich hab das ein wenig anders bei mir --> funzt irgendwie net.
    Vielleicht kann schaffe ich es ja so?

    Mfg
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Benutzer online 1

    1 Besucher