Kopie eines Objektes am Bildschirmrand erstellen

  • GM 8

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

  • Kopie eines Objektes am Bildschirmrand erstellen

    Moin,


    ich würde gerne folgende Sache tun:





    Was sehen wir auf dem Bild?

    Grün = ausserhalb vom Spielfeld
    die weiße Fläche + Kontur = der eigentliche Viewport
    türkis = Spawner
    rot = die Objekte welche vom Spawner erstellt wurden
    gelb = die Kopie des Objektes am Bildschirmrand mit einer festgelegten Höhe, einem anderen Sprite als vom Original jedoch der breite vom ursprünglichen Objekts.

    Ich weiß garnicht was ich dazu noch schreiben soll.. ich hoffe das Problem erklärt sich anhand von dem Bild.
    Falls nicht, versuche ich es nochmal zu beschreiben:

    Wir haben einen selbst erstellten Spawner, welcher auf der Breite des Raumes zufällig Objekte erstellt.
    Diese Objekte sind alle aus dem selben Grundsprite, werden jedoch durch Eigenschaften wie z.B.
    der Skalierung modifiziert.
    Diese Objekte fliegen automatisch nach unten. Was soll nun passieren? Bevor die Objekte den Viewport
    passieren, soll man am Bildschirmrand schon sehen, dass ein Objekt angeflogen kommt. Dieses wird durch eine Kopie des (mit einem anderen Sprite + fester Höhe aber der Breite vom ursprünglichem Objekt aber nicht dem restlichen Code welcher in dem Objekt drinne ist) Objekts angezeigt. Wenn das "richtige" Objekt den Viewport passiert, wird die exakt selbe Kopie gelöscht.


    Wäre lieb wenn mir da jemand helfen kann. Hab echt garkeinen Schimmer .. :/

    Vielen Dank schonmal & liebe Grüße,

    Ice21
  • Muss es denn unbedingt eine Kopie sein? Wie wäre es denn, im Draw Event der Objekte, zwei Sprites zu zeichnen? Eins an Position x,y, ein zweites an Position x,view_yview[0] oder eins im Draw Event, ein zweites im draw_gui event...
    Einige meiner Spiele:
  • Naja.. eine Kopie muss es nicht unbedingt sein.
    Würde nur gerne die Möglichkeit haben möglichst dynamisch mit dem "neu erstellten" Objekt zu arbeiten.

    Wie mache ich das denn am besten?
    Momentan lasse ich von einem Code (Spawner) einfach Objekte erstellen, welche im Stepevent einen Sprite angegeben haben... ich hab halt echt gar keine Ahnung wie ich am besten an die Sache rangehen soll. s:
  • Mach es so, wie interceptor vorgeschlagen hat.
    Zwei Sprites zeichnen lassen.

    Ich frag mich allerdings, was eine Spritezuweisung im Step-Event verloren hat, sofern der Sprite nicht jeden Step geändert wird.
    Sprites kannst du mit draw_sprite() im Draw-Event zeichnen.

    Dabei ist zu beachten, dass du dann auch den eigenen Sprite des Objektes drawen musst und er dann nicht mehr automatisch gedrawt wird.
  • Aber wie kann ich dann dem zweiten Sprite den ich gezeichnet habe noch eine weitere Funktion zuweisen? Das ist dann doch nur ein Sprite und kein Objekt?

    €: hab es jetzt soweit hinbekommen allerdings weiss ich nicht wie ich die Größe bzw. breite von dem anderen Sprite übernehme.
    €2:


    Arbeite jetzt damit


    GML-Quellcode

    1. if (global.kweiss == 1 ) {
    2. sprite_index=spr_weisse_kugel;
    3. image_speed = 0;
    4. image_index = 0;
    5. draw_self()
    6. draw_sprite_ext(spr_vorhersage, -1 ,x,view_yview[0],spr_weisse_kugel.x/1, 1,0, -1, 1)
    7. }


    bekomme es aber nicht hin a) die richtige Größe zu erstellen und b) das ganze im Center von dem Ding zu erstellen.. d.h. es ist immer verschoben c) jedes mal wenn ein Objekt zerstört wird, werden die vorhanden Quadrate ca um 1/3 kleiner gemacht.. und nach 3x fängt das ganze von vorne an...

    €3:

    Der Sprite des erstellten Objekts ( der Kugel = rot ) ist 32 breit und 32 hoch, dessen Zentrierung ist auf 16/16 gestellt.

    Dieser Sprite wird von

    GML-Quellcode

    1. if (global.kweiss == 1) {
    2. if (counter > 0 ){
    3. counter -=1;
    4. }else{
    5. var spawn;
    6. spawn = choose(0,1,2,3);
    7. if (spawn = 1){
    8. randomgroesse = instance_create(x,y,obj_weisse_kugel)
    9. with(randomgroesse)
    10. if ( score >= 0 && score <=9 ) {
    11. image_xscale = 1; // hier wird dieser skaliert
    12. image_yscale = 1; // hier wird dieser skaliert
    13. draw_self()
    14. }
    Alles anzeigen


    skaliert. hab es zum testen erstmal bei 1 gelassen.. wird später aber dynamisch sein und kann mal 2/3 etc. sein

    die gelbe Kopie hat folgende Werte:

    Breite: 2 Pixel Höhe(x): 11 Pixel(y) und ist zentriert bei 1/5

    und wird mit diesem Code erstellt:

    im draw.event

    GML-Quellcode

    1. if (global.kweiss == 1 ) {
    2. sprite_index=spr_weisse_kugel;
    3. image_speed = 0;
    4. image_index = 0;
    5. draw_self()
    6. draw_sprite_ext(spr_vorhersage, -1 ,x,view_yview[0],spr_weisse_kugel.x/16, 1,0, -1, 1)
    7. }


    Hab den spr_weisse_kugel.x/16 drinne damit

    die Kopie (2 Pixel breit) * 16 multipliziert wird und damit theoretisch 32 Pixel hat .. genauso wie das Original. Funktioniert aber nicht..

    jmd. eine Idee? :)

    €: ehh.. meine Rechnung ist ja total Banane.. wenn ich das durch 16 teile, müsste das Ergebnis 4 Pixel breit sein. Ist es aber nicht.. aber wenn ich dort durch 2 teile ist es VIEL ZU riesig und nicht anähernd in der Nähe von dem benötigtem Ergebnis ...

    €:

    ich hab es jetzt anscheinend geschafft die richtige größe + den Skalierungsfaktor mit einzuberechnen mit folgender Formel:

    GML-Quellcode

    1. draw_sprite_ext(spr_vorhersage, -1 ,x,view_yview[0],spr_weisse_kugel.x/22*global.randomgroesse.image_xscale, 1,0, -1, 1)


    ich verstehe allerdings noch immer nicht, warum ich das ganze durch /22 teilen muss (hab solange ausprobiert bis es fast genau stimmt.. )
    wie ist denn die korrekte Rechnung dafür? Würde gerne den Wert verstehen..

    Übrigens: das Problem mit dem "plötzlich kleiner werdenden Klonen besteht weiterhin und wie kann ich den erstellten Sprite bei kollision mit seinem RICHTIGEN Klon zerstören?

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von Ice21 ()

  • Was gibst du da den für Werte an bei xscale und yscale an?
    Die Skalierung soll doch die selbe sein, wie die des ausführenden Objektes, also:

    GML-Quellcode

    1. draw_sprite_ext(spr_vorhersage, -1 ,x,view_yview[0],image_xscale, image_yscale,0, -1, 1)

    Wundert mich, dass "spr_weisse_kugel.x" keine Fehlermeldung verursacht, da Sprites meines Wissens keine Variablen haben.

    Statt die Kopie zu zerstören, drawe sie einfach nicht mehr.
    Daher setz vor das drawen der Kopie eine Bedingung:

    GML-Quellcode

    1. if y<0
    2. {
    3. //draw_sprite...
    4. }

    Zeichnet den Sprite nur so lange das Objekt oberhalb des Rooms ist,