Scrieți o singură dată, publicați peste tot cu HaxePunk Sfaturi pentru cross-platform

Bine ați venit în a doua parte a acestei serii de tutorial despre realizarea de jocuri cross-platform cu HaxePunk. Când am plecat, am terminat să creăm un simplu joc de curse cu drag, care poate fi compilat pentru multe platforme diferite. În această a doua parte, vă voi oferi câteva sfaturi pentru a vă face jocurile să funcționeze bine pe mai multe tipuri de dispozitive. Vom vorbi despre dimensiunile și rezoluțiile ecranului, tipurile de intrări, layout-urile de interfață și sfaturi pentru depunerea magazinelor de aplicații.

Dimensiunile și rezoluțiile ecranului

Ecranul este fereastra în jocul dvs. și nu ar trebui lăsată ca o gândire ulterioară. Gândiți-vă la dispozitivele pe care intenționați să le lansați. O versiune de Windows / Mac / Linux poate depinde, de obicei, de faptul că utilizatorul are un ecran suficient de mare pentru a se încadra în joc în modul ferestrei și poate să poarte scrisori orice diferențe de rezoluție în modul ecran complet. 

Dispozitivele mobile sunt destul de diferite. Există multe ecrane cu diferite rezoluții și dimensiuni. Nu puteți garanta că jucătorul va juca pe un dispozitiv cu aceeași rezoluție ca și jocul dvs. Scalarea se va întâmpla.

În primul articol din această serie, am trecut prin dezvoltarea unui mic exemplu de joc. Puteți descărca proiectul codului sursă complet utilizând butonul din dreapta acestui articol. Ultima dată ați fi putut observa astfel de afirmații:

y = -image.scaledHeight;

Există proprietăți de lățime și înălțime pentru imagini, și există scaledWidth și scaledHeight proprietăți. Semnificația lățimii și înălțimii unei imagini este evidentă. Proprietățile scalate sunt puțin mai complexe. scaledWidth proprietatea este lățimea imaginii înmulțită cu scala imaginii înmulțită cu scala jocului și scaledHeight este similar, dar pentru înălțime.

Cu toate acestea, acest lucru devine puțin confuz atunci când jocul este redus automat, așa cum se poate întâmpla pe un dispozitiv Android cu o rezoluție a ecranului mai scăzută decât jocul a fost construit pentru. Într-o astfel de situație, proprietatea scalei pe care HaxePunk o citește pentru a seta scara imaginilor și, prin urmare, dimensiunea lor scalată / înălțime, probabil nu va fi setată corect. 

De fapt, nu există deloc nici o scalare, ci doar o micșorare a ecranului. Pentru a rezolva acest lucru, putem calcula valoarea scalării pe care o dorim, pe baza rezoluției jocului și a rezoluției ecranului pe care rulează jocul. În Main.hx putem adăuga acest cod înainte de a seta scena activă:

raportul var: Float = Math.min (HXP.stage.stageWidth / screenWidth, HXP.stage.stageHeight / screenHeight); HXP.screen.scaleX = raport; HXP.screen.scaleY = raport; Extensia HXP (HXP.stage.stageWidth, HXP.stage.stageHeight);

În codul de mai sus, screenWidth și screenHeight sunt variabilele pe care le-am creat și le-am stabilit la lățimea și înălțimea pe care le-am folosit pentru joc. De asemenea, puteți utiliza pur și simplu constante precum 640 și 480, dar prefer să folosesc variabilele.

Codul utilizează Math.min () pentru a seta variabila raportului la cea mai mică diferență a dimensiunilor ecranului pentru a împiedica întinderea grafică dacă diferențele de lățime și înălțime nu sunt egale. Poate doriți să permiteți întinderea, caz în care va trebui să setați HXP.screen.scaleX și scaleY la valori diferite.

După calculul raportului, HXP.resize () se numește. Această funcție este ceea ce redimensionează de fapt ecranul. S-ar putea să doriți, de asemenea, să salvați rapoartele pentru a fi utilizate în altă parte, dar rar mi sa părut necesar.

Cu ecranul redimensionat, suntem încă capabili să facem lucruri de genul:

// introduceți entitatea în colțul din dreapta jos al ecranului, indiferent de dimensiunea entity.x = HXP.screen.width - entity.scaledWidth; entity.y = HXP.screen.height - entity.scaledHeight;

Acest lucru ne permite să avem o interfață de utilizare consistentă pentru un joc pe mai multe dispozitive.

Orientarea jocurilor

În tutorialul anterior, am vorbit despre project.xml fișier, care ne permite să configurați cu ușurință multe aspecte ale jocului nostru. Printre altele, putem seta orientarea jocului, care este utilă pentru dispozitivele mobile. De exemplu, dacă vrem ca jocul nostru să funcționeze în modul portret pe dispozitive mobile, dar în modul peisaj pe desktop:


 

Intrare și compilare condiționată

Intrarea diferă foarte mult între tipurile de dispozitive. Este nerezonabil să se aștepte ca jucătorul să atașeze o tastatură și un mouse Bluetooth pentru a juca un joc pe telefonul lor și este puțin probabil chiar și astăzi ca un desktop să fie echipat cu o touchscreen.

În exemplul de joc din tutorialul anterior, am folosit HaxePunk's Cheie pentru a verifica dacă apăsați tasta. Cu toate acestea, pe dispozitivele cu ecran tactil ar face sens să nu importați clasa Key, menținând dimensiunea jocului mai mică, pentru că vom folosi controalele touch.

Haxe face acest lucru ușor pentru noi, permițându-ne să folosim compilația condiționată. Funcționează așa:

#if condiția var x = 0; someFunction (); #elseif altă condiție var y = 1; #else var z = 2; anotherFunction (); #Sfârșit

Condițiile sunt evaluate la momentul compilării, ceea ce înseamnă că putem include sau exclude coduri în funcție de platforma pe care o vizăm! Pentru a exclude clasa cheie atunci când vizează dispozitive mobile, procedați pur și simplu:

import com.haxepunk.utils.Input; // probabil veți dori totuși acest lucru, deoarece manipulează intrările pentru toate tipurile de dispozitive #if! mobile import com.haxepunk.utils.Key; #end // De asemenea, dorim să eliminăm orice tastatură definită pe care am putea să o avem, ca de exemplu #if! mobile Input.define ("stânga", [Key.A, Key.LEFT]); Input.define ("dreapta", [Key.D, Key.RIGHT]); #Sfârșit

Observați! (nu) operatorul logic utilizat mai sus. Putem folosi, de asemenea, && (și), precum și || (sau) în compilația condiționată. Dacă doriți să includeți cod pentru dispozitive mobile, dar nu pentru iOS, puteți spune

#if (mobile &&! ios) // cod aici #end

După cum puteți vedea, compilația condiționată este destul de puternică! Să ne întoarcem la manipularea intrărilor pentru un minut. Excluderea clasei cheie atunci când compilați pentru obiective cu ecran tactil este frumos, dar nu verifică automat pentru intrarea atingere. 

Folosind jocul de curse din ultimul tutorial, ca exemplu, am putea schimba verificarea de intrare de la aceasta:

dacă (Input.pressed ("left")) move ("stânga");  dacă (Input.pressed ("right")) move ("right"); 

La acest:

#if mobil dacă (Input.mousePressed) if (Input.mouseX < HXP.screen.width * .5)  move("left");  else  move("right");   #else if(Input.pressed("left"))  move("left");  if(Input.pressed("right"))  move("right");  #end

Acum, tastatura va fi utilizată pentru a controla mișcarea pe platformele desktop și atingând partea stângă sau dreaptă a ecranului va controla mișcarea pe platformele mobile!

Dacă doriți, puteți să specificați și cuvintele dvs. cheie pe care să le utilizați cu compilația condiționată, atât în ​​codul sursă al jocului, cât și în fișierul de proiect .xml.

#if myOwnKeyword aCoolSecretForWhateverReason (); #Sfârșit

Pentru a include codul de mai sus, puteți să transmiteți o opțiune atunci când compilați:

test de var  -DmyOwnKeyword

Acest lucru ar putea fi folosit pentru a marca copii de revizuire sau versiuni beta ca atare în interiorul jocului în sine, pentru a descuraja scurgerile sau beta-test diferite părți ale jocului cu oameni diferiți. Acesta ar putea fi, de asemenea, folosit pentru a crea o versiune demo care limitează zonele jocului, sau chiar folosit pentru a face o versiune personală ca un cadou surpriză.

Trimiterea la mai multe magazine de aplicații

După ce ați realizat un joc foarte încrucișat, următorul pas este să-l lansați pe diferite magazine și aplicații de pe piață. Fiecare piață va avea cerințe diferite, dar există lucruri pe care le puteți face care se vor aplica tuturor (sau cel puțin marea majoritate a) piețelor. Desigur, cele mai bune sfaturi pe care le pot oferi în acest domeniu este de a citi cu atenție instrucțiunile de depunere pentru a afla ce vrea fiecare piață de la tine.

O cerință evidentă este furnizarea de capturi de ecran. Numărul și rezoluția cerute vor varia, însă fiecare piață ar trebui să vă spună ce vrea. Aș recomanda să furnizați absolut nu mai puțin de două screenshot-uri, dar de preferință patru sau mai multe.

La fel cum cerințele pentru capturile de ecran vor varia, la fel vor fi și cerințele pentru pictograme. Unele magazine vor dori o pictogramă cu rezoluție mai mică, precum și o pictogramă cu rezoluție mai mare, deci este mai bine să începeți cu o pictogramă mare care poate fi redusă la dimensiuni diferite.

Unele magazine vă vor permite să încărcați unul sau mai multe videoclipuri. Vă sugerăm să creați un videoclip care să demonstreze elementele de bază ale jocului atunci când trimiteți la magazinele de aplicații mobile și cel puțin un videoclip pentru alte piețe (Steam, Desura etc.). Amintiți-vă: dacă o imagine este în valoare de o mie de cuvinte și un videoclip poate fi considerat ca la fel de multe imagini jucate în succesiune, un videoclip este destul de valoros!

Există, de asemenea, mai multe informații care ar trebui să fie solicitate în orice magazin pe care trimiteți un joc la: titlu, descriere, pictogramă și categorie. Este util pentru jucător (potențial sau altfel) dacă aceste informații sunt identice în toate platformele.

Acum poți publica peste tot

După construirea unui joc cu OpenFL, binarul ar trebui să fie gata să se prezinte pe orice piață pentru platforma pe care ați construit-o fără modificări necesare. Nu uitați să construiți și să trimiteți o versiune de lansare, nu o versiune de depanare!

Acum că ați văzut modalități de a face ca jocurile dvs. să funcționeze bine pe o varietate de dispozitive, sper că veți pune aceste cunoștințe în uz și veți face unele jocuri interesante! Ultimul cuvânt de sfat: finalizarea unui joc este minunat și ceva de mândru, dar eliberarea unui joc poate dura la fel de multă muncă!