Game Maker 7.5 (Mac) Objekt an animiertes objekt "binden"

  • GM 7

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

  • Game Maker 7.5 (Mac) Objekt an animiertes objekt "binden"

    Hallo zusammen,

    im Vorhinein ich bin total neu im erstellen eines Spiel und somit auch sehr neu in GameMaker. Also helfen mir komplizierte Lösungen ohne genaue Beschreibung nicht weiter :D

    ich bin jetzt auf mein ersten Problem gestoßen. Ich haben ein in AE animiertes Objekt an das ich ein weiteres Objekt binden will (das es die Bewegung mit macht). ich kann es aber nicht einfach schon in AferEffects in die Animation machen, da ich das Objekt in GameMaker noch per Steuerung rotieren lassen möchte.

    Also um es spezifischer zu sagen. Ich habe einen Baum den dich animiert haben, dass es so aussieht das er sich im Wind bewegt. Das andere Objekt ist ein Blatt. Es soll natürlich immer an der gleichen stellen eines Astes "Befestig" sein.
    Die Position das Blattes per Hand an die richtige position zu animieren ist auch keine Lösungen, da es im laufe das Spiel viele Blätter werden und es dann einfach zu viel abriet bedeutet.

    Ich hab mich schon n bisschen umgeguckt und denke, dass ein Tool für Animationen mir Knochen wahrscheinlich die Lösungen wären. Aber da ich nur einen Mac besitze und ein armer student bin und mir "Spine" nicht leisten kann is das auch ein Problem Aber evtl. wisst ihr ja, ob es dafür ein tool in Game maker gibt, um die beiden Objekte zu verbinden.

    ich hoffe das war einigermaßen verständlich (ich hab noch ein kleines screenshot angehängt um das Szenario vll besser zu verstehen)
    beste Grüße
    Jan
  • So einfach wird das leider nicht :D
    Es gibt verschiedene Möglichkeiten, dass zu lösen. Ich nehme an, dein Spiel ist in 2D und somit setzt sich dein Bewegungsablauf aus einzelnen Sprites zusammen.
    Wenn du mehrere Blätter hast und diese alle aus einzelnen Objekten bestehen musst du mit der Performance aufpassen. Der Game Maker mag nicht so viele Objekte auf einmal :D
    Eine Möglichkeit wäre es, wenn dein Blatt auch die selbe Animation macht, also sich z.B. nach rechts und wieder nach links bewegt. Anders geht es, wenn du einfach die x und y Position des Blattes bestimmst, mit Sinus und Kosinus kannst du eine gleichmäßige Wellenbewegung machen. Wenn du es auch noch Rotieren lassen möchtest, musst du mit lengthdir_x und lengthdir_y arbeiten. Dort kannst du den Drehpunkt bestimmen, also z.B. der Origin vom Baum.
    Ein Objekt kannst du leider nicht direkt mit einem anderen koppeln, wenn es um eine Animation aus Sprites geht.

    Falls du genauere Hilfe brauchst, brauchen wir auch mehr Informationen, woraus deine Animation besteht, etc. :D
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • ouh man da hab ich ja was angefangen. Hab mir gedacht ich mach was schön einfaches, damit ich erstmal rein komme. Aber min Prof hat des jetzt schon so abgenommen also kann ich die Idee nicht mehr ändern.

    nuja, also die animation hab ich mit 60fps (wahrscheinlich muss das garnich so viel sein, auch wenn ich das spiel auf 60 fps gestellt habe oder?) aus After effects als png Sequenz gerendert. dann ganz normal als sprites reingeladen. Das funktioniert auch alles wunderbar. der stamm steht fest auf dem Boden und der Ober teil des Baumes biegt sich leicht hin und her.
    Die Rotation des Blattes hab ich auch schon eingestellt. Es sieht jetzt halt nur blöde aus, dass der ankerpunkt des Blattes auf einer stelle bleibt und der Baum sich leicht bewegt.

    gr3noull3 wenn ich es über draw_sprite_ext() machen. kann ich dann irgendwie die Koordinaten von den einzelnen punkten am Baum abfragen?

    im forum von Game maker hatten sie mir noch : " Skeletal animation" als Stichwort gegeben aber da kam ich nur auf "Spine" und co, da GameMaker wohl so eine Funktion nicht hat. Bzw hier mal der link zu meinen post: gmc.yoyogames.com/index.php?showtopic=635459&hl=

    evtl bringt euch das noch auf ne Idee. ich versteh das alles nicht so ganz, obwohl ich mein englisch jetzt nicht so schlecht einschätze :D

    danke schonmal für die Hilfe
    bestens
    Jan
  • Aaalso,

    Ich hätte die Animation nicht im Sprite gemacht sondern im daw-Event des Objektes Baum. Da kannst du dann Winkel vom Stamm eingeben wenn er sich im Wind bewegen soll. Und dann ein Zweig an den Baum drawen, was auch leicht fällt, da du nur den Winkel und den Abstand vom Nullpunkt des Stammes mit einbeziehen musst. An den Zweig kannst du dann auch über einfache winkelfunktionen die Position deines Blattes festlegen.
    Kann auch sein dass mein Ansatz jetzt nicht geeignet ist oder das ganze besser zu realisieren ist. Es kommt halt drauf an wie viele Blätter du haben möchtest.

    Wenn es mehrere Tausend an dem Baum sind dann mach doch einfach Ne ganze baumkrone die sich im Wind mitbewegt. Diekannst ja aauch in der Animation mit einbeziehen.
  • drschnuggels schrieb:


    ...
    gr3noull3 wenn ich es über draw_sprite_ext() machen. kann ich dann irgendwie die Koordinaten von den einzelnen punkten am Baum abfragen?
    ...
    Jan


    Wie gesagt, kann man das mit lengthdir_x und lengthdir_y bestimmen. Game Maker Info
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • particle problem

    Hallo,

    da bin ich wieder (war im Urlaub)

    danke für die tipps, aber das is irgendwie dann doch alles n bisschen komplizierter als ich gedacht hab. Dafür bin ich noch zu neu in GameMaker bzw. beim programmieren.

    der Baum steht jetzt einfach still :D

    Jetzt hab ich die nächste Frage. Ich hab jetzt ein Particle System erstellt um "schmutzparticle in der Luft darzustellen. Leider leidet die performance total daran. und das Speil wird total langsam (3-5 fps).

    mein Code:

    create event:

    sys = part_system_create();
    part_system_depth(sys,0);

    part = part_type_create();
    part_type_shape(part, pt_shape_pixel);
    part_type_size(part, .4 , .8 , 0 , 0 );
    part_type_color1(part, c_black);
    part_type_direction(part, 180 , 180 , 0 , 60 );
    part_type_speed(part, 2, 4, 0, 0);
    part_type_life(part,500,500);

    emit = part_emitter_create(sys);
    part_emitter_region(sys,emit, room_width, room_width+10, 0, room_height, ps_shape_rectangle , ps_distr_linear);
    part_emitter_stream(sys,emit,part,30);

    destroy event:

    part_type_destroy(part);


    Das leben der Particle hab ich auf die länge gestellt, dass sie gerade so die Raum verlassen und dann "sterben". Am Liebsten hätte ich noch mehr Particle, damit es den Effekt hat, den ich eigentlich haben wollt. Aber das ist jetzt schon das Minimum, was ich haben möchte.

    Außerdem ist jetzt noch die Frage, kann ich die Particle mit andern Objekten interagieren lassen? Also ich möchte die Particle mit den Blatt "einsammeln". Wenn sie das Blatt treffen sollen sie verschwinden. Das Blatt ist Beweglich also kann ich es nicht von der Position abhängig machen. Gibt es in den Partikel Einstellungen irgendwas womit ich eine Kollision abfragen kann?

    beste grüße und danke schonmal
    Jan

    (Soll ich für die neue Frage einen neuen Post machen?)
    Bilder
    • particle.jpg

      632,12 kB, 1.271×785, 292 mal angesehen
  • Um es kurz und knapp zu sagen, nein, mit Partikeln lässt sich leider keine Kollision abfragen. Zu dem fps Problem, Partikel verbrauchen viele Resaucen, weshalb man auch nicht viele auf einmal haben kann.
    Husi012 hat mich nicht mehr in seiner Signatur, ich bin trotzdem noch fame.
  • Ja das mit den Partikel habe ich jetzt über Board geworfen :D

    ich mach jetzt einen Plattformer und stehe jetzt vor einen anderen Problem.

    ich habe ein Objekt (A) / obj_gegner) das ein weiteres Objekte (B / obj_wolke) spawnt. Wenn ein weiteres Objekt(C / obj_baum_klein) das Objekt(B) berührt verschwindet es. Wenn Objekt (C) 5 mal Objekt(B) "eingesammelt" hat soll Objekt (A) sterben.

    Mein Code in Objekt (B):

    CREATE:

    hp = 5

    STEP:


    direction = point_direction(x, y, x+random(200), -80);
    speed = 4
    image_size = random(1.2);

    if (place_meeting (x,y,obj_baum_klein)){
    instance_destroy();
    hp -=1;
    }



    if (hp == 0) {
    with(obj_gegner){
    instance_destroy();
    }
    }

    ich habe erst probiert mit "global.hp" zu arbeiten und den Code auf die verschiedene Objekte aufzuteilen und das Funktionierte auch, leider verschwinden dann alle istancen des Objekt (Hab ich auch verstanden warum :D)

    Also jetzt meine Frage: Ist es möglich aus dem Code eines Objektes ein anderes Objekte zu zerstören? Beim googeln bin ich auf das "with" gestoßen. Jedoch funktioniert es so wie ich es gemacht habe nicht. Ich glaube ich hab das "with" noch nicht ganz verstanden.

    Habe ich einfach nur einen Denkfehler oder benutz ich es einfach falsch?

    ich hoffe ihr versteht, was ich meine
    Beste Grüße
    Jan
  • Also was mir auffällt in deinem Code:

    Du stellst beim erstellen der Wolke die HP auf 5.

    Bei Berührung zerstörst du die Wolke und DANACH ziehst du 1 von der HP ab.

    Dann spawnt die Wolke ja wieder (wie ich das verstanden habe) und sehe da: Der Create Event wird wieder aufgerufen und die HP sind wieder bei 5.

    Die HP können also rein theoretisch nicht 0 erreichen weil sie immer wieder auf 5 gestellt werden beim erstellen des Objekts.
  • Jo ok, das kling logisch.

    Also muss ich den Code in das Gegner Objekt schreiben, richtig?

    also nach den normalen Code des Gegner Objekts

    sowas in der art:

    (if (while(obj_wolke)place_meeting (x,y,obj_baum_klein)){
    instance_destroy();
    hp -= 1

    }

    leider positionier ich da das while noch falsch, weil ich wie gesagt das ganze noch nicht ganz verstanden habe wie und wann ich es benutzen kann.

    hast du da eine Idee wie ich das am besten schreiben könnte?

    gruß
  • Hier brauchst du nur ein if weil du ja nur einmal mit der wolke kollidierst und sie dann sofort verschwindet.

    Was in while steht wird solange ausgeführt bis es false ergibt, also;

    GML-Quellcode

    1. while instance_exists(wolke)
    2. {
    3. hp -= 1;
    4. }

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • also das klingt schonmal gut. leider bleibt mein spiel jetzt immer sofort hängen wenn ich es starte.

    hab ich das richtig verstanden, dass ich das while in den "Gegner" code schreibe?

    GML-Quellcode

    1. ///enemy collosion
    2. if (place_meeting (x,y,obj_baum_klein)){
    3. // player kommt von oben
    4. if (obj_baum_klein.y < -378)
    5. {
    6. with (obj_baum_klein)
    7. instance_destroy();
    8. }
    9. // player kommt von der seit
    10. else{
    11. game_restart();
    12. }
    13. }
    14. if random (30) <1{
    15. instance_create(x-20,y-65,obj_wolke)
    16. }
    17. while instance_exists(obj_wolke){
    18. hp -=1
    19. }
    20. if (hp == 0){
    21. instance_destroy();
    22. }
    Alles anzeigen


    kann es sein, dass es da ein problem gibt, weil er ja immer wieder neue wolken spawnt? und ja auch immer wolken existieren, auch wenn ich gerade eine "aufgesammelt" habe


    edit:

    hab jetzt nochmal was geändert, falls ich auf die schnelle keine Lösung bekomm. habe jetzt wieder global.hp und man muss insgesamt mehr einsammeln, dass alle kaputt gehen. leider funktioniert das ganze nur manchmal. Manchmal sammle ich die Anzahl ein und die Gegner stehen immernoch. erst wenn ich dann noch ein paar einsammle gehen sie kaputt. hab aber noch nicht verstanden warum.

    obj_gegner

    GML-Quellcode

    1. if (dc >= 18){
    2. instance_destroy();
    3. instance_create (x,y,obj_gegner_tot);
    4. } else{
    5. if (global.hp <= 0){
    6. sprite_index = spr_gegner_zerfall
    7. image_speed = 1.5;
    8. dc += 1;
    9. }
    10. ///enemy collosion
    11. if (place_meeting (x,y,obj_baum_klein)){
    12. // player kommt von oben
    13. if (obj_baum_klein.y < -378)
    14. {
    15. with (obj_baum_klein)
    16. instance_destroy();
    17. }
    18. // player kommt von der seit
    19. else{
    20. game_restart();
    21. }
    22. }
    23. if random (30) <1{
    24. instance_create(x-20,y-65,obj_wolke)
    25. }
    26. //while(!instance_exists(obj_wolke)){
    27. // hp -= 1
    28. //}
    29. }
    Alles anzeigen


    dc zählt nur, bis eine sterbeanimation zuende ist. also könnt ihr das ignorieren.
    in meinen wolken Objekt hab ich jetzt immer:

    GML-Quellcode

    1. direction = point_direction(x, y, x+200, -80);
    2. speed = 4;
    3. image_size = 1 ;
    4. if (place_meeting (x,y,obj_baum_klein)){
    5. instance_destroy();
    6. global.hp -= 1;
    7. }

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von drschnuggels ()

  • ist das thema noch aktuell?
    Du hast da eine prima Endlosschleife reingehauen :D
    es kommt mir so vor, als währe es ein Step-Event, dann kannst du einfach das while durch ein if ersetzen und es sollte gehen.

    - LG Larsi
    Kopiere dies in deine Signatur, um es in deiner Signatur zu haben.
    Achtung: Dieser Beitrag läuft ende des Monats ab, bitte lese ihn noch vor dem Monatswechsel...
    Nach langer zeit wieder im Forum aktiv :D