Flash este lent abandonat de Adobe în favoarea HTML5 și JavaScript; End-of-ul său oficial este stabilit pentru anul 2020. Și acolo va veni acest articol la îndemână.
Sfaturile descrise mai jos scopul de a ajuta dezvoltatorii de jocuri HTML5 Evitați greșelile comune atunci când convertiți jocurile flash la JavaScript, precum și făcând întregul proces de dezvoltare să meargă cât mai bine posibil. Tot ce aveți nevoie este cunoașterea de bază a JavaScript, WebGL și cadrul Phaser.
Schimbarea proiectului dvs. de joc de la SWF la JavaScript poate genera o mai bună experiența utilizatorului , care la rândul său îi conferă un aspect modern. Dar cum să o faci? Aveți nevoie de un convertor dedicat jocului JavaScript pentru a scăpa de această tehnologie depășită? Ei bine, Flash la conversia HTML5 poate fi o bucată de tort - Iată ce are un dezvoltator de jocuri JavaScript cu experiență despre această chestiune.
Vreți să vă păstrați procesul de proiectare simplu? A Builder de site-uri web și dreptul web hosting Furnizorul poate să o păstreze așa.
Conversia unui joc la o altă platformă este o oportunitate excelentă de ao îmbunătăți, remedia problemele și de a spori publicul. Mai jos sunt puține lucruri care pot fi ușor de făcut și merită luate în considerare:
Când vine vorba de dezvoltarea jocului JavaScript, poate fi tentant să folosiți HTML și CSS pentru butoanele, widget-urile și alte elemente GUI. Sfatul nostru este să fii atent aici. Este contraintuitiv, dar, de fapt, leveraging elementele DOM este mai puțin performant pe jocuri complexe și acest lucru câștigă mai multe semnificații pe telefonul mobil. Dacă doriți să obțineți constantă 60 fps pe toate platformele, atunci demisionarea de la HTML și CSS poate fi necesară.
Elementele GUI non-interactive, cum ar fi barele de sănătate, barurile de muniție sau contoarele de scor pot fi implementate cu ușurință în Phaser prin utilizarea imaginilor regulate (clasa "Phaser.Image", folosind proprietatea ".crop" pentru tăiere și "Phaser". Clasa de text pentru etichete simple de text.
Elemente interactive, cum ar fi butoanele și casetele de selectare, pot fi implementate utilizând clasa "Phaser.button" încorporată. Alte elemente mai complexe pot fi compuse din diferite tipuri simple, cum ar fi grupuri, imagini, butoane și etichete de text.
Dacă doriți să trimiteți text cu un font vectorial (de exemplu, TTF sau OTF), atunci trebuie să vă asigurați că fontul a fost deja încărcat de browser înainte de a face orice text. Phaser V2.6 nu oferă o soluție în acest scop, dar poate fi utilizată o altă bibliotecă - Web Font încărcător .
Presupunând că aveți un fișier de font și includeți încărcătorul de font Web în pagina dvs., apoi mai jos este un exemplu simplu de utilizare a unui font. Faceți un fișier CSS simplu care va fi încărcat de Web Font încărcător (nu este necesar să îl includeți în HTML):
@ font-fata {
// acest nume pe care îl veți folosi în JS
Font-Family: "Gunplay";
// URL în fișierul font, poate fi relativă sau absolută
SRC: URL ("../ fonts / gunplay.ttf") ("TrueType");
Greutate font: 400;
}
Definiți acum o variabilă globală numită WebFontConfig. Ceva la fel de simplu ca acesta va fi suficient:
var webfontconfig = {
"Clase": FALSE,
"Timeout": 0,
"Activ": funcția () {
// fontul a încărcat cu succes ...
},
'personalizat': {
"Familiile": ["Gunplay"],
// URL-ul la CSS menționate anterior
"URL-uri": [stiluri / fonturi.css "]
}
};
Nu uitați să vă puneți codul în apelul "activ" afișat mai sus. Si asta e!
Acum suntem în punctul de mijloc al flash-ului nostru la conversia JavaScript - este timpul să avem grijă de umbre. Pentru a stoca în mod persistent datele locale în ActionScript, veți folosi clasa "Sharedobject". În JavaScript, înlocuirea simplă este LocalStorage API. , care permite stocarea șirurilor de descărcare ulterioară, reîncărcarea paginii supraviețuitoare.
Economisirea datelor sunt foarte simple:
Var Progress = 15;
LocalStorage.setitem ("Mygame.progress", Progress);
Rețineți că, în exemplul de mai sus, variabila "progres", care este un număr, va fi convertită într-un șir.
Încărcarea este prea simplă, dar amintiți-vă că valorile recuperate vor fi șiruri de caractere sau null dacă nu există.
VAR PROGRESS = PARSINT (localStorage.getitem ("mygame.progress ')) || 0;
Aici vă asiguram că valoarea de returnare este un număr. Dacă nu există, atunci 0 va fi atribuită variabila "progresului".
De asemenea, puteți să stocați și să recuperați mai multe structuri complexe, de exemplu, JSON:
Statistici var = {"Obiective": 13, "câștigă": 7, "pierderi": 3, "trage": 1
};
LocalStorage.SetITEM ("Mygame.Stats", JSON.Stringfy (statistici));
...
Var stats = json.parse (localStorage.getitem ("mygame.stats ')) || {};
Există câteva cazuri în care obiectul "localstatoraj" nu va fi disponibil. De exemplu, atunci când utilizați fișierul: // protocol sau când o pagină este încărcată într-o fereastră privată. Puteți utiliza instrucțiunea "Încercați și captura" pentru a vă asigura că codul va continua să lucreze, cât și să utilizeze valorile implicite, care sunt afișate în exemplul de mai jos:
Încercați {
VAR PROGRESS = LOCALSTORAGE.GETITEM ("Mygame.progress");
} captura (Excepție) {
// LocalStorage nu este disponibil, utilizați valorile implicite
}
Un alt lucru de reținut este că datele stocate sunt salvate pe domeniu, nu pe adresa URL. Deci, dacă există riscul ca multe jocuri să fie găzduite pe un singur domeniu, atunci este mai bine să utilizați un prefix (spațiu de nume) atunci când economisiți. În exemplul de mai sus, "Mygame". Este un prefix și de obicei doriți să îl înlocuiți cu numele jocului.
Dacă jocul dvs. este încorporat într-un iFrame, atunci localStorage nu va persista pe iOS. În acest caz, va trebui să stocați date în iframe-ul părinte.
Când Phaser și Pixijs vă fac spritele, ele folosesc un shader simplu de fragment intern. Nu are multe caracteristici pentru că este adaptat la viteză. Cu toate acestea, puteți înlocui acel shader pentru scopurile dvs. De exemplu, puteți să o folosiți pentru a inspecta supraîncărcarea sau pentru a susține mai multe caracteristici pentru redare. Mai jos este un exemplu de cum să furnizați propriul dvs. fragment implicit la Phaser V2.
Preîncărcați funcția () {
acest.load.shader ('Filename.frag', 'Shaders / Filename.frag');
}
Funcție Creați () {
Var Renderer = this.renderer;
var latch = redenrer.spritebatch;
batch.defaultshader =.
New Pixi.AbstractFilter (the the.Cache.getshader (denumit "filename.frag '));
batch.SetContext (Renderer.gl);
}
O shader implicită personalizată poate fi utilizată pentru a înlocui metodele implicite de tentare în Phaser și Pixijs. Continsul în Phaser și Pixijs funcționează prin multiplicarea pixelilor de textură printr-o anumită culoare. Multiplicarea întotdeauna întunecă culorile, ceea ce evident nu este o problemă; Este pur și simplu diferit de tinutul blițului. Pentru unul dintre jocurile noastre, aveam nevoie pentru a implementa tinting similar cu Blițul și a decis că ar putea fi utilizat un shader implicit personalizat. Mai jos este un exemplu de un astfel de shader de fragment:
// varianta specifică, similară cu tinutul flash care adaugă
// la culoare și nu se înmulțește. Un negativ de o culoare
// trebuie să fie furnizate pentru ca acest shader să funcționeze corect, adică set
// sprite.tint la 0 pentru a transforma întreaga sprite la alb.
Precision Lowp Float;
VEC2 VEC2 VETIMECOORD;
VEC4 VC4 VCOLOR;
uniformă de eșantion2D USAMPLER;
Void principal (gol) {
VEC4 F = Texture2D (USAMPLER, VTETOORD);
float a = clemă (vcolor.a, 0.00001, 1.0);
GL_FRAGCOLOR.RGB = F.RGB * VCOLOR.A + CLAMP (1.0 - VCOLOR.RGB / A, 0.0, 1.0) * VCOLOR.A * F.A;
GL_FRAGCOLOR.A = F.A * VCOLOR.A;
}
Acest Shader luminează pixelii prin adăugarea unei culori de bază la ceață. Pentru ca acest lucru să funcționeze, trebuie să furnizați negative despre culoarea dorită. Prin urmare, pentru a obține alb, trebuie să setați:
Sprite.Tint = 0x000000; // aceste culori sprite la alb
Sprite.tint = 0x00ffff; // aceasta dă roșu
Înlocuirea unui shader implicit poate fi, de asemenea, influențat pentru a ajuta la depanarea. Mai jos am explicat cât de suprasolicită poate fi detectată cu un astfel de shader.
Supravegherea se întâmplă atunci când mulți sau toți pixelii de pe ecran sunt prestate de mai multe ori. De exemplu, multe obiecte care au același loc și fiind prestate unul peste altul. Câți pixeli Un GPU poate reda pe secundă este descris ca rată de umplere. GPU-urile desktop moderne au o rată excesivă de umplere pentru scopuri 2D obișnuite, dar cele mobile sunt mult mai lente.
Există o metodă simplă de a afla câte ori fiecare pixel de pe ecran este scris prin înlocuirea shader-ului implicit de fragmente globale din Pixijs și Phaser cu aceasta:
Void principal (void) {
GL_FRAGCOLOR.RGB + = 1.0 / 7.0;
}
Acest Shader luminează pixelii care sunt procesați. Numărul 7.0 indică câte scrieri sunt necesare pentru a transforma pixelii albi; Puteți să vă reglați acest număr la preferințele dvs. Cu alte cuvinte, pixelii mai brichete pe ecran au fost scrise de mai multe ori, iar pixelii albi au fost scrise de cel puțin șapte ori.
Acest Shader ajută, de asemenea, să găsească atât obiectele "invizibile" încât, din anumite motive, sunt încă prestate și sprite care au suprafețe transparente excesive în jurul care trebuie să fie dezbrăcate (GPU trebuie încă să proceseze pixeli transparenți în textura dvs.).
Un motor de fizică este un mijloc de middleware care este responsabil pentru simularea corpurilor de fizică (de obicei dinamica corpului rigid) și coliziunile lor. Motoarele fizicii simulează spațiile 2D sau 3D, dar nu ambele. Un motor de fizică tipic va oferi:
Există un plugin fazer care funcționează bine în acest scop. Box2D este de asemenea utilizat în motorul jocului de unitate și studioul de gamemaker 2.
În timp ce un motor de fizică va accelera dezvoltarea dvs., există un preț pe care va trebui să-l plătiți: reducerea performanței runtime. Detectarea coliziunilor și calcularea răspunsurilor este o sarcină intensivă a CPU. S-ar putea să fiți limitat la mai multe duzini de obiecte dinamice într-o scenă pe telefoane mobile sau o performanță degradată față, precum și o rată a cadrului redus sub 60 fps.
Dacă aveți un joc de sunet flash în interiorul unui fișier .fla, atunci exportul lor de la GUI nu este posibil (cel puțin nu în Adobe Animate CC 2017) din cauza lipsei de opțiuni de meniu care servește acest scop. Dar există o altă soluție - un script dedicat care face doar:
Funcție normalizatăName (nume) {
// convertește un nume de camelcase la numele Snake_case
return name.replace (/ (a-z]) / g, "_ $ 1 '). Înlocuiți (/ ^ _ /,' ') .tolowowercase ();
}
Funcție DisplayPath (PATH) {
// face calea fișierului mai ușor de citit
Întoarceți Unescape (calea) .Replace ('File: //', '') .Replace ('|', '' ');
}
fl.outputpanel.clear ();
dacă (fl.getdocumentdom (). biblioteca.GetSelecteditems () lungime & gt; 0)
// obțineți numai elemente selectate
VAR LIBRARY = FL.GETDOCUMENTDOM (). Biblioteca.GetSelectionitems ();
altfel
// obțineți toate elementele
VAR Library = Fl.getDocumentdom (). Biblioteca.items;
// Cereți utilizatorului pentru directorul de destinație la export
var root = fl.frowsefolderurl ("Selectați un dosar");
erori var = 0;
pentru (var i = 0; i & lt; bibliotecă.Lend; i ++) {
var item = biblioteca [i];
Dacă (item.Itemtype! == "sunet")
continua;
calea var = rădăcină + '/';
dacă (item.OniginalCompressionType === "brut")
calea + = normalizateName (element.name.split ('.') ) + '.wav';
altfel
calea + = normalizateName (element.name);
var succes = item.exporttofile (calea);
Dacă (! succesul)
Erori + = 1;
fl.trace (DisplayPath (PATH) + ":" + (Succes? "OK": "eroare"));
}
FLTRACE (Eroare (erori) ");
Cum se utilizează scriptul pentru a exporta fișierele de sunet:
Este gata! Ar trebui să aveți acum fișiere WAV în directorul specificat. Ceea ce a mai rămas este să le convertiți, de exemplu, MP3, OGG sau AAC. (Dacă aveți fișiere de joc pentru a păstra în siguranță, faceți upgrade la decent Stocare in cloud .)
Formatul bun vechi MP3 se întoarce, deoarece unele brevete au expirat și acum fiecare browser poate decoda și a juca MP3-uri. Acest lucru face ca dezvoltarea să fie mai ușoară, deoarece în cele din urmă nu este nevoie să pregătiți două formate audio separate. Anterior aveți nevoie, de exemplu, fișiere OGG și AAC, în timp ce MP3 va fi suficient.
Cu toate acestea, există două lucruri importante pe care trebuie să le amintiți despre MP3:
Acest articol a fost publicat inițial în numărul 277 din revista Creative Web Design Web Designer. Cumpăra problema 277 aici sau Aboneaza-te la designerul web aici .
Articole similare:
(Credit de imagine: Sonny Flanaghan) Învățați cum să curățați periculosul în mod corespunzător este o abili..
(Credit Imagine: Adam Dewhirst) ShapR3D este un instrument excelent pentru kitbashing. Ajută la lansarea literalment..
(Credit de imagine: Patrick J Jones) Învățând cum să atragă un braț care arată realist este o parte vitală a..
Conversii de zi cu zi au fost în jur, atâta timp cât Photoshop a avut straturi de ajustare, dar stăpânirea efectului ia o mu..
Mahlstick (sau maulstick, așa cum este cunoscut uneori) este un instrument de susținere stabilizator utilizat de pictori atunci..
Cand vine vorba de Desenarea creaturilor credibile , trebuie să vă concentrați asupra sistemelor scheletice, mu..
Când creați o vizualizare arhitecturală, trebuie să reprezentați o mulțime de detalii și una dintre cele mai consumatoare ..
Pentru acest tutorial, vom folosi Vue xstream. pentru a crea un cer plin de nori. În timp ce ați putea alege să..