W erze gier takich jak World of Warcraft czy Farmville zjawisko „levelowania” i „nabijania expa” jest dość popularnym zjawiskiem. Mechanizm ten na pewno napędza rozgrywkę i sprawia że użytkownik chce grać widząc swój postęp.
Dzisiaj udostępniam gotowy kod realizujący taki feature, całość jest pisana z zamysłem urządzeń mobilnych (brak wymaganych bibliotek, wykorzystanie CSS Transforms)
Niestety kompletnie w tym wszystkim zapomniałem o tagu <progress/> w HTML5 http://www.w3schools.com/html5/tag_progress.asp i niestety mój kod wykorzystuje divy, mimo że nowy tag pasuje tutaj idealnie. Nie sprawdzałem tego ale wydaje mi się że poza semantycznym kodem (i wcale nie mówię że to nie jest ważne) żadnych innych zysków nie będziemy mieli np. w postaci większej wydajności.
Całość realizuje kilka podstawowych funkcji:
- możemy dowolnie konfigurować doświadczenie wymagane na dany level
- pasek przy przejściu na następny level jest dopełniany do końca a następnie zerowany (nie ma efekty zmniejszania paska)
- możliwość podpięcia callbacka na dowolną funkcje przy przejściu na kolejny level
- całość jest napisana z myślą o urządzeniach moblinych
Kod może nie piorunuje :D ale radzi sobie całkiem nieźle a samo użycie jest bardzo proste:
var oBar = new pBar({ elems: { bar: document.getElementById('pBar'), proc: document.getElementById('pBarProc'), value: document.getElementById('pBarValue'), max: document.getElementById('pBarMax'), level: document.getElementById('pBarLevel') }, levels: [ {n: 1, max: 400}, {n: 2, max: 900}, {n: 3, max: 1500}, {n: 4, max: 2200}, {n: 5, max: 3400}, {n: 6, max: 5000}, {n: 7, max: 7000} ], value: 0, duration: 500, freq: 40, onNextLevel: fOnNextLevel, isAnimate: true, isAnimateValues: false });
Z myślą o wydajności, klasa pBar nie generuje HTMLa i należy napisać go samemu, w moim przykładnie jest to:
<div class="pBarContainer"> <div id="pBar" class="pBar"></div> <div class="text"> <span> <span id="pBarValue">x</span> / <span id="pBarMax">x</span> </span> <span class="procContainer"> <span class="proc" id="pBarProc"></span> % </span> <span class="level"> Level <span id="pBarLevel">1</span> </span> </div> <div id="stars"> <div id="star1" class="star hidden"></div> </div> </div>
Ze spraw technicznych chciałby zwrócić uwagę tylko na jeden szczegół. Jeśli używamy CSS Transforms na urządzeniach mobilnych to zawszę, ale to zawszę, dodajemy do animowanego elementu:
translate3d(0, 0, 0);
Dzięki temu zyskujemy na wydajności poprzez włączenie hardware-owej akcelaracji animacji. Różnice można zobaczyć na tym filmiku: