Το παρών άρθρο το είχα γράψει πριν 3 χρόνια (το blog δεν υφίσταται πλέον) όταν κυκλοφόρησε το πρώτο FirefoxOS device. Δυστυχώς σήμερα, γνωρίζουμε ότι αποτελεί πλέον ένα dead project, καθώς δεν περπάτησε τόσο όσο θα ήθελε η Mozilla. Πιστεύω ότι αξίζει να το διαβάσει κανείς, καθώς θα κόψει γρήγορα τα φτερά σε όσους πιστεύουν στο ότι το game development είναι εύκολη υπόθεση.
Στις μέρες μας υπάρχουν αρκετοί τρόποι για να φτιάξει κανείς το δικό του παιχνίδι. Αν λάβουμε υπόψη μας το impact που έχουν πλέον τα smartphones στην καθημερινή μας ζωή, θα διαπιστώσουμε πως το mobile gaming είναι ένα σημαντικό – ίσως και αναπόσπαστο -- κομμάτι της ζωής μας. Στις περισσότερες περιπτώσεις, ο χρήστης καλείται να βρει λύση σ' ένα πρόβλημα physics, όπως για παράδειγμα είναι το κλασσικό collision detection. Δεν θέλω να κάνω προβλέψεις, αλλά η προσήλωση στο gameplay και όχι (τόσο) στα γραφικά, σημαίνει ένα πράγμα: την επιστροφή των retro-games στην μόδα! Ω ναι, ίσως η νοσταλγία όλων όσων μεγάλωσαν με pacman, tetris και super mario να έρχεται τώρα ξανά στο προσκήνιο μέσα από την τσέπη μας.
Από την άλλη πλευρά, κάποιος άλλος θα μπορούσε να πει ότι τα retro-games είναι στην μόδα για τον λόγο ότι το hardware των smartphones δεν μπορεί να δώσει (render) παραπάνω γραφικά. Όπως και να χει, μ'αυτά και μ'αυτά φτάσαμε σήμερα να ασχολούνται όλοι (ξανά) με έναν ήρωα που το μόνο που κάνει είναι να πηδάει από πλατφόρμα σε πλατφόρμα (εξού και ο όρος platform games). Μην με παρεξηγήσετε δεν το λέω αρνητικά, άλλωστε είμαι και εγώ ένας από αυτούς.
Φτιάξε παιχνίδια για FirefoxOS, εύκολα και γρήγορα: Stencyl
Ο σοφός λαός λέει, όπου υπάρχει καπνός υπάρχει και φωτιά. Το ίδιο ισχύει και στην περίπτωσή μας όπου ακούγονται και γράφονται διάφορα για την νέα niche των mobile games. Μάλιστα, λέγεται ότι δεν χρειάζεται να είσαι καν προγραμματιστής για να κάνεις το παιχνίδι των ονείρων σου πραγματικότητα...
Εδώ είναι το σημείο που όλοι ενθουσιάζονται και θέλουν να φτιάξουν το δικό τους παιχνίδι μέσα σε μια μέρα:"Oh yeah, θα φτιάξω το επόμενο Angry Birds και θα γίνω εκατομμυριούχος! Άλλωστε, είναι σε HTML5, άρα σχετικά εύκολο!"
Η Mozilla με το FirefoxOS πατάει πάνω στο γεγονός ότι πλέον γράφοντας HTML είναι εύκολο για τον καθένα (που κατέχει βασικές γνώσεις) να γράψει μία εφαρμογή – True. Επίσης ισχυρίζεται ότι θα παίζει παντού (αρκεί να τρέχει ο Firefox) – True. Ισχυρίζεται ακόμα πως μπορείς να γράψεις παιχνίδια σε HTML5 εύκολα και γρήγορα -- false και true. Πάμε να το αναλύσουμε λίγο...
FirefoxOS 2D Games, Stencyl και άλλα
Το να φτιάχνουμε παιχνίδια με WebGL και OpenGLES είναι κάτι το οποίο το γνωρίζουμε εδώ και 2 χρόνια. Η καινοτομία που έφερε η Mozilla στην ουσία, είναι το πάντρεμα των smartphones με αυτήν την τεχνολογία. Οπότε, αν το παιχνίδι που θες να φτιάξεις είναι απλό, πολύ απλό, τόσο απλό που μπορείς να το φτιάξεις με Stencyl, τότε προφανώς μπορείς να το γράψεις απευθείας σε Javascript και να επωφεληθείς μαθαίνοντας πολλά πράγματα στην πορεία (hard way, αλλά ίσως αυτό θα επέλεγα στην τελική), γλυτώντας junk code.
Το Stencil όπως και μερικές άλλες παρόμοιες πλατφόρμες (aka frameworks) είναι ιδανικά εργαλεία για να κάνεις τα πρώτα σου βήματα στο mobile gamedev. Στην συνέχεια, αν θέλεις να έχεις περισσότερες δυνατότητες και να βελτιώσεις το παιχνίδι σου, θα πρέπει να κάνεις ένα βήμα παραπέρα και να μάθεις προγραμματισμό. Θαύματα τύπου Angry Birds, δύσκολα επαναλαμβάνονται, ωστόσο αξίζει να προσπαθήσει κανείς. Αν λοιπόν σε ενδιαφέρει να πάρεις μία πρώτη γεύση φτιάχνοντας το παιχνίδι των ονείρων με τον λιγότερο δυνατό κόπο/χρόνο, τότε ρίξε μια ματιά στα εξής links:
- Πώς να φτιάξετε παιχνίδια χωρίς προγραμματισμό
- Περισσότεροι τρόποι για να φτιάξετε παιχνίδια χωρίς προγραμματισμό
Οπότε, αν στοχεύεις χαμηλά (όπως όλοι μας, και έτσι πρέπει στην αρχή), μπορείς να φτιάξεις πολύ απλά 2D παιχνίδια τύπου retro-games χρησιμοποιώντας εξαρχής HTML5, CSS και Javascript. Η πραγματική επανάσταση όμως κρύβεται κάπου αλλού...
FirefoxOS 3D Gaming σε HTML5. Είναι εφικτό;
Στην αρχή του άρθρου σας μίλησα για την φρενίτιδα που επικρατεί σήμερα με την επιστροφή του retro-gaming. Τι θα λέγατε λοιπόν, αν σας έλεγα πως πλέον θα μπορείτε να παίζετε AAA παιχνίδια στο smartphone σας, όπως Crysis, Call of Duty, Elder Scrolls κ.α ; Ίσως να με κοροϊδεύατε, αλλά στέκομαι εδώ μπροστά σας και το φωνάζω δυνατά: η τεχνολογία υπάρχει! Οι άνθρωποι να την εκμεταλλευτούν απουσιάζουν!
Αυτό το πρόβλημα καλείται να λύσει η Mozilla με το FirefoxOS, κάνοντας ένα κάλεσμα στους επαγγελματίες gamedevs να εκμεταλλευτούν τα resources που τους δίνει. Τι πετυχαίνει κανείς; 3D First Person Shooter games σαν το
Απάντηση: Λάθος, δεν αρκεί μόνο η Javascript.
Αυτό είναι το false advertising κομμάτι που σας έλεγα νωρίτερα στα true/false της Mozilla. Τα παιχνίδια αυτά, δεν γράφτηκαν ευθύς εξαρχής σε HTML5 (Javascript)... αλλά έγιναν ported σ'αυτή. Πώς τα έφτιαξαν λοιπόν; Όπως φτιάχνεται κάθε άλλο παιχνίδι στις μέρες μας το οποίο δεν προορίζεται για το web. Ο κώδικας γράφτηκε σε C++, βασισμένος πάνω στην εκάστωτε μηχανή γραφικών και στην συνέχεια έγινε το port σε Javascript μέσω του Emscripten (ένα project του MIT που υιοθέτησε η Mozilla ώστε να κάνει ακριβώς αυτό το πράγμα: port) --δείτε τον επίσημο οδηγό για porting από C++ σε Javascript. Για την ακρίβεια, η δουλειά του Emscripten είναι να παίρνει ως είσοδο LLVM κώδικα (χρησιμοποιώντας το Clang) και στην συνέχεια να σου επιστρέφει στην έξοδο Javascript/HTML. Με την είσοδο του BananaBread στον χορό των game engines, έχουμε στην ουσία μία engine που κάνει port την Cube2 engine στο web. Πώς το πετυχαίνει αυτό; Κάνει compile την C++ και το OpenGL σε Javascript και WebGL με την βοήθεια του Emscripten. Αυτή την τεχνολογία σου δίνει η Mozilla, και περιμένει από εσένα να την εκμεταλλευθείς.
Αλήθεια όμως... γιατί μπήκαμε σ'όλη αυτή διαδικασία να κάνουμε port και τόση φασαρία ενώ θα μπορούσαμε να γράψουμε απευθείας τον κώδικα σε Javascript εξαρχής; Η απάντηση είναι γιατί θα ήταν πιο δύσκολο και ίσως ακατόρθωτο για την ώρα. Ας ορίσω όμως το "δύσκολο": Το 3D game development είναι αρκετά περίπλοκη διαδικασία και έχει οριμάσει αρκετά τα τελευταία χρόνια βασιζόμενο σε εργαλεία και μηχανές γραφικών σε C++. Θα ήταν αδύνατο να ξεκινήσει κανείς να γράφει απευθείας σε Javascript, όχι γιατί δεν είναι εφικτό, αλλά γιατί αυτό που δείχνει η τάση στο web αυτή τη στιγμή είναι πως δίνουν πρωτεραιότητα για porting των ήδη existing games, παρά για την συγγραφή καινούριων, εκτός βέβαια και αν μιλάμε για ένα πολύ πολύ απλό 2D retro-game τύπου Facebook.
Δείτε ένα quote ενός από τους Top 20 Programmers του GameDev.net:
Hell, the most advanced ( and difficult ) code I’ve ever written was in Javascript! Now the biggest difference with game developing… math, yeah, you are going to have to learn math.
Τελικά να μάθω Javascript ;
- Databases: Μπορείς να χρησιμοποιήσεις IndexedDB API, το οποίο σου επιτρέπει να αποθηκεύσεις μία βάση δεδομένων στον client (ανάλογα με το policy restriction που έχεις ρυθμίσει στον browser σου) και να κάνεις index όσα items θες χωρίς να αγχώνεσαι για επιδόσεις, επειδή ο χρήστης θα την τρέχει ουσιαστικά τοπικά.
- User accounts: Το smartphone προβλέπεται για single user, σωστά; Αν κάποιον x,y,z λόγο θέλεις να βάλεις multiple users στο παιχνίδι όπου θα έχουν το δικό τους savegame κλπ πάλι μπορεί να γίνει locally. Αν μιλάμε για online πρόσβαση σ'αυτό με οποιοδήποτε μέσω (PC, Desktop, Laptop, Smartphone) τότε μπορεί να γίνει πάλι το ίδιο στην μεριά του server (πχ WebRTC).
- User I/O: Αν υποθέσουμε ότι έχουμε να κάνουμε με generic content, δηλαδή το παιχνίδι δεν διαφέρει και πολύ από μία απλή web app και έτσι όλα θα φορτώνουν τοπικά στην μνήμη της συσκευής για offline χρήση. Οι τρόποι που έχεις είναι πάνω-κάτω οι εξής:
- Να αγνοήσεις το I/O και να χρησιμοποιήσεις μία εικόνα. Αυτός είναι ο πιο τεμπέλικος τρόπος κατά τον οποίο τα δεδομένα θα φορτώνονται offline. Δεν είναι καλή ιδέα όμως, γιατί πηγή κακού και bugs, καθώς μπορεί κάλλιστα να ξεκινήσει το παιχνίδι να παίζει χωρίς να έχουν φορτωθεί όλες οι εικόνες, γεγονός που προκαλεί μία σύγχυση στον παίκτη (πχ αρχίζει και τρώει damage από τον εχθρό, τον οποίο δεν βλέπει).
- Για να είσαι σίγουρος ότι οι εικόνες θα φορτωθούν σίγουρα πριν ξεκινήσει το παιχνίδι, κάνε preload σαν να έχεις μία τυπική web app (δημιούργησε ένα image object και όρισε την .src ιδιότητα αυτού ή εναλλακτικά μπορείς να χρησιμοποιείς events που θα ελέγχουν αν ολοκληρώθηκε το loading του υλικού του παιχνιδιού πριν ξεκινήσει το παιχνίδι (όπως ακριβώς είναι η loading bar).
- Χρησιμοποιώντας την μέθοδο binary data using JavaScript typed arrays μέσω XMLHttpRequest.
Αν είστε Javascript game developer, τα παραπάνω είναι πολύ πιθανό να σας είναι γνωστά. Αν όμως είστε C++ Game Developer ή Unity3D με C#, όπως δηλαδή είναι οι περισσότεροι gamedevs σήμερα, τότε το να γράψετε from scratch ένα παιχνίδι φαντάζει σχεδόν αδύνατο (αντιπαραγωγικό) για εσάς.
Όπως και να χει, από την στιγμή που θέλετε να γράφετε 3D παιχνίδι αποκλειστικά για web με FirefoxOS τότε καλό θα ήταν να ξέρετε την Javascript σαν το πίσω μέρος του κεφαλιού σας, άσχετα αν το emscripten θα αναλάβει να κάνει το port από C++ σε HTML5 και optimization μέσω asm.js
Δεν θέλω να φτιάξω καινούριο παιχνίδι! Έχω ήδη φτιάξει ένα
Αν έχετε ήδη υλοποιήσει ένα παιχνίδι σε άλλη γλώσσα πέρα από HTML(Javascript), πώς θα το μεταφέρετε στο FirefoxOS; Θα το ξαναγράψετε από την αρχή; Αμφιβάλλω... μερικά παιχνίδια διαρκούν 3-5 χρόνια στο στάδιο στις ανάπτυξης. Φαντάζεστε λοιπόν πώς θα σας κοιτούσαν αν τους λέγατε να ξαναγράψουν τον κώδικα from scratch σε Javascript :p
Η απάντηση εδώ είναι ότι θα πρέπει να βρείτε τρόπους να κάνετε port το παιχνίδι σας με το μικρότερο δυνατό κόστος χρόνου, bugs και το κυριότερο: να μην χαθεί το hardware optimization.
Μου αρέσει ο προγραμματισμός με γραφικά, αλλά δεν με ενδιαφέρουν τα παιχνίδια
Οπότε, αν είσαι προγραμματιστής και θέλεις να ασχοληθείς με το game development του FirefoxOS, δεν είναι αναγκαίο να φτιάξεις ντε και καλά κάποιο παιχνίδι, αλλά θα μπορούσες για παράδειγμα να αναπτύξεις κάποια αντίστοιχα εργαλεία σαν το Emscripten και μεθόδους porting των ήδη existing games σε Javascript και webgl. Για παράδειγμα μπορείς να φτιάξεις ένα εργαλείο που να παίρνει τον κώδικα της Unity3D, και να κάνει compile με το Emscripten σε webgl. Ίσως και να υπάρχει κάτι τέτοιο (όντως υπάρχει), αλλά αυτό δεν σημαίνει ότι πρέπει να το βάλετε κάτω. Βρισκόμαστε στον κόσμο του Open Source, όπου υπάρχουν πολλά άγνωστα projects που μπορεί να σε βοηθήσουν να φτιάξεις κάτι μεγάλο. Για παράδειγμα, μπορείς να κάνεις ένα integration στοXamarin και Monogame ή το Mutiny (είναι re-implementation της Unity3D σε C++). Αν είσαι σκληροπυρηνικός λινουξάς και αναπτύσσεις παιχνίδια σε Enigma, τότε δες μήπως εκεί μπορείς να κάνεις κάτι αντίστοιχο, ώστε να φέρεις τα παιχνίδια από το Linux Desktop στο Internet. Γενικά υπάρχουν πολλές εναλλακτικές και το όλο θέμα χρειάζεται πολύ ψάξιμο. Είναι κάτι που γεννιέται τώρα, γι αυτό θα υπάρξουν πολλές ευκαιρίες. Οι ικανοί θα τις αρπάξουν, και οι υπόλοιποι θα τους ακολουθήσουν. Για αυτό αν θέλετε να ασχοληθείτε σοβαρά με τα παιχνίδια και το FirefoxOS, κάντε μια χάρη στον εαυτό σας και μάθετε προγραμματισμό (όχι δεν εννοώ τα απλά πράγματα else-if και τα for-loops. Μιλάω για προχωρημένα πράγματα όπως STL, OpenGL, SFML, SDL... δύσκολα πράγματα για τον αρχάριο προγραμματιστή).
Σε κάθε περίπτωση, αξίζει να προσπαθήσετε. Απλά μην νομίζετε ότι θα είναι εύκολο ή γρήγορο. Το indie game development δεν είναι για τους αδύναμους προγραμματιστές. Απλά τώρα είναι η ευκαιρία να δείξουν αυτοί που ξέρουν 2-3 πράγματα παραπάνω από τον average Joe, να κάνουν την διαφορά και να μπουν στο hall of fame. Σκεφτείτε ότι δεν έχουν περάσει καλά-καλά 6 μήνες από το port του Steam στο Linux και ήδη άρχισαν δυνατά project να ψάχνουν επενδυτές μέσω Kickstarter, όπως το Leadwerks.