Հիմնական նյութ
Դասընթաց․ (Ծրագրավորում) > Բաժին 5
Դաս 4: Ուժեր- Նյուտոնի օրենքները
- Մարտահրավեր․ լողացող փուչիկ
- Շատ օբյեկտների շարժում
- Մարտահրավեր․ պատի գնդակներ
- Մարտահրավեր․ արհեստական արգելակներ
- Օդի ու հեղուկի դիմադրությունը
- Մարտահրավեր․ խորտակվող գերաններ
- Մարտահրավեր․ արվեստի գործի գեներատոր
- Փոխադարձ ձգողություն
- Մարտահրավեր․ փոխադարձ վանողություն
- Նախագիծ․ արարածի շրջակա միջավայրը
© 2024 Khan AcademyՕգտագործման պայմաններԳաղտնիության քաղաքականությունՔուքի (Cookie) ծանուցում
Շատ օբյեկտների շարժում
Այն աշխարհը, որը փորձում ենք նմանակել, սովորաբար մեկից ավել շարժվող առարկաներ է պարունակում. մենք շրջապատված ենք տարբեր զանգվածի ու տարբեր դիրքերում գտնվող առարկաներով։ Փորձենք հասկանալ՝
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-ի։
Ուզո՞ւմ ես միանալ խոսակցությանը։
Առայժմ հրապարակումներ չկան։