თუ თქვენ ხედავთ ამ შეტყობინებას, ესე იგი საიტზე გარე რესურსების ჩატვირთვისას მოხდა შეფერხება.

If you're behind a web filter, please make sure that the domains *.kastatic.org and *.kasandbox.org are unblocked.

ძირითადი მასალა

კურსი: კომპიუტერული პროგრამირება > თემა 5

გაკვეთილი 8: ნაწილაკთა სისტემები

მხოლოდ ერთი ნაწილაკი

სანამ მთელ ParticleSystem-ს (ნაწილაკების სისტემას) შევქმნით, უნდა შევქმნათ ობიექტი, რომელიც აღწერს ცალკეულ ნაწილაკს. კარგი ამბავი მაქვს: ჩვენ ეს უკვე გავაკეთეთ. ჩვენი Mover ობიექტი (ძალების სექციიდან) გამოგვადგება სრულყოფილ თარგად. ჩვენთვის ნაწილაკი არის დამოუკიდებელი სხეული, რომელიც ეკრანზე გადაადგილდება. მას გააჩნია location (ადგილმდებარეობა), velocity (სიჩქარე) და acceleration (აჩქრება), კონსტრუქტორი ამ ცვლადების ინიციალიზაციისათვის, ფუნქციები display() საკუთარი თავის ეკრანზე გამოსაჩენად და update() ადგილმდებარეობის განახლებისთვის.
// მარტივი ნაწილაკის ობიექტი
var Particle = function(position) {
  this.acceleration = new PVector();
  this.velocity = new PVector();
  this.position = position.get();
};

Particle.prototype.update = function(){
  this.velocity.add(this.acceleration);
  this.position.add(this.velocity);
};

Particle.prototype.display = function() {
  stroke(0, 0, 0);
  fill(175, 175, 175);
  ellipse(this.position.x, this.position.y, 8, 8);
};
ეს არის ნაწილაკის უმარტივესი ფორმა. აქედან შეგვიძლია, ჩვენი ნაწილაკი რამდენიმე მიმართულებით წავიყვანოთ. შეგვიძლია, დავამატოთ applyForce() (ძალის გამოყენების) მეთოდი, რათა გავლენა ვიქონიოთ ნაწილაკის ქცევაზე (სწორედ ამას გავაკეთებთ მომავალ მაგალითში). შეგვიძლია, დავამატოთ ცვლადები ფერისა და ფორმის აღსაწერად, ან ნაწილაკის დასახატად გამოვიყენოთ image() ფუნქცია. მიუხედავად ამისა, ჯერჯერობით მხოლოდ ერთი დამატებითი დეტალი დავამატოთ: სიცოცხლის ხანგრძლივობა.
ნაწილაკთა ტიპური სისტემები მოიცავენ გამომსხივარს. გამომსხივარი არის ნაწილაკების წყარო და აკონტროლებს ნაწილაკების თავდაპირველ პარამეტრებს, როგორებიცაა ადგილმდებარეობა, სიჩქარე და ა.შ. გამომსხივარს შეუძლია, კონკრეტულ დროს გამოასხივოს ნაწილაკების ერთი ნაკადი, ან განუწყვეტლივ ასხივოს ისინი, ან ქნას ორივე. აზრი ისაა, რომ ტიპურ იმპლემენტაციაში, როგორზეც ახლა ვსაუბრობთ, ნაწილაკი იბადება გამომსხივარში, მაგრამ არ ცოცხლობს სამუდამოდ. სამუდამოდ რომ ცოცხლობდეს, ჩვენი პროგრამა საბოლოოდ შეწყვეტდა მუშაობას, რადგან ნაწილაკების რაოდენობა დროთა განმავლობაში ძალიან დიდ რიცხვს მიაღწევდა. ახალი ნაწილაკების დაბადებასთან ერთად გვჭირდება ძველი ნაწილაკების „კვდომა“. ეს ქმნის უთვალავი ნაწილაკის ნაკადის ილუზიას და ჩვენი პროგრამაც უპრობლემოდ მუშაობს.
ნაწილაკის სიკვდილის დროის განსაზღვრისთვის მრავალი გზა არსებობს. მაგალითად, როცა ის შეეხება სხვა ობიექტს, ან გავა ეკრანიდან. მიუხედავად ამისა, ჩვენი პირველი Particle ობიექტისთვის ჩვენ, უბრალოდ, დავამატებთ timeToLive (სიცოცხლის ხანგრძლივობა) თვისებას. ის წამმზომივით მოიქცევა, დაითვლის 255-იდან 0-მდე, 0-ზე ჩამოსვლისას კი ჩვენ ნაწილაკს დავარქმევთ „მკვდარს“. შესაბამისად, Particle ობიექტს შემდეგნაირად გავშლით:
// მარტივი ნაწილაკის ობიექტი
var Particle = function(position) {
  this.acceleration = new PVector();
  this.velocity = new PVector();
  this.position = position.get();
  this.timeToLive = 255;
};

Particle.prototype.update = function(){
  this.velocity.add(this.acceleration);
  this.position.add(this.velocity);
  this.timeToLive -= 2;
};

Particle.prototype.display = function() {
  stroke(255, 255, 255, this.timeToLive);
  fill(127, 127, 127, this.timeToLive);
  ellipse(this.position.x, this.position.y, 8, 8);
};
სიცოცხლის ხანგრძლივობის ( timeToLive ცვლადის) ათვლის საწყის რიცხვად 255, ხოლო საბოლოო რიცხვად 0 იმიტომ ავირჩიეთ, რომ ასე უფრო მოსახერხებელია. ამ მნიშვნელობებით შეგვიძლია, timeToLive გამოვიყენოთ ალფა გამჭვირვალობად ელიფსისთვის. როდესაც ნაწილაკი „მკვდარია", ის გამქრალი იქნება ეკრანიდანაც.
timeToLive (სიცოცხლის ხანგრძლივობის) თვისების დამატებასთან ერთად დაგვჭირდება კიდევ ერთი დამატებითი მეთოდი — ფუნქცია, რომლის მოთხოვნაც შეგვეძლება (რომელიც დაგვიბრუნებს „ჭეშმარიტს“ ან „მცდარს“), რათა გავიგოთ, ნაწილაკი ცოცხალია თუ მკვდარი. ეს გამოგვადგება, როცა დავიწყებთ ParticleSystem ობიექტის წერას, რომლის მიზანიც იქნება ნაწილაკების სიის განკარგვა. ამ ფუნქციის დაწერა საკმაოდ იოლია; მან უნდა დააბრუნოს true (ჭეშმარიტი), თუ timeToLive-ის მნიშვნელობა არის 0-ზე ნაკლები.
Particle.prototype.isDead = function() {
  return this.timeToLive < 0;
};
სანამ ბევრი ნაწილაკის შექმნას დავიწყებდეთ, დავრწმუნდეთ, რომ ჩვენი ნაწილაკი სწორად მუშაობს და შევქმნათ ესკიზი ერთი Particle ობიექტით. სრული კოდი მოცემულია ქვემოთ ორი მცირე დამატებით. ვამატებთ დამხმარე მეთოდს, სახელად run()-ს, რომელიც, უბრალოდ, იძახებს update()-სა და display()-ს. დამატებით, ნაწილაკს ვაძლევთ შემთხვევითად შერჩეულ საწყის სიჩქარესა და ქვემოთ მიმართულ აჩქარებას (გრავიტაციის სიმულირებისთვის).
ახლა, როცა გვაქვს ობიექტი ერთი ნაწილაკის აღსაწერად, მზად ვართ, გადავდგათ შემდეგი დიდი ნაბიჯი. როგორ ვადევნოთ თვალყური ბევრ ნაწილაკს, როდესაც არ ვიცით, რამდენი ნაწილაკი შეიძლება გვქონდეს დროის ნებისმიერ მოცემულ მომენტში?

გსურთ, შეუერთდეთ დისკუსიას?

პოსტები ჯერ არ არის.
გესმით ინგლისური? დააწკაპუნეთ აქ და გაეცანით განხილვას ხანის აკადემიის ინგლისურენოვან გვერდზე.