Warum drawt das Objekt nach dem zertören?

  • GM 8

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

  • Warum drawt das Objekt nach dem zertören?

    Hallo Leute,

    ich habe ein seltsames Problem. In einem RTS hab ich ein Interface. Ein Bestandteil davon sind kleine Objekte die durch einen String erstellt werden. In diesem string der ausgeführt wird wenn das interface für eine bestimmte Einheit erstellt werden muss.
    In dem String is auch die Sprite sowie mehrere Variablen für jdes einzelne dieser Objekte festgelegt.
    Da das Objekt mehrere Sprites haben kann ist im Draw event des objects dies: draw_sprite(sprite_index,-1,x,y);
    Dies funktioniert gut. Jedoch hab ich auf einmal das Problem dass wenn ich in einem Event das Objekt zerstöre um das Interface auf eine andere Einheit umzustellen, kommt manchmal diese Fehlermeldung:

    Trying to draw non-existing sprite.

    Weiss einer wie ich dies lösen könnte?
    Wie kann so ein Fehler überhaupt auftauchen. Ich hab in keinem Code eine Aktion um irgend eine Sprite zu löschen.

    lg, a dragon



    edit: sorry für Rechtschreibfehler falls einer dadurch verwirrt wurde xD

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von DragonGamer ()

  • hm, das wär schwierig, da das ganze auf verschiedene Objekte verteilt ist etc.
    Hab jetzt entdeckt warum dies nur manchmal passiert.
    Um das zu erklären muss ich noch ein bisschen weiter das Prinzip erklären.
    Als Vorbild für mein ganzes Spiel hab ich Starcraft genommen. Daher funktioniert das Interface ziehmlich ähnlich.
    Man hat im Interface einige Funktionen wie patroulieren, bewegen, angreifen, sowie jeweils einen Knopf zum Bauen von Einheiten, die einheit/Gebäude erweitern und Erforschen. Wenn man eins der Knöpfe drückt, ändert sich das Interface zu einem Menü wo man sachen wählen kann. Man drückt auf ein object und startet z.b. das Erforschen einer Sache
    und es wird das "problematische Objekt erstellt" dass auch anzeigt wie weit die Forschung ist usw.
    Hab vorhin was falsch geschrieben. das problematische Objekt wird normal im Code erstellt, nicht in einem String, aber egal.

    Wie in SC kann man auch während des Forschens eine andere Einheit anklicken. Dadurch wird das Interface neu erstellt, damit das bauen des anderen Objects im Hintergrund läuft und man wenn man es wieder anklickt das Forschungs-Menü sofort wieder erscheint, werden diese problem-Objekte beim Demarkieren noch nicht zerstört, sondern nur unvisible gemacht.
    Wenn jetzt (nach einem weg- und wieder anklicken) die Forschung fertig ist, soll das problem-Objekt zerstört werden.
    Genau dann erscheint die Fehlermeldung :/

    Ich weiß, das ist ziehmlich schwer zu verstehen. hoffe man versteht es doch. Es tritt auch nur wenn man dies beim Forschen macht!
    Beim Bauen oder Entwickeln (anderes gebäude anbauen), passiert das seltsamer weise nicht.

    Habs hier hochgeladen. Bin noch am Basteln des engines und am Interface. somit is kaum eine Grafik (außer die des interfaces) gut xD einheiten sind die kleinen blöcke. gebäude die großen.
    Wenn man das gebäude markiert erscheinen die 6 knöpfe.
    Das mittlere unten, ist dass zum Forschen.


    Mein Code, ist vileicht ein kleeiin wenig unübersichtlich (mit viel Sarkasmuss ausgedrückt xD).
    Hoffe man kann es verstehen :/
    Dateien

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)
  • Also ein fehler ist das du in dem Besagten objekt "obj_in_building_queue" den befehl gibst

    GML-Quellcode

    1. draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,0,image_blend,image_alpha);

    Da du diesen Objekt(insatance) aber keinen Sprite zugewiesen hast, weis das Spiel nicht welchen Sprite er Drawn soll.

    Des Weiteren muss ich dir sagen das das Menü auch extrem umständlich gemacht ist. Hab ich früher zwar auch so gemacht aber mitler weile kann ich nur jeden nahe legen mit Koodinaten zu arbeiten da das Objekte spart.
    hier mal
    Hier ist mal ein Button script wie ich es benuttze und für verschiedene Buttons aufrufe

    GML-Quellcode

    1. //script name=scr_button
    2. x1=argument0
    3. y1=argument1
    4. x_size=argument2
    5. y_size=argument3
    6. sprite1=argument4
    7. img_nr=argument5
    8. if mouse_x>(view_xview+x1) and mouse_x<(view_xview+x1)+x_size and mouse_y> view_yview+y1 and mouse_y<(view_yview+y1)+y_size then
    9. {
    10. draw_sprite(sprite1,img_nr+1,view_xview+x1,view_yview+y1)
    11. if mouse_check_button_released(mb_left) then { DEIN BEFEHL BEIM BUTTON KLICK}
    12. } else {
    13. draw_sprite(sprite1,img_nr,view_xview+x1,view_yview+y1);
    14. }
    Alles anzeigen

    und aufgerufen wird es so

    GML-Quellcode

    1. scr_button(posx,posy,spritebreite,spritehöhe,spritename,spritenummer)

    So sparst du platz und must nicht den oberen text immer wieder kopieren. und kannst es immer aufrufen.

    Diese Menüs basieren also darauf nicht ob deine Maus ein Button-Objekt berühern, sondern ob die maus sich in einer Bestimten Region befindet und zwar der, dort wo der Butten Sprite gezeichnet wird.
    Ich mache das nur noch so. Es erspart ein viel arbeit und kleiner tip. Wenn du ein 3d spiel mal machen solltest, macht man so das Interface, da die x und y axe nicht mehr auf dem Bildschirm verfügbar sind
    Meine Signatur hat kein Visum für das GM Forum erhalten.
  • x-sascha schrieb:



    Also ein fehler ist das du in dem Besagten objekt "obj_in_building_queue" den befehl gibst

    GML-Quellcode

    1. draw_sprite_ext(sprite_index,image_index,x,y,image_xscale,image_yscale,0,image_blend,image_alpha);

    Da du diesen Objekt(insatance) aber keinen Sprite zugewiesen hast, weis das Spiel nicht welchen Sprite er Drawn soll.


    Das Object soll universell sein. Später wird es dutzend verschiedene Sachen zum erforschen geben.
    Darum wird die Sprite beim erstellen des Objektes zugewiesen.
    (Schau im Clickevent von Objekt build_a_unit) (der Name ist äußerst upassend, ich weiß. Es war anfänglich nur für Knöpfe zum Bauen von Einheiten gedacht, jetzt macht es aber alle Sachen).
    Der Fehler kommt ja nicht am Anfang wenn das Objekt erstellt wird, sondern erst beim Zerstören und das auch nur unter Umständen.
    Das ist das seltsame. Einmal zugewiesen, mach ich die Sprite für das Objekt nirgens mehr weg, daher ist das komisch.
    Mir scheint es so als obj beim Zerstören, das Objekt seine Sprite verliert aber dannach doch noch den step zuende führt und dann beim drawen den Fehler hervorruft.


    EDIT: Mir ist grad was aufgefallen. Der einzige Unterschied zwischen, wenn man das Forschen normal startet und zuguckt bis es ausläuft, und wenn man in der Zwischenzeit wegklickt und dann wieder anklickt (nur dann komm der Fehler) ist das das problem-Objekt einmal auf visible = 0 und dann wieder visible = 1 gesetzt wird.

    Kann es dadurch Probleme geben?


    Einen Button anstelle des Objektes zu machen lohnt sich irgendwie nicht das Objekt ist eigentlich nur zur Anzeige gedacht und es funktioniert eigentlich bis auf diese Fehlermeldung sehr gut.

    Willst du auf diese Drachen und -eier klicken?
    Sie werden sich freuen ;)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von DragonGamer ()

  • Benutzer online 1

    1 Besucher