Το Flash εγκαταλείπεται αργά από την Adobe υπέρ της HTML5 και JavaScript. Το επίσημο τέλος της ζωής του ορίζεται για το έτος 2020. Και εκεί είναι το άρθρο όπου αυτό το άρθρο θα έρθει σε εύχρηστο.
Οι συμβουλές που περιγράφονται παρακάτω στοχεύουν να βοηθήσουν τους προγραμματιστές παιχνιδιών HTML5 να αποφεύγουν τα κοινά λάθη κατά τη μετατροπή των παιχνιδιών flash στο JavaScript, καθώς και η όλη διαδικασία της ανάπτυξης να πάει όσο το δυνατόν πιο ομαλή. Το μόνο που χρειάζεστε είναι βασικές γνώσεις για το JavaScript, WebGL και το πλαίσιο του Phaser.
Η αλλαγή του σχεδιασμού παιχνιδιού σας από το SWF στο Javascript μπορεί να δώσει ένα καλύτερο εμπειρία χρήστη , που με τη σειρά του το δίνει μια σύγχρονη εμφάνιση. Αλλά πώς να το κάνετε; Χρειάζεστε ένα αποκλειστικό μετατροπέα παιχνιδιών JavaScript για να απαλλαγείτε από αυτή την ξεπερασμένη τεχνολογία; Λοιπόν, το φλας στη μετατροπή HTML5 μπορεί να είναι ένα κομμάτι κέικ - εδώ είναι αυτό που ένας έμπειρος προγραμματιστής παιχνιδιών JavaScript πρέπει να πει για το θέμα.
Σας αρέσει να κρατάτε τη διαδικασία σχεδιασμού σας απλή; ΕΝΑ οικοδόμος ιστότοπου και το δικαίωμα web hosting Ο πάροχος μπορεί να το κρατήσει έτσι.
Η μετατροπή ενός παιχνιδιού σε μια άλλη πλατφόρμα είναι μια εξαιρετική ευκαιρία να το βελτιώσετε, να διορθώσετε τα θέματα του και να αυξήσετε το κοινό. Παρακάτω είναι λίγα πράγματα που μπορούν εύκολα να γίνουν και αξίζουν να εξεταστούν:
Όταν πρόκειται για την ανάπτυξη παιχνιδιών JavaScript, μπορεί να είναι δελεαστικό να αξιοποιήσετε το HTML και το CSS για κουμπιά εντός παιχνιδιού, widgets και άλλα στοιχεία GUI. Η συμβουλή μας είναι να είστε προσεκτικοί εδώ. Είναι αντίθετο, αλλά στην πραγματικότητα αξιοποιεί τα στοιχεία DOM είναι λιγότερο αναπηρία σε πολύπλοκα παιχνίδια και αυτό το κέρδος πιο σημαντικό για το κινητό. Εάν θέλετε να επιτύχετε σταθερά 60 fps σε όλες τις πλατφόρμες, τότε μπορεί να απαιτηθεί παραίτηση από HTML και CSS.
Τα μη διαδραστικά στοιχεία GUI, όπως οι μπάρες υγείας, οι μπάρες πυρομαχικών ή οι μετρητές βαθμολογίας μπορούν εύκολα να εφαρμοστούν στο Phaser χρησιμοποιώντας τακτικές εικόνες (την κατηγορία "Phaser.image"), αξιοποιώντας την ιδιότητα ".crop" για το κόψιμο και το phaser. Κείμενο "Κλάση για απλές ετικέτες κειμένου.
Τα διαδραστικά στοιχεία όπως τα κουμπιά και τα πλαίσια ελέγχου μπορούν να υλοποιηθούν χρησιμοποιώντας την ενσωματωμένη κλάση «phaser.button». Άλλα, πιο περίπλοκα στοιχεία μπορούν να αποτελούνται από διαφορετικούς απλούς τύπους, όπως ομάδες, εικόνες, κουμπιά και ετικέτες κειμένου.
Εάν θέλετε να κάνετε κείμενο με μια προσαρμοσμένη γραμματοσειρά φορέα (π.χ. TTF ή OTF), τότε πρέπει να βεβαιωθείτε ότι η γραμματοσειρά έχει ήδη φορτωθεί από το πρόγραμμα περιήγησης πριν από την εμφάνιση οποιουδήποτε κειμένου. Το Phaser V2.6 δεν παρέχει λύση για το σκοπό αυτό, αλλά μπορεί να χρησιμοποιηθεί μια άλλη βιβλιοθήκη - Φορτιστής γραμματοσειράς ιστού .
Υποθέτοντας ότι έχετε ένα αρχείο γραμματοσειράς και συμπεριλάβετε το φορτωτή γραμματοσειράς ιστού στη σελίδα σας, τότε παρακάτω είναι ένα απλό παράδειγμα του τρόπου φόρτωσης μιας γραμματοσειράς. Δημιουργήστε ένα απλό αρχείο CSS που θα φορτωθεί από φορτωτή γραμματοσειράς ιστού (δεν χρειάζεται να το συμπεριλάβετε στο HTML σας):
@ font-face {
// Αυτό το όνομα θα χρησιμοποιήσετε στο JS
Font-οικογένεια: 'gunplay'.
// URL στο αρχείο γραμματοσειράς, μπορεί να είναι σχετική ή απόλυτη
SRC: URL ('../ fonts / gunplay.ttf') μορφή ('truetope').
Γραμματοσειρά: 400;
}
Τώρα ορίστε μια παγκόσμια μεταβλητή που ονομάζεται webfontconfig. Κάτι τόσο απλό όσο αυτό συνήθως αρκεί:
var webfontconfig = {
'Classes': False,
'Timeout': 0,
'Active': Λειτουργία () {
// Η γραμματοσειρά έχει φορτωθεί με επιτυχία ...
},
'έθιμο': {
«οικογένειες»: ['gunplay'],
// URL στο προηγουμένως αναφερθέν CS
'URLS': ['Styles / FONTS.CSS']
}
} ·
Θυμηθείτε να τοποθετήσετε τον κωδικό σας στην "ενεργή" επανάκληση που φαίνεται παραπάνω. Και αυτό είναι!
Τώρα είμαστε στο μεσαίο σημείο του φλας στη μετατροπή JavaScript - ήρθε η ώρα να φροντίσετε τους Shaders. Για να αποθηκεύσετε επίμονα τοπικά δεδομένα στην ActionScript, θα χρησιμοποιούσατε την κατηγορία "ShareDobject". Στο JavaScript, η απλή αντικατάσταση είναι η localstorage api , που επιτρέπει την αποθήκευση συμβολοσειρών για μεταγενέστερη ανάκτηση, επιζώντες επαναλήψεις σελίδας.
Τα αποταμιευτικά δεδομένα είναι πολύ απλά:
Var Progress = 15;
localstorage.Setitem ('mygame.progress', πρόοδος).
Σημειώστε ότι στο παραπάνω παράδειγμα η μεταβλητή "Πρόοδος", η οποία είναι ένας αριθμός, θα μετατραπεί σε μια συμβολοσειρά.
Η φόρτωση είναι απλά, αλλά θυμηθείτε ότι οι ανακτημένες τιμές θα είναι χορδές ή μηδενικές αν δεν υπάρχουν.
Var Progress = parseint (localstorage.getitem ('mygame.progress')) || 0;
Εδώ εξασφαλίζουμε ότι η τιμή επιστροφής είναι ένας αριθμός. Εάν δεν υπάρχει, τότε το 0 θα αντιστοιχιστεί στη μεταβλητή "Πρόοδος".
Μπορείτε επίσης να αποθηκεύσετε και να ανακτήσετε περισσότερες σύνθετες δομές, για παράδειγμα, JSON:
var stats = {«γκολ»: 13, «κερδίζει»: 7, «απώλειες»: 3, «αντλεί»: 1
};
localstorage.etitem ('mygame.stats', json.stringify (στατιστικά στοιχεία)).
...
var stats = json.parse (localstorage.getitem ('mygame.stats')) || {};
Υπάρχουν ορισμένες περιπτώσεις που το αντικείμενο του «τοπικού τοπικού» δεν θα είναι διαθέσιμο. Για παράδειγμα, όταν χρησιμοποιείτε το αρχείο: // πρωτόκολλο ή όταν μια σελίδα φορτώνεται σε ένα ιδιωτικό παράθυρο. Μπορείτε να χρησιμοποιήσετε τη δήλωση "Δοκιμάστε και να πιάσετε" για να βεβαιωθείτε ότι ο κωδικός σας θα συνεχίσει και οι δύο προεπιλεγμένες τιμές, η οποία εμφανίζεται στο παρακάτω παράδειγμα:
Δοκιμάστε {
Var Progress = localstorage.getitem ('mygame.progress');
} catch (εξαίρεση) {
// Το τοπικό δίκτυο δεν είναι διαθέσιμο, χρησιμοποιήστε τις προεπιλεγμένες τιμές
}
Ένα άλλο πράγμα που πρέπει να θυμάστε είναι ότι τα αποθηκευμένα δεδομένα αποθηκεύονται ανά τομέα, όχι ανά διεύθυνση URL. Έτσι, αν υπάρχει κίνδυνος να φιλοξενηθούν πολλά παιχνίδια σε ένα μόνο τομέα, τότε είναι καλύτερο να χρησιμοποιήσετε ένα πρόθεμα (ονομάτο) κατά την αποταμίευση. Στο παραπάνω παράδειγμα, «Mygame». Είναι ένα πρόθεμα και συνήθως θέλετε να το αντικαταστήσετε με το όνομα του παιχνιδιού.
Εάν το παιχνίδι σας είναι ενσωματωμένο σε ένα iframe, τότε η τοπική τάση δεν θα επιμείνει στην Ίο. Σε αυτή την περίπτωση, θα πρέπει να αποθηκεύσετε δεδομένα στο γονέα IFRAME.
Όταν ο Phaser και ο Pixijs καθιστούν τα sprites σας, χρησιμοποιούν ένα απλό εσωτερικό shader κομμάτι. Δεν έχει πολλά χαρακτηριστικά επειδή είναι προσαρμοσμένο για ταχύτητα. Ωστόσο, μπορείτε να αντικαταστήσετε αυτό το shader για τους σκοπούς σας. Για παράδειγμα, μπορείτε να το αξιοποιήσετε για να επιθεωρήσετε την υπέρβαση ή να υποστηρίξετε περισσότερα χαρακτηριστικά για την απόδοση. Παρακάτω είναι ένα παράδειγμα του πώς να προμηθεύσετε το δικό σας προεπιλεγμένο Shader θραύσματος στο Phaser V2.
Λειτουργία προφόρτησης () {
αυτό. Flotok.Shader ('filename.frag', "Shaders / filename.frag");
}
Δημιουργία λειτουργίας () {
var renderer = αυτό.Renderer;
var batch = renderer.spritebatch;
batch.defaultshader =
Νέο pixi.abstractfitterFilter (this.cache.getshader ('filename.frag));
Batch.etcontext (renderer.gl);
}
Μια προσαρμοσμένη προεπιλεγμένη Shader μπορεί να χρησιμοποιηθεί για την αντικατάσταση των προεπιλεγμένων μεθόδων χρωματισμού στο Phaser και Pixijs. Το χρωματισμό σε Phaser και Pixijs λειτουργεί με πολλαπλασιασμό των εικονοστοιχείων υφής με ένα δεδομένο χρώμα. Ο πολλαπλασιασμός πάντα σκουραίνει τα χρώματα, τα οποία προφανώς δεν είναι πρόβλημα. Είναι απλά διαφορετικό από τη φλας. Για ένα από τα παιχνίδια μας χρειαζόμασταν να εφαρμόσουμε τη φλας παρόμοια με το Flash και αποφάσισαν ότι θα μπορούσε να χρησιμοποιηθεί ένας προεπιλεγμένος Shader Custom. Παρακάτω είναι ένα παράδειγμα μιας τέτοιας Shader θραύσματος:
// Ειδική παραλλαγή απόψεως, παρόμοια με τη φλας που προσθέτει
// στο χρώμα και δεν πολλαπλασιάζεται. Ένα αρνητικό χρώματος
// πρέπει να παρέχεται για αυτό το Shader να λειτουργεί σωστά, δηλ.
// sprite.Tint σε 0 για να μετατρέψετε ολόκληρο το Sprite σε λευκό.
Ακρίβεια Lowp Float.
διαφορετικό vec2 vtexturecoord;
διαφορετικό Vec4 VCOLOR.
Ομοιόμορφη Sampler2D Usampler.
κενό κύριο (κενό) {
vec4 f = texture2d (Usampler, vtexturecoord);
float a = σφιγκτήρα (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 * vcoror.a;
}
Αυτός ο Shader φωτίζει τα εικονοστοιχεία προσθέτοντας ένα χρώμα βάσης στην απόχρωση ενός. Για να λειτουργήσει αυτό, πρέπει να προμηθεύεστε αρνητικά του χρώματος που θέλετε. Επομένως, για να πάρετε λευκό, θα πρέπει να ορίσετε:
Sprite.Tint = 0x000000; // αυτά τα χρώματα το sprite σε λευκό
Sprite.Tint = 0x00ffff; // αυτό δίνει κόκκινο
Η αντικατάσταση ενός προεπιλεγμένου Shader μπορεί επίσης να αξιοποιηθεί για να βοηθήσει με το σφάλμα. Παρακάτω έχουμε εξηγήσει πόσο overdraw μπορεί να ανιχνευθεί με ένα τέτοιο shader.
Το υπερβολικό άλογο συμβαίνει όταν πολλά ή όλα τα εικονοστοιχεία στην οθόνη καθίστανται πολλές φορές. Για παράδειγμα, πολλά αντικείμενα που λαμβάνουν το ίδιο μέρος και καθίστανται ένα πάνω από το άλλο. Πόσα εικονοστοιχεία μπορεί να κάνει μια GPU ανά δευτερόλεπτο περιγράφεται ως ποσοστό πλήρωσης. Οι σύγχρονοι gpus της επιφάνειας εργασίας έχουν υπερβολικό ποσοστό πλήρωσης για συνήθη 2D σκοπούς, αλλά οι κινητές είναι πολύ πιο αργές.
Υπάρχει μια απλή μέθοδος να ανακαλύψετε πόσες φορές κάθε εικονοστοιχείο στην οθόνη είναι γραμμένο αντικαθιστώντας το προεπιλεγμένο παγκόσμιο Shader Shaper σε Pixijs και Phaser με αυτό:
Άδειο κύριο (κενό) {
gl_fragcolor.rgb + = 1,0 / 7.0;
}
Αυτό το shader φωτίζει τα εικονοστοιχεία που υποβάλλονται σε επεξεργασία. Ο αριθμός 7.0 υποδεικνύει πόσα γράμματα χρειάζονται για να ενεργοποιηθούν τα εικονοστοιχεία λευκά. Μπορείτε να συντονίσετε αυτόν τον αριθμό σύμφωνα με τις προτιμήσεις σας. Με άλλα λόγια, τα ελαφρύτερα εικονοστοιχεία στην οθόνη γράφτηκαν αρκετές φορές και τα λευκά εικονοστοιχεία γράφτηκαν τουλάχιστον επτά φορές.
Αυτός ο Shader βοηθά επίσης να βρει τόσο τα «αόρατα» αντικείμενα που για κάποιο λόγο εξακολουθούν να αποδίδονται και οι Sprites που έχουν υπερβολικές διαφανείς περιοχές γύρω από αυτές που πρέπει να αφαιρεθούν (GPU εξακολουθεί να χρειάζεται να επεξεργάζεται διαφανή εικονοστοιχεία στις υφές σας).
Ένας κινητήρας φυσικής είναι ένα μεσαίο λογισμικό που είναι υπεύθυνο για την προσομοίωση των σωμάτων φυσικής (συνήθως άκαμπτης δυναμικής σώματος) και τις συγκρούσεις τους. Οι κινητήρες φυσικής προσομοιώνουν 2D ή 3D χώρους, αλλά όχι και τα δύο. Ένας τυπικός κινητήρας φυσικής θα παράσχει:
Υπάρχει ένα plugin phaser που λειτουργεί καλά για το σκοπό αυτό. Το Box2D χρησιμοποιείται επίσης στον κινητήρα παιχνιδιού ενότητας και το στούντιο του παιχνιδιού 2.
Ενώ ένας κινητήρας φυσικής θα επιταχύνει την ανάπτυξή σας, υπάρχει μια τιμή που θα πρέπει να πληρώσετε: μειωμένη απόδοση χρόνου εκτέλεσης. Η ανίχνευση συγκρούσεων και υπολογισμού των απαντήσεων είναι ένα έργο έντασης της CPU. Μπορεί να περιορίζεται σε πολλά δώδεκα δυναμικά αντικείμενα σε μια σκηνή σε κινητά τηλέφωνα ή σε υποβαθμισμένη προσώπου, καθώς και μειωμένο ρυθμό καρέ βάσει βαθαίνει κάτω από 60 fps.
Εάν έχετε ένα flash παιχνίδι ήχου μέσα σε ένα αρχείο .fla, τότε η εξαγωγή τους από GUI δεν είναι δυνατή (τουλάχιστον όχι στο Adobe Animate CC 2017) λόγω της έλλειψης επιλογών μενού που εξυπηρετεί το σκοπό αυτό. Αλλά υπάρχει μια άλλη λύση - ένα ειδικό σενάριο που κάνει ακριβώς αυτό:
Λειτουργία κανονικοποιήστε το όνομα (όνομα) {
// μετατρέπει ένα όνομα καμήλα στο όνομα Snake_Case
Επιστρέψτε το όνομα.Replace (/ ([a-z]) / g, '_ $ 1'). Αντικαταστήστε (/ ^ _ /, '') .Tlowercase ();
}
Λειτουργία προβολής (διαδρομή) {
// κάνει τη διαδρομή αρχείου πιο αναγνώσιμη
επιστροφή UNESCAPE (PATH) .RePlace ('αρχείο: ///', ''). ('|', ',': ');
}
fl.outputpanel.clear ();
Εάν (FL.GETDOCOGEDDOM (). Βιβλιοθήκη.GetEslectedItems (). Μήκος & GT; 0)
// Λάβετε μόνο επιλεγμένα στοιχεία
VAR Library = fl.getdocumentdom (). Βιβλιοθήκη.getEslectedItems ();
αλλού
// Πάρτε όλα τα στοιχεία
VAR Library = fl.getdocumentdom (). Βιβλιοθήκη.Items;
// Ζητήστε από τον χρήστη για τον Κατάλογο Προορισμού Εξαγωγών
var root = fl.browseforfolderurl ('Επιλέξτε ένα φάκελο.');
var σφάλματα = 0;
για (var i = 0, i & lt; library.length; i ++) {
var στοιχείο = βιβλιοθήκη [i];
εάν (item.itemtype! == 'ήχος')
να συνεχίσει;
VAR PATH = root + '/';
εάν (στοιχείο.Originalcompresstype === 'RAW')
Διαδρομή + = κανονικοποίησηFilename (item.Name.Split ('') ) + '.WAV';
αλλού
Διαδρομή + = κανονικοποίησηFilename (item.Name);
var επιτυχία = στοιχείο.exporttofile (διαδρομή);
Αν (επιτυχία)
σφάλματα + 1;
FL.TRACE (DISPLAYPATH (διαδρομή) + ':' + (επιτυχία; 'OK': 'Σφάλμα'));
}
FL.TRACE (σφάλματα + "Σφάλμα (-οί)");
Πώς να χρησιμοποιήσετε το σενάριο για την εξαγωγή αρχείων ήχου:
Εγινε! Θα πρέπει τώρα να έχετε αρχεία WAV στον καθορισμένο κατάλογο. Αυτό που έχει απομείνει να τους μετατρέψει, για παράδειγμα, MP3, OGG ή AAC. (Εάν έχετε αρχεία παιχνιδιών για να διατηρήσετε ασφαλή, αναβάθμιση σε αξιοπρεπή αποθήκευση σύννεφων .).
Η καλή παλιά μορφή MP3 είναι πίσω, καθώς ορισμένα διπλώματα ευρεσιτεχνίας έχουν λήξει και τώρα κάθε πρόγραμμα περιήγησης μπορεί να αποκωδικοποιήσει και να παίξει mp3s. Αυτό κάνει την ανάπτυξη λίγο πιο εύκολη, δεδομένου ότι τελικά δεν υπάρχει ανάγκη να προετοιμάσετε δύο ξεχωριστές μορφές ήχου. Προηγουμένως χρειάζεστε, για παράδειγμα, αρχεία OGG και AAC, ενώ τώρα το MP3 θα αρκεί.
Παρ 'όλα αυτά, υπάρχουν δύο σημαντικά πράγματα που πρέπει να θυμάστε για το MP3:
Αυτό το άρθρο δημοσιεύθηκε αρχικά σε εξέταση 277 του δημιουργικού σχεδιασμού Web Magazine Web Design. Αγοράστε τεύχος 277 εδώ ή Εγγραφείτε στο Web Designer εδώ .
Σχετικά Άρθρα:
Το Pentagram δημιούργησε ένα bespoke typeface για το δημόσιο θέατρο (Πιστωτική ..
Πάρτε σε εξωτερικούς χώρους για να δημιουργήσετε μεγάλη τέχνη (Credit..
Αυτή η εικόνα του μεγάλου ανατολικού ατμόπλοιου του Brunel από το 1858 βρίσ�..
Σε αυτό το σύντομο Tutorial Illustrator , σχεδιαστής Θα είναι ο Paterson ..
Οι τεχνικές ψηφιακής ζωγραφικής καθιστούν δυνατή την απεικόνιση των α..
Όταν εργάζεστε με ύφασμα και υφάσματα σε 3D, μπορεί να είναι δύσκολο να �..
Συνήθως, όταν κάποιος αναφέρει την αύξηση της πραγματικότητας ή της ει..
Η Adobe ξεκινά μια νέα σειρά εκπαιδευτικών βίντεο που ονομάζεται σήμερα να το κάνει τώρα, το οποίο στοχεύει..