Време е да дадем предназначение на малката ни игра. Ще поръсим няколко звезди върху сцената и ще дадем на играча да ги събира. За да постигнем това, ще създаден нова група на име stars
и ще добавим звездите в нея. Във функцията create
ще добавим следния код, който можете да видите и в part8.html
:
stars = this.physics.add.group({
key: 'star',
repeat: 11,
setXY: { x: 12, y: 0, stepX: 70 }
});
stars.children.iterate(function (child) {
child.setBounceY(Phaser.Math.FloatBetween(0.4, 0.8));
});
Процесът е подобен на този, с който създадохме групата на платформите. Понеже звездите ще трябва да се движат и да подскачат, създаваме динамична физична група, а не статична.
Групите могат да получат конфигурационни обекти, които ни помагат в тяхното създаване. В този случай, обектът за конфигурация на групата има 3 части. Първо, ключът за текстурата е задеден на изображението със звездата, star
. Това означава, че всички обекти, създадени чрез конфигурационния обект, ще използват това изображение. След това, стойността на повторението, repeat
, е променена на 11. Понеже един обект се създава автоматично, повтарянето още 11 пъти ще създаде общо 12 обекта.
Последната част е setXY
. Тя променя позицията на дванайсетте обекта на играта, които групата създадава. Всеки ще бъде първоначално сложен на (12; 0), като хоризонталната позиция ще бъде увеличена със 70 за всеки обект. Тоест, първата звезда ще се намира на (12; 0), втората ще се намира 70 пиксела вдясно - на (82; 0), третата - на (152; 0) и така нататък. Стойностите step
са много полезен начин за разположението на обектите в една група по време на създаването ѝ. Стойността 70 е специално избрана, защото с нея звездите ще бъдат на равни разстояния из екрана.
Следващият код итерира всеки обект в групата и му дава случаен вертикален отскок между 0,4 и 0,8. По принцип, тази стойност може да е между 0 (без отскок) и 1 (пълен отскок). Всяка звезда се създава на вертикална позиция 0 и гравитацията ще я издърпа надолу, докато не достигне платформа или земята. Случайната стойност за отскок ще я накара да се върне нагоре - и така до достигане на покой.
Ако изпълним кода в сегашния му вид, звездите ще паднат през земята и извън екрана. За да предотвратим това, ние трябва да проверяваме за удари с платформите. Може да използваме още един обект Collider:
this.physics.add.collider(stars, platforms);
Освен това, ще проверяваме и дали играчът докосва звезда:
this.physics.add.overlap(player, stars, collectStar, null, this);
Това казва на Phaser да проверява за допир между играча и която и да е звезда. При допир, двамата няма да бъдат разделени един от друг, а ще бъдат подадени на функцията collectStar
:
function collectStar (player, star)
{
star.disableBody(true, true);
}
Съвсем просто - физичното тяло на звезда бива забранено, а обектът на играта, който го притежава, се отбелязва като неактивен и невидим. Ако сега пуснем играта, ще видим играч, който може да тича, да скача, да отскача от платформи и да събира звездите, падащи от небето. Не е зле за няколко ред четлив (поне така се надяваме!) код: