Objekte in einem Raster erstellen

  • Objekte in einem Raster erstellen

    Ich habe wieder eine Frage.^^

    Ich will durch Zufall Blöcke (32x32 Pixel) in einem Raster das auch 32x32 Pixel hat, erstellen. Dies, soll aber nur in der Linken hälfte des Rooms (640 x 480 ) der fall sein.

    Wie macht man solche "Raster" und wie created man Objekte im Raster? Ich bewege mich da leider auf komplettem Neuland. Ich habe mir auch schon das example auf Yoyogames angeschaut (Maze Games) Bin aber nicht schlauer geworden. :(

    Im Prinzip wollte ich ein Raster in einem Bestimmten Bereich realisieren.^^

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

  • Dein Problem lässt sich relativ einfach mit folgendem Code lösen:

    Create-event irgendeines Objektes:

    GML-Quellcode

    1. repeat (10) // Hier Anzahl der Blöcke angeben
    2. {
    3. instance_create(random(320),random(480),obj_block); // Zufällige Erstellung der Blöcke in der linken Raumhälfte (320x480)
    4. }
    5. with (obj_block)
    6. {
    7. x = round(x/32)*32; // Rasterung der Blöcke
    8. y = round(y/32)*32;
    9. }
  • Wie genau funktioniert der Script mit dem Rastern der Blöcke? Ich versteh ihn nicht ganz. (Ich will dabei was lernen.^^)

    Noch eine kleine Frage nebenbei:
    Ich habe den Script: if (place_free(x + 0, y + 3))
    Die Zahl 3...gebe ich da an:
    3 Pixel von y entfernt, oder 3 Rastern von y enfternt? (In GM: 16x16 Raster im Room...)

    Ich habe nie wirklich gewusst was es da angibt...
  • All zu schwer dürfte der Code ja eigentlich nicht zu verstehen sein.
    Ich meine repeat lässt sich ganz einfach ins deutsche übersetzen (wiederhole) und der Parameter dieser Funktion gibt an, wie oft der folgende Code in den Klammern ausgeführt werden soll. In diesem Fall 10 mal.
    Wenn wir uns die Funktion instance_create(x,y,obj) anschauen, und wissen dass die Raumhälfte, in der die Blöcke zufällig erstellt werden sollen, 320*480 groß ist, dann kann man ganz einfach die Funktion random() benutzen. Die Funktion wählt nun eine zufällige Zahl aus von 0 bis zur definierten Zahl. Also soll das Objekt Block an der Position X = Zufällig zwischen 0 und 320 und Y = Zufällig zwischen 0 und 480 erstellt werden.
    with objekt_name bedeutet immer, dass das folgende sich nicht auf das Objekt, indem wir uns befinden, bezieht, sondern auf das definierte Objekt (Block). Dessen koordinaten sollen nämlich nach der Zufallserstellung ans Raster angepasst werden. Die Funktion round() rundet einen Wert, wenn wir also die generierte X Koordinate (Bsp: 175) durch 32 teilen, kommt dort ~5,47 raus. Gerundet 5. Man rechnet 5 * 32 = 160. Genauso funktioniert die Anpassung mit dem Y-Wert. Dadurch passt sich das Block dem Raster an, da es immer auf einen durch 32 teilbaren Punkt liegt.

    Ich hoffe du kannst es jetzt verstehen, ansonsten kann ich dir nur die Hilfe ans Herz legen. Such dort einfach nach Funktionen im Index. Dort wird beschrieben wie alles funktioniert.
    Bei (place_free(x + 0, y + 3)) und anderen Wertveränderungen dieses Types werden Pixel addiert und keine Raster.

    Edit: Danke Richlord^^, habe meinen Beitrag verbessert.

    ____
    Adventskalender 2010: Blue Smiley

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

  • Zu meinem Script:
    Zunächst werden 10 zufällig generierte Blöcke im Raum erstellt. Das Repeat-Statement wiederholt dabei 10 mal die Erstellung eines einzigen Blockes. Um die Blöcke nur in der linken Hälfte des Raumes zu erstellen, ist bei der random-Funktion nur die Hälfte der X-Achse innerhalb des Raumes verfügbar (also 640/2 = 320 Pixel). Die Wahl einer Y-Koordinate wird nicht beeinflusst, denn die linke Hälfte teilt nur die horizontale Dimension, die X-Achse, auf.
    Danach wird jeder erstellte Block an ein 32x32-Raster angepasst. Es wird also zunächst mit dem with-Statement auf jeden Block zugegriffen. Dann wird die X-Position des Blockes durch 32 geteilt, gerundet und wieder mit 32 multipliziert. Der X-Wert wird also gerastert. Dasselbe geschieht anschließend mit dem Y-Wert, so wird die gesamte Position gerastert.

    Die Additionswerte bei der place_free-Funktion werden in Pixeln angegeben.

    EDIT:
    Ja was, zu spät?
    Aber eines habe ich trotzdem nachzutragen: Gimero, die Funktion round(x) rundet auf den nächstbesten Ganzzahlwert, nicht unbedingt auf den nächsthöheren, also z.B. bei round(5.42) = 5 ;).

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

  • Nun ja, meine Frage bezog sich eigentlich nur auf die Befehle mit dem runden der Werte.^^ (War mein Fehler das ich es nicht ausführlich genug gefragt habe.)

    Nun... Zu meiner Frage mit Place_free.

    Ich habe 2 Objekte (Blöcke) die sind natürlich gleich groß. ins step event füge ich ein:

    GML-Quellcode

    1. if(place_free(x+0,y+1)){
    2. vspeed = 9;
    3. }else{
    4. vspeed = 0;
    5. }


    Das Problem: Der Block "versinkt" immer um 3-4 Pixel weiter in den darunterliegenden block. Egal ob ich y+1 oder y+5 eingebe. Ausnahme: Wenn ich werte wie y+15 oder y+32 eingebe. Ich weiss eben nicht wieso.

    Weiss da jemand rat?
  • Das liegt daran, dass der Block sich in jedem Step um 9 Pixel nach unten bewegt. Wenn du also in einem Moment abfragst, ob sich ein anderer Block zwei oder drei Pixel unter dem betroffenen Objekt befindet, so kann als Antwort nein (false) zurückgegeben werden. Im nächsten Step springt das Objekt dann 9 Pixel nach unten und findet sich - zur vermeintlichen Überraschung aller - innerhalb eines anderen Blockes wieder.

    Abhilfe schafft die Funktion move_contact_solid bzw. move_contact_all, sowie ein früheres Abfragen der unterliegenden Blöcke. Schreibe also ins Step-event des Objektes:

    GML-Quellcode

    1. if (place_free(x,y+vspeed)) // Wenn kein unterliegender Block vorhanden
    2. {
    3. vspeed = 9; // Vertikalgeschwindigkeit auf 9 setzen
    4. }
    5. else // Wenn doch unterliegender Block vorhanden
    6. {
    7. move_contact_solid(270,vspeed); // Auf Kontakt treffen (Richtung: 270 (unten), Maximale Bewegungsdistanz: vspeed)
    8. vspeed = 0; // Vertikalgeschwindigkeit stoppen
    9. }

    Damit das funktioniert muss der Block übrigens solid sein, ansonsten musst du move_contact_all verwenden. Ich selbst finde allerdings eine Abfrage mit place_meeting schöner als mit place_free, das ist aber eigentlich nur Geschmackssache.
  • Danke! Das hat mir sehr geholfen.

    Und ich habe noch eine aller-allerletzte Frage. :)

    Ich habe mehrere Rooms die gleich heisen. Wie wechsel ich jetzt von Room 1 zu room 3 wenn sie gleiche namen haben? Ic hhabe es schon mit Room index versucht, doch anscheinend lässt sich der Index nicht von vornerein einstellen. die Räume haben unterschiedliche indexwerte. (Sind durcheinandergeworfen.) Kann ich den Index schon im GM verstellen oder gibt es da eine andere lösung?
  • Ich versuche es so zu erklären:

    Ich habe 3 Rooms.
    Im ersten ist das Menü, im 2ten ist das Profil und im dritten ist das Spiel selber.

    Alle Rooms heißen "GAME". (Der Name der in der Leiste des Spielfenster eingeblendet ist.)
    Nun will ich wenn ich Profil klicke das das Spiel zum Profilraum wechselt(Raum2) und beim klick auf Start dass es zum Spiel selber wechselt.(Raum3.)

    Das Probem: Jeder Raum heißt gleich. Der Inhalt ist aber nicht der gleiche.
    Ich will eben das im Spielfenster nicht immer "Profil" oder "Start" steht (wenn ich dann die exe starte) Sonder das immer der name des Games eingeblendet wird.

    Doch da der Name gleich ist weiss ich nicth wie ich angeben soll zu welchem Raum er wecheln soll. Wenn ich schreibe "room_goto(GAME)" dann kann es doch nicht funktionieren da es 3 Räume mit dem Namen gibt.

    Wie löse ich das?
  • Prinzipiell sollte man immer verschiedene Namen verwenden, das gilt auch für Sprites und Objekte, denn so besteht die Möglichkeit, dass Bugs entstehen. Was ich bei deinem Problem nicht verstehe ist, wo bei der *.exe der Roomname angezeigt wird. Wenn ich ein Projekt starte, sehe ich in der Gameleiste nur das Gamemakersymbol und unten in der Windowsleiste den Namen des Spiels.

    ____
    Adventskalender 2010: Blue Smiley
  • Mann bin ich blöd... :headtouch:

    Hab mich wie immer verwechselt. In letzter Zeit bin ich irgendwie Chaotisch was Game Maker angeht. Dieses "Caption of the Room" wir in der Leiste angezeigt.. nicht der Roomname...

    Danke. Ihr habt mir wieder geholfen. ^^

    Thema hat sich erledigt.
  • Benutzer online 2

    2 Besucher