problem mit objekten

  • problem mit objekten

    hallo,
    ich habe gestern mal wieder den gm hervrogekramt und an meinem projekt weitergearbeitet.. leider bin ich schon heute kurz vorm verzweifeln, da ich mit meinem latein am ende bin und einfach keine lösung weiß, bzw. den fehler noch nicht mal finde..
    ich habe diesen code in den room creation code gepackt und möchte damit bezwecken, dass zufällig große, schwarze rechtecke erstellt werden, und für diese jeweils ein eigenes object erstellt wird.. soweit so gut.. als ich das ganze noch ohne objekte hatte ging es auch, aber so werden mir die rechtecke einfach nicht angezeigt (ich weiß noch nicht mal, ob die objekte überhaupt erstellt wurden, bzw. im raum platziert werden).

    GML-Quellcode

    1. //nur um einen schwarzen rand zu bekommen
    2. draw_clear(c_black);
    3. draw_set_color(c_white);
    4. draw_rectangle(10, 10, 790, 590, false);
    5. draw_set_color(c_black);
    6. n = 20+round(random(5)); //20-25 rechtecke sollen erstellt werden
    7. for(i=0;i<n;i+=1){
    8. wall[i] = object_add();
    9. object_set_solid(wall[i], true);
    10. object_set_visible(wall[i], true);
    11. xpos1 = random(800);
    12. xpos2 = 10+xpos1+random(100); //+10, damit die rechtecke nicht zu klein sind
    13. ypos1 = random(600);
    14. ypos2 = 10+ypos1+random(100); //s.o.
    15. //surface erstellen und rechteck darauf zeichnen
    16. surf_draw = surface_create(xpos2-xpos1, ypos2-ypos1);
    17. surface_set_target(surf_draw);
    18. draw_rectangle(xpos1, ypos1, xpos2, ypos2, false);
    19. surface_reset_target();
    20. spr_rect[i] = sprite_create_from_surface(surf_draw, xpos1, ypos1, xpos2-xpos1, ypos2-ypos1, true, false, false, true, 0, 0) //sprite von surface erstellen
    21. surface_free(surf_draw);
    22. object_set_sprite(wall[i], spr_rect[i]); //sprite zuweisen
    23. //object platzieren
    24. wall[i].x = xpos1;
    25. wall[i].y = ypos1;
    26. }
    Alles anzeigen

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

  • Afroman schrieb:

    Ich verstehe nicht mit welchem zusammenhang du das machst ? Du könntest copyboy fragen wie das geht, der ist aber derzeit grad nicht on.
    naja, ich hab den quelltext mal kommentiert, damit man es vllt etwas besser versteht.. der zsuammenahng ist, dass ich die objekts später brauche, um kollisionsabfragen machen zu können. ich schreibe atm ein minispiel, indem 2 spieler mit panzern rumfahren können und sich abschiessen können. die schüsse sowie die panzer sollen logischerweise nicht über die schwarzen flächen fahren/fliegen können und deshalb wollte ich diese als objekte erstellen.
  • :D
    Siehe Hilfe:
    Sei gewarnt! Das Verändern von Ressourcen führt leicht zu schweren Fehlern in deinem Spiel!!! Du musst folgende Regeln befolgen:

    • Verändere keine Ressourcen die gerade benutzt werden. Dies führt zu Fehlern! Verändere beispielsweise keine Sprites welche gerade von einer Instanz benutzt werden.
    [...]

    Generell solltest du keine Ressourcen während des Spielablaufes ändern. Erstelle und verändere Ressourcen am Beginn des Spieles oder vielleicht am Beginn eines Raumes.


    EDIT: Ich glaube ich habs! Ein Objekt ist noch lang keine Instanz... Also musst du erst mit dem Code eine erstellen.

    GML-Quellcode

    1. instance_create(xpos1,ypos1,wall[i]);
    2. // Hehe, das [i] formatiert ja den Text xD

    EDIT2: O_o Die Argumente waren falsch rum ^^

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

  • Kann man überhaupt im room creation event zeichnen? Also ich meine die ersten paar Zeilen code. Die werden ja nicht aufs Surface gezeichnet.

    Jetzt bin ich mir nicht sicher ob man im creation code zeichnen kann, aber ich bezweifle es.

    Außerdem ist "wall"das Objekt und nicht die Instanz.

    Du musst erst mal eine Instanz erstellen, um die x und y Werte zu verändern.



    Edit: Copyboy du... :heul:

    © 2008 by Teamgrill Productions
  • âutsch... war ja klar, dass es irgendwas so offensichtliches ist... aber vielen dank, ich werde es ausprobieren...

    das zeichnen funktioniert btw im room creation event bestens... denn das wird ja bei der initialisierung vom raum ausgeführt und ersetzt somit zb. auch die background eigenschaften. (würd ich zumindest mal vermuten.. weiss aber, dass es auf jeden fall in meinem fall funktioniert).



    edit: scheint aber irgendwie immer noch nicht zu funktionieren..
    ich hab folgendes editiert:

    GML-Quellcode

    1. object_set_sprite(wall[i], spr_rect[i]); //sprite zuweisen
    2. //instanz erstellen
    3. rect[i] = instance_create(xpos1, ypos1, wall[i]);
    4. } //das ist das ende der for-schleife
    5. instance_activate_all();

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Lord_Doominik ()

  • Ok, da is wat falsch beim auf die Surface drawen...

    GML-Quellcode

    1. surf_draw = surface_create(xpos2-xpos1, ypos2-ypos1);
    2. surface_set_target(surf_draw);
    3. draw_rectangle(0, 0, xpos2-xpos1, ypos2-ypos1, false); // <= Hier war er
    4. surface_reset_target();
    5. spr_rect[i] = sprite_create_from_surface(surf_draw, xpos1, ypos1, xpos2-xpos1, ypos2-ypos1, true, false, false, true, 0, 0) //sprite von surface erstellen
    6. surface_free(surf_draw);


    EDIT: :thumbsup:

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

  • copyboy schrieb:

    Ok, da is wat falsch beim auf die Surface drawen...

    GML-Quellcode

    1. surf_draw = surface_create(xpos2-xpos1, ypos2-ypos1);
    2. surface_set_target(surf_draw);
    3. draw_rectangle(0, 0, xpos2-xpos1, ypos2-ypos1, false); // <= Hier war er
    4. surface_reset_target();
    5. spr_rect[i] = sprite_create_from_surface(surf_draw, xpos1, ypos1, xpos2-xpos1, ypos2-ypos1, true, false, false, true, 0, 0) //sprite von surface erstellen
    6. surface_free(surf_draw);

    achso.. wenn man auf das surface schreibt verhalten sich die x und y-werte relativ?? gut, ich dachte, dass da absolute werte reinmüssen.. und hab deshalb halt die x und y-positionen am bildschirm ausgewählt..

    perfekt... vielen dank... musste den andren wert dann halt logischerweise auch noch veränder (also denim sprite_create_from_surface).. hier nochmal der endtext und damit ists auch solved:

    GML-Quellcode

    1. draw_clear(c_black);
    2. draw_set_color(c_ltgray);
    3. draw_rectangle(10, 10, 790, 590, false);
    4. n = 20+round(random(5));
    5. for(i=0;i<n;i+=1){
    6. obj_rect[i] = object_add();
    7. object_set_solid(obj_rect[i], true);
    8. object_set_visible(obj_rect[i], true);
    9. xpos1 = random(800);
    10. xpos2 = 10+xpos1+random(100);
    11. ypos1 = random(600);
    12. ypos2 = 10+ypos1+random(100);
    13. surf_draw = surface_create(xpos2-xpos1, ypos2-ypos1);
    14. surface_set_target(surf_draw);
    15. draw_set_color(c_black);
    16. draw_rectangle(0, 0, xpos2, ypos2, false);
    17. surface_reset_target();
    18. spr_rect[i] = sprite_create_from_surface(surf_draw, 0, 0, xpos2-xpos1, ypos2-ypos1, true, false, false, true, 0, 0)
    19. surface_free(surf_draw);
    20. object_set_sprite(obj_rect[i], spr_rect[i]);
    21. wall[i] = instance_create(xpos1, ypos1, obj_rect[i]);
    22. }
    23. instance_activate_all();
    Alles anzeigen