Particle εφέ

Η WME προσφέρει γενικούς δημιουργούς particles για την παραγωγή particle εφέ σε πραγματικό χρόνο, όπως χιόνι, βροχή και καπνό. Για αυτό τον σκοπό προσφέρει τα λεγόμενα "particle emitters", στα οποία ορίζοντας μία σειρά από παραμέτρους μπορείτε να επιτύχετε πολλά εντελώς διαφορετικά εφέ.

Πρότζεκτ επίδειξης των WME particles

Επειδή ο αριθμός των παραμέτρων που μπορούν να δεχθούν τα particle emitters μπορεί να φαίνεται πολύ μεγάλος στην αρχή, υπάρχει διαθέσιμο ένα πρότζεκτ επίδειξης particles που περιλαμβάνει διάφορα προκαθορισμένα particle εφέ (χιόνι, βροχή, καπνός) που είναι έτοιμα για χρήση στο δικό σας παιχνίδι. Μπορείτε να χρησιμοποιήσετε αυτά ως αφετηρία για τα δικά σας εφέ.

Θα βρείτε το πρότζεκτ στον υποφάκελο "projects\wme_particles" του φακέλου της WME.


Δημιουργία particle emitters

Στην WME, κάθε particle emitter είναι ορισμένο σε μία entity ή σε ένα χαρακτήρα. Έτσι μπορείτε να ορίσετε με ακρίβεια τη θέση των particles ως προς το βάθος της σκηνής. Οι entities και οι χαρακτήρες προσφέρουν την μέθοδο CreateParticleEmitter() που δημιουργεί ένα particle emitter και το ορίζει στο αντίστοιχο αντικείμενο. Μπορείτε να καλέσετε το particle emitter με την ιδιότητα ParticleEmitter.

// αναφορά στην entiry της σκηνής που θα ορίσουμε το emitter
var SomeEntity = Scene.GetNode("some_entity");

// δημιουργία του particle emitter της entity
SomeEntity.CreateParticleEmitter();

// αναφορά στο particle emitter
var Emit = SomeEntity.ParticleEmitter;

Το επάνω παράδειγμα δημιουργεί ένα particle emitter και μετά φτιάχνει μία αναφορά σε αυτό. Πλέον, μπορείτε να χρησιμοποιήσετε το αντικείμενο emitter όπως οποιοδήποτε άλλο αντικείμενο του παιχνιδιού. Μπορείτε να καλέσετε τις μεθόδους του και να ορίσετε τις ιδιότητές του. Για μία πλήρη λίστα με τις μεθόδους και τις ιδιότητες που μπορεί να δεχθεί δείτε τον οδηγό αναφορά για τα particle emitter.

Διαγραφή particle emitters

Όταν, πλέον, δεν χρειάζεστε το particle emitter μπορείτε να το διαγράψετε με τη μέθοδο DeleteParticleEmitter() του χαρακτήρα ή της entity στην οποία ανήκει.

Παράμετροι των particle emitter

Το αντικείμενο particle emitter μπορεί να δεχθεί μία σειρά από παραμέτρους που επηρεάζουν την αρχική κατάσταση των particles που δημιουργούνται από το emitter. Από τη στιγμή που το particle εμφανιστεί στην οθόνη έχει τη δική του ζωή, ξεχωριστή από το emitter. Βασικά, κινείται μέσα στην οθόνη προς μία συγκεκριμένη πορεία και ταχύτητα. Για παράδειγμα, ένα emitter χιονιού θα δημιουργήσει νιφάδες χιονιού που θα πέσουν σιγά σιγά από το επάνω μέρος της οθόνης στο κάτω.

Το σχήμα και η θέση του emitter

Καταρχήν, πρέπει να ορίσουμε το σχήμα του emitter που στην WME είναι πάντα παραλληλόγραμμο και τοποθετείται κάπου στην οθόνη με τον παρακάτω τρόπο:

Emit.X = 100;
Emit.Y = 100;
Emit.Width = 200;
Emit.Height = 200;

Αν ορίσετε το μήκος ή το ύψος του emitter σε μηδέν, τότε αυτό θα είναι μία γραμμή. Για παράδειγμα,  ένα emitter χιονιού θα έχει το σχήμα μιας οριζόντιας γραμμής τοποθετημένης στο επάνω μέρος της οθόνης.

Αν ορίσετε και τις δύο αυτές παραμέτρους σε μηδέν, τότε το emitter θα είναι ένα σημείο. Χρήσιμο σε ένα emitter καπνού όπου όλα τα particles Θα πρέπει να ξεκινάνε από ένα σημείο.

Όρια

Πολλές φορές θα χρειαστεί να περιορίσετε την περιοχή μέσα στην οποία βρίσκονται τα particles. Για παράδειγμα, οι νιφάδες χιονιού θα πρέπει να εξαφανίζονται όταν αγγίξουν το έδαφος. Η WME σας επιτρέπει να ορίσετε ένα παραλληλόγραμμο ως το όριο των particles. Με την μέθοδο SetBorder() μπορείτε να ορίσετε τη θέση και την διάσταση του παραλληλόγραμμου. Συνήθως αυτό καλύπτει ολόκληρη τη σκηνή.

Emit.SetBorder(0, 0, Scene.Width, Scene.Height);

Μερικές φορές είναι χρήσιμο να ορίσετε το πάχος των ορίων, όπως, όταν θέλετε το έδαφος να έχει κάποιο ύψος. Αυτό επιτυγχάνεται με τη μέθοδοSetBorderThickness(). Για παράδειγμα, για να ορίσετε το ύψος της άκρης του εδάφους σε 100 εικονοστοιχεία θα πρέπει να δώσετε την εντολή:

Emit.SetBorderThickness(0, 0, 0, 100);

Γραφική αναπαράσταση των particles

Τα particles αντιπροσωπεύονται από sprites και μπορείτε να ορίσετε ένα ή περισσότερα με τη μέθοδο AddSprite(). Όταν το emitter δημιουργεί ένα νέο particle ορίζει σε αυτό τυχαία ένα από τα δοσμένα sprites και για αυτό θα πρέπει πάντα να υπάρχει τουλάχιστον ένα ορισμένο. Με τη μέθοδο RemoveSprite() μπορείτε να αφαιρέσετε sprites από τη λίστα.

Αναλογία διάστασης, ταχύτητα και διεύθυνση των particles

Όταν το αντικείμενο emitter δημιουργεί ένα νέο particle του δίνει μία αρχική διεύθυνση, ταχύτητα και αναλογία διάστασης. Οι τιμές επιλέγονται τυχαία μέσα από ένα δοσμένο όριο που μπορείτε να ορίσετε μέσω των παρακάτω ιδιοτήτων των emitters:

Emit.Velocity1 = 20;
Emit.Velocity2 = 50;

Emit.Scale1 = 10;
Emit.Scale2 = 100;

Emit.Angle1 = 175;
Emit.Angle2 = 185;

Αν, για παράδειγμα, ορίσετε τις παραπάνω τιμές στο αντικείμενο emitter, όταν δημιουργεί ένα particle θα του ορίζει μία τυχαία ταχύτητα από 20 έως 50, μία αναλογία διάστασης από 10 έως 100 (επί τοις εκατό) και μία γωνία διεύθυνσης από 175 έως 185 (μοίρες). Η γωνία διεύθυνσης ορίζεται ως εξής: 0 μοίρες - πάνω, 90 μοίρες - δεξιά, 180 μοίρες -κάτω, 270 μοίρες αριστερά και ασφαλώς οποιαδήποτε γωνία ενδιάμεση αυτών των τιμών.

Διάρκεια ζωής και διαφάνεια των particles

Η διάρκεια ζωής του particle ορίζει πόσο καιρό θα μείνει στην οθόνη μέχρι να "πεθάνει" και να εξαφανιστεί. Σε κάθε particle επιλέγεται μία τυχαία τιμή από ένα δοσμένο όριο. Αν δώσετε στο particle διάρκεια ζωής μηδέν ή μικρότερη τότε το particle δεν εξαφανίζεται, παρά μόνο όταν αγγίξει τα όρια του παραλληλογράμμου.

Emit.LifeTime1 = 4000;
Emit.LifeTime2 = 5000;

Στο παραπάνω παράδειγμα, σε κάθε νέο particle δίνεται διάρκεια ζωής από 4 έως 5 δευτερόλεπτα (η τιμή ορίζεται σε χιλιοστά του δευτερολέπτου).

Επίσης, μπορείτε να ορίσετε πως θα αλλάζει η διαφάνεια του particle κατά τη διάρκεια της ζωής του. Χρήσιμο, για παράδειγμα, στα particles καπνού ώστε να σβήνουν σιγά σιγά καθώς απομακρύνονται από το emitter. Και πάλι, ορίζετε τη διαφάνεια ως όριο τιμών:

Emit.Alpha1 = 255;
Emit.Alpha2 = 0;
Emit.AlphaTimeBased = true;

Με αυτές τις ρυθμίσεις τα particles θα αλλάξουν ομαλά την διαφάνειά τους από 255 (αδιαφανές) σε 0 (πλήρης διαφάνεια).

Αν θέλετε τα particles να έχουν τυχαία διαφάνεια και όχι ομαλή διαβάθμιση ορίστε την ιδιότητα AlphaTimeBased σε false.

Βάθος των particles

Κάθε particle έχει ένα βάθος που χρησιμοποιείται ώστε να δημιουργηθεί η ψευδαίσθηση προοπτικής. Οι νιφάδες χιονιού, για παράδειγμα, θα είναι πιο μικρές και θα κινούνται πιο αργά όσο πιο μακριά από τον θεατή είναι. Η WME παρέχει ιδιότητες ώστε η αναλογία διάστασης, η ταχύτητα και η διάρκεια ζωής των particles να παίρνουν υπόψη τους το βάθος:

Emit.LifeTimeZBased = true;
Emit.VelocityZBased = true;
Emit.ScaleZBased = true;

Περιστροφή των particles

Μπορείτε να ορίσετε μία αρχική περιστροφή, σε μοίρες, για το particle και τη γωνιακή ταχύτητα αυτού. Και σε αυτή την περίπτωση, οι δύο τιμές επιλέγονται από κάποια όρια που έχετε θέσει.

Emit.Rotation1 = 0;
Emit.Rotation2 = 360;
Emit.AngVelocity1 = 1000;
Emit.AngVelocity2 = 2000;

Μεγέθυνση/σμίκρυνση των particles

Στη διάρκεια ζωής τους, τα particles μπορούν να μεγεθυνθούν και να σμικρυνθούν. Δίνεται, επιπλέον, η δυνατότητα επιλογής ανάμεσα σε αριθμητική ή εκθετική μεγέθυνση/σμίκρυνση. Στην εκθετική μεγέθυνση τα particles όσο μεγαλύτερα είναι τόσο πιο γρήγορα μεγεθύνονται.

Emit.GrowthRate1 = 20;
Emit.GrowthRate2 = 50;
Emit.ExponentialGrowth = true;

Παραγωγή particles

Τα particles παράγονται σε ομάδες και παρέχεται η δυνατότητα να ορίσετε τον ενδιάμεσο χρόνο και τον αριθμό των particles των ομάδων με τις παρακάτω ιδιότητες:

Emit.GenerationInterval = 200;
Emit.GenerationAmount = 40;

Σύμφωνα με τις παραπάνω τιμές το emitter θα παράγει 40 νέα particles κάθε 200 χιλιοστά του δευτερολέπτου. Το emitter θα ανακυκλώνει τα νεκρά particles και θα παράγει νέα όταν δεν υπάρχουν άλλα διαθέσιμα. Για να περιορίσετε τον μέγιστο αριθμό των particles στην οθόνη χρησιμοποιήστε την ιδιότητα MaxParticles:

Emit.MaxParticles = 300;

Πρέπει πάντα να ορίζετε τον μέγιστο αριθμό particles σε μία λογική τιμή. Να έχετε υπόψη σας ότι μεγάλος αριθμός particles στην οθόνη θα επηρεάσει αρνητικά την συνολική ταχύτητα του παιχνιδιού!

Για να καλέσετε τον αριθμό των ενεργών στην οθόνη particles χρησιμοποιήστε την ιδιότητα NumLiveParticles.

Ομαλή εμφάνιση / εξαφάνιση των particles

Παρέχεται η δυνατότητα, τα particles να εμφανίζονται και να εξαφανίζονται ομαλά όταν παράγονται και όταν καταστρέφονται αντίστοιχα. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το εφέ την ομαλής εξαφάνισης στις νιφάδες χιονιού ώστε να φαίνεται ότι λιώνουν μόλις αγγίζουν το έδαφος.

Emit.FadeOutTime = 1000;

Εμφάνιση των particles μόνο σε ένα πεδίο

Μερικές φορές είναι χρήσιμο. τα particles να εμφανίζονται μόνο όταν βρίσκονται μέσα σε ένα συγκεκριμένο πεδίο. Για να το πετύχετε αυτό δώστε στην ιδιότητα UseRegion την τιμή true. Αυτή έχει αποτέλεσμα μόνο αν το αντικείμενο particle emitter ανήκει σε ένα πεδίο entity και σε αυτή την περίπτωση, το πεδίο της entity ελέγχει αν τα particles θα είναι ορατά στην οθόνη ή όχι.

Emit.UseRegion = true;

Oρισμός κώδικα σε ένα particle emitter

Είναι χρήσιμο να μπορείτε να τρέχετε κάποιο κώδικα κάθε φορά που ο particle emitter δημιουργεί μία καινούρια ομάδα από particles (συνήθως χρησιμοποιείται για ηχητικά εφέ). Για αυτό το σκοπό ο emitter μπορεί να δεχθεί την ιδιότητα EmitEvent. Με αυτή, κάθε φορά που δημιουργείται μία ομάδα από particles, ενεργοποιείται ένα γεγονός με το όνομα αυτό στο αντικείμενο που ανήκει ο emitter. Για να απενεργοποιήσετε το γεγονός δώστε στην ιδιότητα την τιμή null.

Emit.EmitEvent = "burst";

...

on "burst"
{
  this.PlaySound("sounds\burst.ogg");
}
    

Έλεγχος του emitter

Εφόσον έχουμε ορίσει όλες τις παραμέτρους, ξεκινάμε την παραγωγή των particles καλώντας την μέθοδο Start() στο αντικείμενο emitter. Αυτή η μέθοδος μπορεί να δεχθεί μία επιπλέον παράμετρο που ορίζει το χρόνο εκκίνησης της παραγωγής και χρησιμοποιείται ώστε να γεμίσει ο emitter με particles πριν παρουσιαστεί στην οθόνη. Για παράδειγμα, αν οι νιφάδες του χιονιού ξεκινούσαν να πέφτουν μόλις ο παίκτης έμπαινε στη σκηνή δεν θα φαινόταν σωστό. Σε αυτή την περίπτωση μπορείτε να ορίσετε τον χρόνο εκκίνησης καλώντας τη μέθοδο Start() και το emitter θα προσομοιώσει την παραγωγή particles πριν τα εμφανίσει στην οθόνη με τον σωστό τρόπο.

Επιπλέον έλεγχος emitter γίνεται με τις μεθόδους Stop(), Pause() και Resume().

Δυνάμεις

Εκτός από την ταχύτητα και την διεύθυνση των particles, μπορείτε να επηρεάσετε την κίνησή τους προσθέτοντας επιπλέον "δυνάμεις" στη σκηνή. Με αυτό τον τρόπο μπορείτε, για παράδειγμα, να προσομοιώσετε το φύσημα του αέρα. Προσφέρονται δύο είδη δυνάμεων: η γενική δύναμη και η δύναμη σημείου. Οι γενικές δυνάμεις επηρεάζουν όλα τα particles το ίδιο, ενώ οι δυνάμεις σημείων επηρεάζουν τα particles ανάλογά με τη θέση τους.  Όσο πιο κοντά βρίσκονται στο σημείο εκκίνησης της δύναμης, τόσο περισσότερο επηρεάζονται.  Οι δυνάμεις ορίζονται με τις ακόλουθες παραμέτρους: το όνομα, την κατεύθυνση, την ένταση και την αρχική θέση εκκίνησης σε περίπτωση δύναμης σημείου. Για να ορίσετε μία νέα δύναμη ή να αντικαταστήσετε κάποια με το ίδιο όνομα χρησιμοποιήστε την μέθοδο AddGlobalForce() (γενική δύναμη) ή την AddPointForce() (δύναμη σημείου). Για την αφαίρεση κάποιας δύναμης χρησιμοποιήστε τη μέθοδο RemoveForce().