Partikel eine bestimmte Richtung geben?

  • GM 8

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

  • Partikel eine bestimmte Richtung geben?

    Habe ein kleines Problem mit meinen Partikeln unwahr möchte ich bei einem Spiel von Oben das bei einem Treffer Partikel erzeugt werden die in flugrichtung des Schusses weiterfliegen dazu wollte ich die Gravitation Direktion verwenden die mir zwar die richtige Richtung vorgibt aber diese nicht in mein Partikel System übernimmt ich übertrage zwar meine Direktion die korrekt ist aber sie wird nicht übertragen und nur als 0 ausgegeben nicht aber als korrekter wert zwischen 0-359 was kann ich da machen ?

    Sollte das Ganze nicht verständlich sein mache ich ein Video von dem Problem einfach Bescheid sagen!

    Ps: Ich verwende GM Studio



    GML-Quellcode

    1. Sname = part_system_create ()
    2. particle1 = part_type_create();
    3. part_type_shape(particle1,pt_shape_disk);
    4. part_type_size(particle1,0.05,0.15,0,0);
    5. part_type_scale(particle1,1,1);
    6. part_type_color1(particle1,147);
    7. part_type_alpha1(particle1,0.80);
    8. part_type_speed(particle1,1,8,0,0);
    9. part_type_direction(particle1,0,359,0,0);
    10. part_type_gravity(particle1,1,direction); // Hier wird anstelle der korrekten Direktion einfach eine 0 ausgegeben
    11. part_type_orientation(particle1,0,0,0,0,1);
    12. part_type_blend(particle1,1);
    13. part_type_life(particle1,5,100);
    14. emitter1 = part_emitter_create(Sname);
    15. part_emitter_region(Sname,emitter1,x,x,y,y,ps_shape_ellipse,1);
    16. part_emitter_burst(Sname,emitter1,particle1,200);
    Alles anzeigen
  • Also wenn der Partikel ein bestimmtes Objekt verfolgen soll, dann gib das im Step an.

    Beispiel:

    GML-Quellcode

    1. x=objekt.x;
    2. y=objekt.y;


    Ich mache das i.d.R. etwas anders. Partikel leben bei mir nicht lange (rund 8 Steps bei 30 Roomspeed) weshalb ich die Partikel an einer bestimmten Position des Objektes so lange erzeuge, wie das Objekt existiert oder der Zustand (Düse an etc.) gegeben ist.

    Das heißt, beim Partikel setze ich im Create einen Alarm, wenn der abgelaufen ist zerstört sich der Partikel selber. Im Objekt, wo der Partikel erstellt wird, erstelle ich im Step laufend die Partikel, ggf. kann man das noch durch einen Alarm besser regeln. Hier ein Beispiel, wie ich das bei zwei Düsen an einem Raumschiff gelöst habe. obj_loaderantrieb_klein01 ist dabei der Partikel.

    GML-Quellcode

    1. if (global.particle=true)
    2. {
    3. instance_create(x+0,y+-50,obj_loaderantrieb_klein01);
    4. }


    Übrigens: wenn du extrem viele Partikel hast, solltest du den eigentlichen Partikel in zwei Objekte trennen. Bei meinem letzten Projekt musste ich das machen, sonst, wäre das Spiel unspielbar geworden. Das Objekt obj_loaderantrieb_klein01 hat also noch einen Controller, der immer im Level ist. Das nenne ich dann obj_cont_loaderantrieb_klein01.

    Code obj_cont_loaderantrieb_klein01:

    Create:

    GML-Quellcode

    1. global.lantrieb_klein01_particle = part_system_create();
    2. global.lantrieb_klein01_particlep = part_type_create();
    3. part_system_depth(global.lantrieb_klein01_particle,-900000);
    4. part_type_life(global.lantrieb_klein01_particlep,2.25,4.75);
    5. part_type_shape(global.lantrieb_klein01_particlep,7);
    6. part_type_size(global.lantrieb_klein01_particlep,0.05,0.30,0.01,0);
    7. part_type_scale(global.lantrieb_klein01_particlep,1,1);
    8. part_type_speed(global.lantrieb_klein01_particlep,1,3.50,0,0);
    9. part_type_gravity(global.lantrieb_klein01_particlep,0,18);
    10. part_type_color3(global.lantrieb_klein01_particlep,make_color_rgb(191.25,255,43.35),make_color_rgb(28.05,255,28.05),make_color_rgb(0,145.35,0));
    11. part_type_orientation(global.lantrieb_klein01_particlep,0,0,0,0,1);
    12. part_type_direction(global.lantrieb_klein01_particlep,90,90,0,0);
    13. part_type_alpha3(global.lantrieb_klein01_particlep,0.16,0.29,0.54);
    14. part_type_blend(global.lantrieb_klein01_particlep,1);
    15. global.lantrieb_klein01_emitter = part_emitter_create(global.lantrieb_klein01_particle)
    16. part_emitter_region(global.lantrieb_klein01_particlep,global.lantrieb_klein01_emitter,x-0,x+0,y-0,y+0,0,0)
    17. part_emitter_burst(global.lantrieb_klein01_particle,global.lantrieb_klein01_emitter,global.lantrieb_klein01_particlep,1)
    Alles anzeigen


    Room End:

    GML-Quellcode

    1. part_system_clear(global.lantrieb_klein01_emitter);
    2. part_emitter_clear(global.lantrieb_klein01_particle,global.lantrieb_klein01_emitter);
    3. part_emitter_destroy(global.lantrieb_klein01_particle,global.lantrieb_klein01_emitter);
    4. part_emitter_destroy_all(global.lantrieb_klein01_particle);


    Dieses Objekt ist immer im Raum, aber nur ein Mal.

    Code obj_loaderantrieb_klein01:

    Create:

    GML-Quellcode

    1. alarm[0]=6 * room_speed / 30


    Alarm 0:

    GML-Quellcode

    1. instance_destroy();


    Destroy:

    GML-Quellcode

    1. part_particles_clear(global.lantrieb_klein01_emitter);


    Im Stept habe ich dann noch Anweisungen, dass sich der Partikel zerstört, wenn er außerhalb des Views ist.

    Room End:

    GML-Quellcode

    1. part_particles_clear(global.lantrieb_klein01_emitter);


    Übrigens habe ich damals noch eingebaut, dass Partikel nicht erzeugt werden, wenn eine bestimmte FPS Rate unterschritten wird, aber das hat nicht so funktioniert. Die Sache mit "* room_speed / 30" habe ich gemacht, damit ich den Room Speed flexibel gestalten kann, weil ich mitten im Projekt mal von 30 auf 60 bin, damit die Bewegungen flüssiger wirken. Kann man auch ignorieren.

    Ich hoffe, dass hilft dir etwas.

    Edit:
    *hust* erst jetzt merke ich, dass du Studio hast. Ich verwende 8.1, aber das Prinzip sollte vergleichbar sein.
  • Was du mir da schreibst ist interessant und wird mir an anderer Stelle mit Sicherheit weiterhelfen doch ich erzeuge nur einem Burst aus 200-300 Partikeln also nur einen kurzen Schwung sollen im Endeffekt Blutspritzer bei einem Treffer werden die aber in eine gewisse Richtung gehen sollen und da liegt mein Problem si wollen nicht in die Richtung gehen in die ich will.
  • Das ändert ja nichts am Prinzip. Du kannst den Weg einen unsichtbaren Objekt gehen lassen, welches den Partikel versprüht. Da hast du dann alle GM-Möglichkeiten. Wenn es ein bestimmter Pfad sein soll, dann lässt du das Objekt einem Pfad folgen.
  • Das ist so natürlich korrekt und eine Lösung doch für meine zwecke einfach zu kompliziert da muss ich ein Objekt erstellen welches einen Zeitraum lang existiert und Partikel erzeugt und eigentlich müsste ich in meinem System nur wissen wie ich die Direktion des Partikelsystems in die Direktion des Objekts bringe das kann doch nicht so schwer sein oder gibt es keinen weg wie das Partikelsystem Direktionsdaten akzeptiert? In diesen Fall werde ich mich natürlich deiner Lösung zuwenden!
  • Leider übernimmt das Partikel System auch auf part_type_direction genauso wie bei der Gravitation nicht die korrekten Direktions Daten sondern lediglich eine 0 das ist ja das Problem!

    Ich habe auch den Durations wehrt versucht in einen String zu packen dehn gibt er mir aber auch als wert 0 und nicht als wirklicher Direktionswert das bringt mich noch zum verzweifeln weil ich das einfach nicht verstehe oder ist das ein Fehler bei der Studio Version?
  • Könnte vielleicht die direction immer =0 sein und du den Player per x=? und y=? bewegst

    Teste einfach mal die direction im Debug modus oder lass sie dir über den Player drawen.
    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
  • So, wie du es oben angegeben hast, sollten die Partikel in jede Richtung gehen. Schränk doch den Bereich so ein, dass er in einen Bereich fällt, der dem Projektil entspricht. Also in etwa projektilname.direction-10, projektilname.direction+20 als min und max.