Navigation

Част 8 - Звезден прах

Време е да дадем предназначение на малката ни игра. Ще поръсим няколко звезди върху сцената и ще дадем на играча да ги събира. За да постигнем това, ще създаден нова група на име 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);
}

Съвсем просто - физичното тяло на звезда бива забранено, а обектът на играта, който го притежава, се отбелязва като неактивен и невидим. Ако сега пуснем играта, ще видим играч, който може да тича, да скача, да отскача от платформи и да събира звездите, падащи от небето. Не е зле за няколко ред четлив (поне така се надяваме!) код:

image