Հիմնական նյութ
Դասընթաց․ (Ծրագրավորում) > Բաժին 5
Դաս 7: Մասնիկների համակարգեր- Մասնիկների համակարգեր․ ներածություն
- Մեկ մասնիկ
- Մարտահրավեր․ ընկնող տերևներ
- Մարտահրավեր․ ձկների պղպջակներ
- Մասնիկների համակարգերի համակարգեր
- Մարտահրավեր․ կրակ
- Մարտահրավեր․ կախարդական կաթսա
- Մասնիկների համակարգերն ուժերով
- Մարտահրավեր․ գետի քարեր
- Նախագիծ․ արարածների համակարգ
© 2024 Khan AcademyՕգտագործման պայմաններԳաղտնիության քաղաքականությունՔուքի (Cookie) ծանուցում
Մեկ մասնիկ
Ամբողջական
ParticleSystem
ստեղծելուց առաջ պետք է մեկ մասնիկ նկարագրող օբյեկտ ստեղծել։ Լավ լուրն այն է, որ դա արդեն արել ենք։ «Ուժեր» բաժնի Mover
օբյեկտը շատ լավ կաղապար է. չէ՞ որ մեզ համար մասնիկը էկրանի վրա շարժվող անկախ մարմին է։ Այն ունի location
, velocity
, acceleration
, այս փոփոխականներին արժեք տվող կառուցող, ինքն իրեն պատկերելու համար display()
ֆունկցիա և իր տեղը թարմացնելու համար՝ update()
ֆունկցիա։// Պարզ Particle օբյեկտ
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()
ֆունկցիայի միջոցով նկարել։ Այնուամենայնիվ, առայժմ մեկ մանրամասնության վրա կենտրոնանանք՝ կյանքի տևողությունը (lifespan)։Մասնիկների համակարգերը սովորաբար պարունակում են թողարկողներ։ Թողարկողը մասնիկների աղբյուրն է, որոշում է դրանց նախնական վիճակը, դիրքը, արագությունը և այլն։ Թողարկողը կարող է մեկ անգամ մասնիկներ բաց թողնել, շարունակաբար մասնիկներ բաց թողնել կամ երկուսն իրար հետ։ Կարևոր է նշել, որ այսպիսի կիրառման դեպքում սովորաբար թողարկողի աշխատանքի արդյունքում ստեղծված մասնիկն առհավետ չի ապրում։ Եթե առհավետ ապրեր, ապա մեր ծրագիրն ինչ-որ պահից կանգ կառներ, քանի որ մասնիկների քանակը չափազանց մեծ կլիներ։ Նոր մասնիկների ծննդյանը զուգահեռ՝ կարևոր է, որ հին մասնիկները մահանան։ Սրա արդյունքում ծրագիրը հանգիստ աշխատում է, և տպավորություն է ստեղծվում, որ անվերջ մասնիկներ կան։
Բազմաթիվ ձևեր կան՝ որոշելու, թե երբ պետք է մասնիկը մահանա։ Օրինակ՝ այն կարող է դիպչել այլ օբյեկտի կամ կարող է պարզապես էկրանից դուրս գալ։ Այնուամենայնիվ, մեր առաջին
Particle
օբյեկտում ավելացնելու ենք timeToLive
հատկությունը։ Այն ժամանակաչափի դեր կստանձնի, 255-ից 0 կհաշվի, իսկ 0-ին հասնելուց հետո մասնիկը «մահացած» կհամարենք։ Հետևաբար, Particle
օբյեկտն այսպես ենք ընդարձակում.// Պարզ 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
հատկության հետ մեկտեղ պետք է ևս մեկ ֆունկցիա ավելացնել, որի միջոցով կարող ենք պարզել՝ մասնիկը կենդանի է, թե մահացած, և որը կվերադարձնի true կամ false արժեքները։ Սա օգտակար կլինի, երբ մասնիկների խումբ կարգավորող ParticleSystem
օբյեկտ գրենք։ Շատ հեշտ է այս ֆունկցիան գրել. այն պետք է վերադարձնի true արժեքը, եթե timeToLive
-ը 0-ից փոքր է։Particle.prototype.isDead = function() {
return this.timeToLive < 0;
};
Մասնիկներ ստեղծելու հաջորդ կետին անցնելուց առաջ լավ կլինի՝ վստահ լինենք, որ մասնիկը ճիշտ է աշխատում։ Դրա համար կարող ենք մեկ
Particle
օբյեկտ պարունակող ծրագիր ստեղծել։ Ստորև ներկայացնում ենք ծրագիրը, որի մեջ երկու կետ ենք ավելացրել։ Հարմարության համար ավելացնում ենք run()
ֆունկցիան, որը կանչում է display()
և update()
ֆունկցիաները։ Դրանից բացի մասնիկներին փոխանցում ենք սկզբնական արագություն, ինչպես նաև դեպի ներքև ուղղված արագացում, որպեսզի ծանրության ուժ նմանակենք։Քանի որ արդեն մեկ մասնիկ նկարագրող օբյեկտ ունենք, պատրաստ ենք առաջ անցնել։ Երբ չգիտենք, թե որ պահին քանի մասնիկ ունենք, ինչպե՞ս պետք է հետևենք բոլոր մասնիկներին։
Ուզո՞ւմ ես միանալ խոսակցությանը։
Առայժմ հրապարակումներ չկան։