If you're seeing this message, it means we're having trouble loading external resources on our website.

Եթե գտնվում ես վեբ զտիչի հետևում, խնդրում ենք համոզվել, որ *.kastatic.org և *.kasandbox.org տիրույթները հանված են արգելափակումից։

Հիմնական նյութ

Շատ օբյեկտների շարժում

Այն աշխարհը, որը փորձում ենք նմանակել, սովորաբար մեկից ավել շարժվող առարկաներ է պարունակում. մենք շրջապատված ենք տարբեր զանգվածի ու տարբեր դիրքերում գտնվող առարկաներով։ Փորձենք հասկանալ՝ Mover օբյեկտների միջոցով ինչպես կարող ենք աշխարհն այս տեսանկյունից ավելի լավ նմանակել։
Դրա համար արագ վերհիշենք օբյեկտային կողմնորոշվածությամբ ծրագրավորումը։ Իհարկե, ամբողջը չենք կրկնի։ Այնուամենայնիվ, քանի որ այս դասընթացում բազմաթիվ օբյեկտներ պարունակող աշխարհ ստեղծելը շատ կարևոր է, մի պահ վերանայենք մի օբյեկտից մի քանի օբյեկտ անցնելու գործընթացը։
Mover-ը այս պահին այսպիսին է։ Այն շատ նման է այն Mover օբյեկտին, որը վեկտորների ներածության մեջ էինք գրել։ Տարբերություններն ավելացված mass հատկությունն ու applyForce() մեթոդն են.
Քանի որ օբյեկտը արդեն պատրաստ է, կարող ենք զանգվածում Mover օբյեկտի 20 նոր օրինակ ստեղծել՝ դրանց նախնական արժեքը տալով ցիկլում.
var movers = [];

for (var i = 0; i < 20; i++) {
    movers[i] = new Mover();
}
Սակայն ունենք խնդիր։ Եթե նայենք Mover օբյեկտների կառուցիչներին…
var Mover = function() {
    this.mass = 1;
    this.position = new PVector(30, 30);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
…կնկատենք, որ բոլոր Mover օբյեկտների սկզբնական արժեքները նույնն են։ Իրականում մենք ենք ուզել տարբեր զանգվածներով Mover օբյեկտներ, որոնց սկզբնական դիրքերն էլ են տարբեր։ Այժմ արդեն պետք է կառուցողը բարդացնենք՝ արգումենտներ ավելացնելով։
var Mover = function(m, x, y) {
    this.mass = m;
    this.position = new PVector(x, y);
    this.velocity = new PVector(0, 0);
    this.acceleration = new PVector(0, 0);
};
Ուշադրություն դարձրու, որ զանգվածն ու դիրքը հստակ թվեր չեն, այլ որոշվում են՝ ըստ կառուցչին փոխանցված արժեքների։ Դա նշանակում է, որ կարող ենք տարբեր Mover օբյեկտներ ստեղծել՝ մեծ, փոքր, էկրանի աջ կողմում, ձախ կողմում և այլն։
// Էկրանի ձախ կողմում մեծ Mover
var m1 = new Mover(10, 0, height/2);
// Էկրանի աջ կողմում փոքր Mover
var m2 = new Mover(0{,}1, width, height/2);
Այնուամենայնիվ, քանի որ ունենք Mover-ների զանգված, ցանկանում ենք դրանց նախնական արժեքները ցիկլում փոխանցել։
for (var i = 0; i < 20; i++) {
    movers[i] = new Mover(random(0{,}1, 5), 0, 0);
}
Յուրաքանչյուր ստեղծված Mover-ի զանգվածը 0,1-ից 5 միջակայքում ընկած պատահական թիվ է, սկզբնական x և y կոորդինատները՝ 0: Իհարկե, նախնական արժեքները այլ մոտեցմամբ էլ կարող ենք որոշել. սա ընդամենը հնարավոր տարբերակներից մեկն է։
Օբյեկտների զանգվածը հայտարարելուց և ստեղծելուց հետո կոդը բավականին պարզ է։ Անցնում ենք բոլոր օբյեկտների վրայով, դրանցից ամեն մեկին փոխանցում միջավայրում առկա ուժերը և վայելում արդյունքը։
draw = function() {
  background(50, 50, 50);

  for (var i = 0; i < movers.length; i++) {
    var wind = new PVector(0,01, 0);
    var gravity = new PVector(0, 0{,}1);
    movers[i].applyForce(wind);
    movers[i].applyForce(gravity);
    movers[i].update();
    movers[i].display();
    movers[i].checkEdges();
  }
};
Ահա ամբողջական ծրագիրը։ Ուշադրություն դարձրու, որ փոքր շրջաններն ավելի արագ են էկրանի աջ կողմ հասնում, քան մեծ շրջանները։ Սա պայմանավորված է մեր բանաձևով՝ Արագացում = Ուժը բաժանած Զանգվածի վրա. զանգվածն ինչքան մեծ, այդքան արագացումը փոքր։

«Բնական նմանակիչներ» դասընթացը ստեղծվել է Դանիել Շիֆմանի «Կոդի բնույթը» գրքի հիման վրա և կիրառվում է ըստ Creative Commons Attribution-NonCommercial 3,0 Unported License-ի։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: