Image_index und Partikel-Elemente nach der Zerstörung des Feindes

  • GM 7

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

  • Image_index und Partikel-Elemente nach der Zerstörung des Feindes

    Hi,

    Hab mal leider wieder 2 Probleme :( :

    1. Mein Raumschiff hat je nach geschwindigkeit (speed) verschiedene Subimages. Unter anderem kann mein Raumschiff auch bremsen und rückwärts fliegen. Dazu habe ich den speed verlangsamt bzw. negativ gemacht.

    Ich habe irgendwo in der Suche gesehen, dass speed nur 0 oder positive Werte erfassen kann. -> Deshalb wird wohl auch das Subimage für Rückwärtsfahren nicht richtig angezeigt.
    Beim Bremsen könnte man alternativ auch friction verwenden - aber speed darf ich ja bis 0 setzen - von da her also kein Problem.

    Aber wie mache ich das mit Rückwärtsfahren? Ich will den image_angle des Raumschiffes dabei nicht ändern - dies geschiet jedoch im Step-Event des Objektes.

    2. Möchte für besiegte Gegner jeweils 4 Partikel zeichnen, die bei Annäherung vom Spieler sich in dessen Richtung begeben.

    - Das Zeichnen der Partikel geht einwandfrei.
    - Ich habe für die Kollisionsberechnungen objekte mit index erstellt - diese gehen dann zum Spieler und erhöhen die Score.

    Es sieht merkwürdig aus, wenn ich zwar Punkte hab, aber die Partikel sich nicht bewegen.
    Jetzt weiss ich nicht wie ich auf das jeweilige richtige Partikel zugreiffen kann um diese Bewegung auch auszuführen.
    Bei der Zerstörung des jeweiligen objektes für die Kollisionsberechnung soll das entsprechende Partikel auch verschwinden.


    Vielen Dank für eure Hilfe! :)
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Wenn ich das richtig verstanden habe....

    1. Wenn ich mich recht erinnere, kann hspeed negativ gehen. Probiers damit.

    2. Ich glaube nicht, dass man auf Partikel direkt zugreifen kann. Mach einfach die Objekte zu den Partikeln.
    <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
    <Irrenhaus3>da geht alles in Deckung
  • Für das Rückwärtsfahren des Raumschiffes müsste man wohl einen extra Code mit einer speziellen Variable einfügen:

    step event:

    GML-Quellcode

    1. if (keyboard_check(*rückwärtstaste*))
    2. {direction -= front_dir-180;
    3. speed = *rückwärtsgeschwindigkeit*}
    4. else if !(keyboard_check(*rückwärtstaste*))
    5. {direction = front_dir;}
    6. image_angle = front_dir;
    7. friction = *Wert der Leerlaufverlangsamung*;

    Die Variable "front_dir" zeigt immer die Richtung nach Vorne an. Auch die Steuerung muss sich dann auf diese Variable beziehen.

    Zu deiner zweiten Frage: Ich habe noch nie davon gehört, dass man direkt auf Partikel zugreifen kann. Erstelle dafür am besten einfach ein Objekt, welches eines der Partikel repräsentiert. Das Partikel sollte sich dann immer an der gleichen Stelle wie das Objekt befinden.
  • henrik1235 schrieb:

    Speed kann man nekativ machen. ;)
    MfG Henrik1235
    Aber wenn man z.B. add_motion in die entgegengesetzte Richtung macht, setzt GM das speed nicht ins Minus, sondern dreht direction um und speed wird positiv.
    <Irrenhaus3>wenn [zensiert] erstmal das sabbeln anfängt, wird sogar ne Sinuskurve linear, um schneller abzuhauen
    <Irrenhaus3>da geht alles in Deckung
  • Nein, Speed kann definitiv nicht negativ sein !
    Denn wenn er negativ wird, dann wird automatisch direction um 180 Grad erhöht bzw verringert, also die Richtung gewechselt. Danach wird speed wieder positiv...
    PULSE

    Zweispieler [||||||||||]
    Einspieler [||||||||||]

    [Die Entgrater ist auf Eis gelegt]
  • Erstmals vielen Dank für die vielen Antworten.

    Zu den Antworten betreffend 1:
    Ich glaube es geht doch einfacher: Ist mir gerade in den Sinn gekommen... wenn ich einfach überprüfe ob der speed im zusammenhang mit der Hoch (beschl.) oder Runter (brems.) Taste steht, dann das jeweilige Bild nehmen -> werd das mal testen.

    2:
    Zu deiner zweiten Frage: Ich habe noch nie davon gehört, dass man direkt auf Partikel zugreifen kann. Erstelle dafür am besten einfach ein Objekt, welches eines der Partikel repräsentiert. Das Partikel sollte sich dann immer an der gleichen Stelle wie das Objekt befinden.


    Das habe ich bereits gemacht - also die Objekte erstellt.
    hier:
    - Ich habe für die Kollisionsberechnungen objekte mit index erstellt - diese gehen dann zum Spieler und erhöhen die Score.


    Also bei mir sind es ja immer 4 Partikel. Dh. ich erstelle diese mit einer for-Klausel. Dabei steht unter anderem dann

    GML-Quellcode

    1. ...
    2. part_mask[i] = insance_create(x,y,obj_part_mask);
    3. // Erstellt an der Stelle x,y des aktuellen Partikels das Objekt part_mask


    Das diese Elemente dann auch auf den Code reagieren habe ich auch bereits erwähnt.
    Problem:
    Partikel sollen das selbe tun [aus der Sicht des Parikels](wenn Distanz zum Schiff einen gewissen Wert hat - folge dem Schiff bis ihr kollidiert -> muss nicht umbedingt kollidieren nur beim Schiff stehen <- dann lösch dich);

    Mit den Objekten also (obj_mask[*i*]) geht es - aber die Partikel bewegen sich keinen Milimeter.
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • Ich habe mit meinem Beitrag gemeint, dass du jeden der vier Partikel mit einem (am besten unsichtbaren) Objekt ersetzten sollst. Jedes dieser vier Objekte erstellt nun in jedem Step eines dieser Partikel an seiner eigenen Stelle. Das Partikel ist dann aber so kurzlebig, dass es nach jedem Step wieder verschwindet und sich sofort ein neues als Ersatz bildet. Damit würde es so aussehen, als würde sich das Partikel selbst bewegen.
  • EDIT:

    Sry, dass ich das nochmals hervorhole, aber habe jetzt nochmals ein kleineres Problem mit den Partikeln

    Ich habe bemerkt, wenn ich das Spiel länger spiele, dass dann irgendwann das mit den Partikeln nicht mehr funktionniert - wenn ich den Gegner zerstört habe schoss der dann irgendwie 20 mal anstatt die Partikel zu zeichnen.
    Bin dem nachgegangen - es lag daran, dass ich in jedem Step immer wieder ein kompletes Partikelsystem erstellt hatte - so war das dann überlastet und löste Errors aus.

    Nun habe ich das ganze umstruckturieren müssen.
    Es ist fast alles so, wie es sollte. Nur gibt es, wenn das Partikel den Spieler verfolt so unschöne kleine Reste - habe keine Ahnung wieso.

    Weil man sich das net so gut vorstellen kann hab ich mal ein Bild hochgeladen.

    Hier mal alles, was mit den Partikeln zu tun hat:

    obj_enemy_01
    Spoiler anzeigen

    GML-Quellcode

    1. Collision obj_ship_01 (Spieler) : scr_revard(); // Wird ausgeführt wenn obj_enemy_01 zerstört wird.

    src_revard();
    Spoiler anzeigen

    GML-Quellcode

    1. part_amount = random(floor(10));
    2. for(i = 0; i <= part_amount; i+=1)
    3. {
    4. rand = random(floor(50));
    5. sig = choose(-1,0,1)
    6. sig_2 = choose(-1,0,1);
    7. x = x + sig*rand;
    8. y = y + sig_2*rand;
    9. if(place_meeting(x,y,obj_bar) or place_meeting(x,y,obj_wall))
    10. {
    11. rand = random(floor(50));
    12. sig = choose(-1,0,1);
    13. sig_2 = choose(-1,0,1);
    14. x = x + sig*rand;
    15. y = y + sig_2*rand;
    16. }
    17. else
    18. {
    19. part_mask[i] = instance_create(x,y,obj_part); // obj_partikel erstellen
    20. }
    21. }
    Alles anzeigen

    obj_part
    Spoiler anzeigen

    GML-Quellcode

    1. Information about object: obj_part
    2. Sprite: spr_part_01
    3. Solid: false
    4. Visible: true
    5. Depth: 0
    6. Persistent: false
    7. Parent: <no parent>
    8. Mask: <same as sprite>
    9. Create Event:
    10. execute code:
    11. part_livetime = 200;
    12. part_color = choose(c_yellow,c_green);
    13. execute script scr_part with arguments (0,0,0,0,0)
    14. Step Event:
    15. execute code:
    16. if(distance_to_object(global.ship) <= 100)
    17. {
    18. speed = random(floor(6))+4;
    19. move_towards_point(global.ship.x,global.ship.y,speed);
    20. }
    21. else
    22. {
    23. speed = 0;
    24. }
    25. execute code:
    26. part_livetime -= 1;
    27. if(part_livetime <= 0)
    28. {
    29. part_livetime = 0;
    30. instance_destroy();
    31. }
    32. else with(obj_part)
    33. {
    34. particle = part_particles_create(em,x,y,pt1,1);
    35. }
    36. Collision Event with object obj_ship_01:
    37. execute code:
    38. instance_destroy();
    39. if(part_color = c_yellow)
    40. {
    41. global.total_score += 10;
    42. sound_play(snd_revard);
    43. global.ship_exp += obj_enemy_01.e_exp*2;
    44. if(global.ship_exp >= global.ship_maxexp)
    45. {
    46. global.ship_exp = 0;
    47. global.ship_maxexp += 100;
    48. global.ship_level += 1;
    49. }
    50. part_type_clear(pt1);
    51. part_emitter_clear(ps,em);
    52. part_system_clear(ps);
    53. }
    54. else if(part_color = c_green)
    55. {
    56. global.ship_health += 5;
    57. sound_play(snd_revard);
    58. if(global.ship_health >= global.ship_maxhealth)
    59. {
    60. global.ship_health = 100;
    61. }
    62. else
    63. {
    64. exit;
    65. }
    66. part_type_clear(pt1);
    67. part_emitter_clear(ps,em);
    68. part_system_clear(ps);
    69. }
    70. Other Event: Outside Room:
    71. wrap in both directions when an instance moves outside the room
    Alles anzeigen

    scr_part()
    Spoiler anzeigen

    GML-Quellcode

    1. // Erstellt Partikelsystem
    2. ps = part_system_create();
    3. // Einzelne Partikel
    4. pt1 = part_type_create();
    5. part_type_shape(pt1,pt_shape_flare);
    6. part_type_size(pt1,0.5,0.5,0,0);
    7. part_type_speed(pt1,0,0,0,0);
    8. part_type_direction(pt1,0,0,0,0);
    9. part_type_color1(pt1,part_color);
    10. part_type_alpha2(pt1,0.8,0.4);
    11. part_type_life(pt1,30,30);
    12. part_type_gravity(pt1,0,0);
    13. // Emitter erstellen
    14. em = part_emitter_create(ps);
    Alles anzeigen


    Wäre froh, wenn ihr mir nochmals helfen könntet.
    Bilder
    • bild.jpg

      577,13 kB, 1.600×1.200, 177 mal angesehen
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von xx-XtremeX-xx ()

  • Ich habe eine neue Idee. Am besten, du machst ganz einfach folgendes:
    Wenn das feindliche Raumschiff zerstört wird, entstehen vier Partikel mit unendlicher Lebenszeit. Der Spieler zieht diese Partikel mit Hilfe eines Attractors an. Sobald sie ihn jedoch erreichen, werden sie dort von einem Destroyer zerstört.
    Ich denke, das ist die eleganteste Lösung.
  • :) Danke für die Antwort.

    Ehm dadurch wird sich aber nicht viel ändern, da ich das ja jetzt änlich handhabe. Bei mir ist es so, dass hald einige Partikel entstehen (hatte mal 4 gesagt - habs aber jetzt dem Zufall überlassen) der "Anlocker" ist gleichzeitig mein Spieler, oder siehst du das anders? Wo ist jetzt genau der Unterschied wenn ich dann noch ein zusätliches Objekt mache "Zerstörer". Das geht ja mit dem Kollisions-Event des Spielers wunderbar. Ich weiss nur nicht, wieso sich so komische Spuren bilden (siehe Bild) bist du sicher, dass es nicht einfacher geht? Das ist ja das Einzige was stört.

    Gruss,
    Xtreme
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!
  • So, habs geschafft.

    Lag daran, dass ich den emmitter immer neugezeichnet und dann beim "Tod" des Partikels dann deletet hab.
    Lag nur an dem.

    Jetzt aber mal noch eine Frage dazu -> wenn ich ein Partikelsystem habe und ich mit emmitern sowie partikeln arbeite - was muss ich dann am Ende des Rooms alles zurücksetzen bzw. löschen damit das nicht ewig weiterläuft und Speicher frisst?

    Gruss,
    Xtreme

    EDIT:
    Thx. Copyboy!
    Das Problem zu erkennen ist wichtiger,
    als die Lösung zu erkennen,
    denn die genaue Darstellung des Problems führt zur Lösung.
    ( Albert Einstein )


    I am an according to the gml n00b test!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von xx-XtremeX-xx ()