Το προφίλ μας στο Google Plus
3

Η κινούμενη σφαίρα

Στο προηγούμενο τεύχος μιλήσαμε για τα indie games και κάναμε μια εισαγωγή στον κόσμο της Unity. Από αυτό το τεύχος ξεκινάμε με τη δημιουργία ενός παιχνιδιού — του δικού μας παιχνιδιού! Υποσχόμαστε ότι οι παρουσιάσεις μας θα αφορούν σε πολύ πιο πρακτικά θέματα, αραιά και πού ωστόσο θα κάνουμε μικρές παρενθέσεις εξηγώντας καλύτερα έννοιες που δεν θα έχουν αναλυθεί επαρκώς.

Δεν έχουμε βρει ακόμα κάποιο όνομα για το παιχνίδι μας και θα θέλαμε τις δικές σας προτάσεις. Αφήστε ένα σχόλιο στο site του περιοδικού με τ’ όνομα που προτείνετε και ίσως γίνετε ο Godfather (TM) του παιχνιδιού! Κατά τα άλλα, έχουμε ήδη κατεβάσει την τελευταία έκδοση της μηχανής Unity (v5.3.4f1, τη στιγμή που γράφεται το παρόν) από τη διεύθυνση http://unity3d.com/get-unity/download?ref=personal και είμαστε έτοιμοι να ξεκινήσουμε. Εσείς;

Game Design Document τριών παραγράφων
Πριν περάσουμε στη Unity ας δούμε εν συντομία τι θα φτιάξουμε. Σκοπός του παίκτη σ’ αυτό το πρώτο μας project, λοιπόν, θα είναι να περάσει από το ένα μέρος της πίστας στο άλλο χωρίς να χτυπήσει στα εμπόδια που βρίσκονται στην πορεία του.

Εικόνα 1. Ένα γρήγορο προσχέδιο του παιχνιδιού, για να πάρετε μια γεύση του πώς πάνω κάτω θα φαίνεται το τελικό προϊόν. Δεν γίνεται να βαδίζουμε στα τυφλά. Γίνεται;

Εικόνα 1. Ένα γρήγορο προσχέδιο του παιχνιδιού, για να πάρετε μια γεύση του πώς πάνω κάτω θα φαίνεται το τελικό προϊόν. Δεν γίνεται να βαδίζουμε στα τυφλά. Γίνεται;

Ας δώσουμε λίγη ζωή στην ακίνητη εικόνα, εξηγώντας περαιτέρω. Ο παίκτης (κίτρινη σφαίρα) θα πρέπει να περάσει ανάμεσα από τα κινούμενα μαύρα εμπόδια και να φτάσει στην άλλη άκρη της πίστας — συγκεκριμένα στην ασπρόμαυρη γραμμή του τερματισμού. Η κίνηση του παίκτη θα γίνεται με τα βελάκια του δρομέα ή με τα πλήκτρα [W], [A], [S] και [D]. Η κίνηση αριστερά–δεξιά θα είναι ελεύθερη, αλλά για την κίνηση μπρος–πίσω θα γίνεται ένα μικρό άλμα που θα παίρνει συγκεκριμένο χρονικό διάστημα. Τα εμπόδια θα εμφανίζονται τυχαία, ανάλογα σε ποια γραμμή βρίσκονται. Θα κινούνται αριστερά ή δεξιά με διαφορετικές ταχύτητες, αλλά θα έχουν ίδια ταχύτητα και πορεία ανά γραμμή. Στο ενδιάμεσο, και για να κάνουμε τη ζωή του παίκτη λίγο πιο εύκολη, θα έχουμε νεκρές ζώνες (οι άσπρες οριζόντιες λωρίδες), που δεν θα έχουν εμπόδια. Έτσι, ο παίκτης θα χαλαρώνει και θα προετοιμάζεται για το επόμενο γκρουπ εμποδίων.

Αν ο παίκτης ακουμπήσει σε ένα εμπόδιο χάνει και θα πρέπει να παίξει την πίστα από την αρχή. Για να αποφύγουμε τις σπασμένες οθόνες (μια και ragequit δεν υπάρχει), θα του δίνουμε τη δυνατότητα, αν το θελήσει, να παίξει την εύκολη εκδοχή του παιχνιδιού. Σ’ αυτή, όταν χάνει αντί να εμφανίζεται στην αρχή της πίστας θα εμφανίζεται στην προηγούμενη νεκρή ζώνη, με βάση την τρέχουσα θέση του.

Τώρα, επειδή παιχνίδι χωρίς κίνητρο δεν υφίσταται, θα μετράται ο χρόνος που έκανε ο παίκτης για να φτάσει από το ένα σημείο στο άλλο. Η εφαρμογή θα κρατάει τα τελικά αποτελέσματα σε ένα τοπικό (ίσως κι online) leaderboard, και θα τα εμφανίζει στο τέλος κάθε πίστας.

Ονομάζοντας τα projects
Ξεκινάμε τρέχοντας τη μηχανή Unity και δημιουργώντας ένα καινούργιο 3D project. Αποφασίζουμε πού θα το αποθηκεύσουμε και του δίνουμε ένα όνομα. Μα δεν έχουμε όνομα ακόμα, θα πείτε. Και θα σας πούμε ότι έχετε δίκαιο. Από τη στιγμή που δεν έχουμε όνομα και η Unity δεν μπορεί να κάνει χωρίς ένα όνομα για το project μας, μπορούμε να βάλουμε ό,τι θέλουμε. Αλλά, είναι σωστό αυτό; Ας δούμε τι γίνεται σε περίπτωση που δεν έχουμε όνομα για το project. Αν λοιπόν μας έχει πιάσει ο οίστρος γι’ αυτήν την ωραία ιδέα gameplay που σκεφτήκαμε δευτερόλεπτα πριν, θα ήταν κακό να ξοδέψουμε χρόνο σκεπτόμενοι κάποιο όνομα για το μελλοντικό παιχνίδι που θα βασίζεται στην ιδέα. Πρέπει να μπούμε στο πετσί της διαδικασίας, δηλαδή να ξεκινήσουμε με την υλοποίηση των λειτουργιών του gameplay, άμεσα!

Στη βιομηχανία των παιχνιδιών και όχι μόνο, υπάρχουν τα λεγόμενα working titles. Ως working title χαρακτηρίζεται ο τίτλος ενός παιχνιδιού που χρησιμοποιείται κατά τη δημιουργία του — όχι κατ’ ανάγκη και μετά. Υπάρχουν δύο λόγοι για την ύπαρξη των εν λόγω τίτλων. Ο πρώτος λόγος είναι, απλά, ότι δεν έχει ακόμα οριστικοποιηθεί ο τελικός τίτλος του εν λόγω παιχνιδιού. Σε αυτή την περίπτωση, του αποδίδεται ένα όνομα με μόνο σκοπό να γίνεται αναφορά σ’ αυτό. Ο δεύτερος λόγος είναι λίγο πιο συνωμοτικός. Ενδέχεται κάποιο παιχνίδι να έχει ήδη τίτλο, αλλά η εταιρεία να θέλει να κρύψει την αληθινή ταυτότητά του από το ευρύ κοινό. Το εμφανίζει έτσι με το working title του, προσπαθώντας ταυτόχρονα να δημιουργήσει hype. Ας ονομάσουμε το έργο μας Project Sphere, μια και τον παίκτη παριστάνει μια σφαίρα. (Σαφώς μπορείτε να ονομάσετε όπως θέλετε το project στον υπολογιστή σας. Απλά, στην παρούσα σειρά άρθρων θα χρησιμοποιούμε αυτό το όνομα.)

Εικόνα 2. Μπορεί να θυμάστε την παραπάνω εικόνα δημιουργίας νέου project, από το προηγούμενο τεύχος. Βέβαια μπορεί και όχι. Αν ισχύει το δεύτερο, ίσως δεν έχετε διαβάσει τα δύο σχετικά άρθρα στο εν λόγω τεύχος. Σας πιάσαμε!

Εικόνα 2. Μπορεί να θυμάστε την παραπάνω εικόνα δημιουργίας νέου project, από το προηγούμενο τεύχος. Βέβαια μπορεί και όχι. Αν ισχύει το δεύτερο, ίσως δεν έχετε διαβάσει τα δύο σχετικά άρθρα στο εν λόγω τεύχος. Σας πιάσαμε!

Source control, all the way
Προτού ξεκινήσουμε χρειάζεται να κάνουμε κάποιες ρυθμίσεις στη Unity, ώστε να μην υπάρχουν προβλήματα. Όπως αναφέραμε και σε προηγούμενο άρθρο της σειράς, θα χρησιμοποιήσουμε το Git και κατ’ επέκτασιν το GitHub για το hosting του έργου μας. Η Unity, για κάθε asset που υπάρχει σε κάθε project της, χρειάζεται να αποθηκεύει και κάποια έξτρα δεδομένα για δική της χρήση. Τα δεδομένα αυτά αποθηκεύονται σε αρχεία τύπου meta. Όταν στη δημιουργία του παιχνιδιού εμπλέκονται περισσότερα από ένα άτομα, τα αρχεία αυτά πρέπει να έχουν ίδια δεδομένα σε κάθε μηχάνημα. Μια που εξ αρχής τα meta files των assets δεν είναι προσβάσιμα από τους χρήστες, πρέπει να πούμε στη Unity να μας τα δείξει.

Αυτό γίνεται από το μενού Edit –> Project Settings –> Editor. Στον Inspector της Unity θα δούμε μια σειρά από επιλογές όπως φαίνονται στο σχετικό screenshot.

Εικόνα 3. Όλα τα settings που μπορούμε να αλλάξουμε στη Unity εμφανίζονται σε κατηγορίες κι εμφανίζονται στο παράθυρο του Inspector.

Εικόνα 3. Όλα τα settings που μπορούμε να αλλάξουμε στη Unity εμφανίζονται σε κατηγορίες κι εμφανίζονται στο παράθυρο του Inspector.

Στο παράθυρο αυτό, στο Version Control Mode επιλέγουμε Visible Meta Files. Από τη στιγμή που δεν έχουμε ακόμα assets στο project μας, η αλλαγή είναι στιγμιαία. Αν είχαμε, ανάλογα με το μέγεθος του project θα χρειαζόταν να περιμένουμε λίγη ώρα, ώστε η Unity να δημιουργήσει meta files για όλα τα assets που υπάρχουν στο project. Μέσα σ’ ένα project, meta files έχουν ακόμα και οι φάκελοι.

Αφού βρισκόμαστε στις ρυθμίσεις, ας δούμε και το asset serialization mode. Με την εν λόγω επιλογή μπορούμε να πούμε στη Unity αν θα αποθηκεύει τις σκηνές μας σε text ή σε binary mode. To binary mode καταλαμβάνει λιγότερο χώρο στο δίσκο, αλλά καθιστά αδύνατο το merge ενός αρχείου, αν αυτό έχει τροποποιηθεί από περισσότερα του ενός άτομα. Το text mode αντίθετα αποθηκεύει τα δεδομένα της σκηνής σε YAML. Αν και έτσι καταλαμβάνουν αρκετά περισσότερο χώρο στο δίσκο, καθίσταται δυνατή η εργασία σε μία σκηνή από πολλά άτομα, παράλληλα (το merge, αργότερα, είναι εφικτό). Η τρίτη επιλογή επιτρέπει και τους δύο τύπους αρχείων σκηνών για το ίδιο project. Στις άλλες δύο περιπτώσεις, αν η Unity αντιληφθεί ένα αρχείο σκηνής σε διαφορετικό mode, θα το μετατρέψει αυτόματα στο επιλεγμένο.

Let the games begin!
Τακτοποιήσαμε λοιπόν λίγες ακόμα από τις ιδιοτροπίες της Unity, οπότε είναι καιρός ν’ αρχίσουμε να δημιουργούμε το παιχνίδι μας. Αρχικά θα φτιάξουμε τη σκηνή που θα λαμβάνει χώρα το κύριο μέρος του παιχνιδιού (εκεί που θα κινείται ο παίκτης). Έχει αρκετά πράγματα προς υλοποίηση, συνεπώς αξίζει να τη χωρίσουμε σε μικρότερα κομμάτια. Ας αρχίζουμε από τον παίκτη — ή ακριβέστερα από τη σφαίρα που θα κινεί ο παίκτης.

Στο παράθυρο του νέου μας project η Unity παρουσιάζει μια κενή σκηνή. Για την ακρίβεια, δεν είναι 100% κενή: περιέχει μια κάμερα (Main Camera) αλλά και μια κατευθυντήρια πηγή φωτός (Directional Light). Πρόκειται βέβαια για την προκαθορισμένη σκηνή της Unity, οπότε κι εμείς καταχρηστικά την αναφέρουμε ως “κενή”.

Στο παράθυρο του Project και με δεξί κλικ στον φάκελο Assets, επιλέγουμε Create –> Folder και δημιουργούμε τέσσερις φακέλους με τα εξής ονόματα: Materials, Scenes, Scripts και Resources. Πιστεύουμε ότι τα ονόματα των φακέλων προϊδεάζουν για το τι μπορεί να περιέχει ο καθένας — εκτός ίσως από το όνομα του τελευταίου. Σε κάθε περίπτωση και για να είμαστε εντάξει, οφείλουμε να είμαστε αναλυτικοί.

Ο πρώτος φάκελος, λοιπόν, θα περιέχει όλα τα materials που θα χρησιμοποιούμε για να δώσουμε χρώμα στα αντικείμενα της σκηνής μας. Ο δεύτερος θα περιέχει όλες τις σκηνές που θα χρειαστεί το παιχνίδι μας, ενώ ο τρίτος τα C# scripts για τις λειτουργίες του παιχνιδιού. Ο τελευταίος φάκελος έχει ιδιαίτερη σημασία σε ένα project. Σε αυτόν μπορούμε να αποθηκεύουμε GameObjects που δεν βρίσκονται ήδη στη σκηνή και να δημιουργούμε instances τους μέσω scripts, κατά τη διάρκεια εκτέλεσης του παιχνιδιού.

Πίσω στη δημιουργία της πίστας όμως.

  • Πηγαίνουμε στο μενού GameObject –> 3D Object –> Plane ώστε να δημιουργήσουμε ένα plane που θα χρησιμοποιηθεί ως το δάπεδο της πίστας.
  • Στο παράθυρο Hierarchy το μετονομάζουμε σε “Floor” (με το [F2] αφού το επιλέξουμε ή με δεξί κλικ/Rename ή από τον Inspector — πάντα αφού το επιλέξουμε).
  • Στον Inspector αυξάνουμε το Scale του άξονα z στο 2 (Scale = (1, 1, 2)).
  • Αν δεν είναι ήδη έτσι, ως Position και Rotation θέτουμε μηδενικές τιμές. Αυτό μπορεί να γίνει είτε αλλάζοντας τις τιμές από τα πεδία του Inspector, είτε κάνοντας κλικ στο γρανάζι (βλ. πάνω δεξιά γωνία του Transform Component) κι επιλέγοντας Reset Position ή Reset Rotation αντίστοιχα.
  • Στον φάκελο Materials στο Project, δημιουργούμε ένα Material (δεξί κλικ στον φάκελο και Create –> Material) και τ’ ονομάζουμε “Floor”.
  • Με επιλεγμένο το material στον Inspector, κάνουμε κλικ στο άσπρο κουτάκι δεξιά του Albedo και του δίνουμε ένα σκούρο πράσινο χρώμα (#0A5D00FF).
  • Σέρνουμε το material που έχουμε μόλις δημιουργήσει από το παράθυρο του Project, είτε στο αντικείμενο που βλέπουμε στη σκηνή είτε στο όνομα του αντικειμένου στο παράθυρο Hierarchy. Αν σύρουμε το material στη σκηνή, θα δούμε ότι όταν το ποντίκι βρίσκεται πάνω από ένα αντικείμενο που μπορεί να το δεχτεί, η αλλαγή γίνεται επί τόπου. Μπορούμε να την επιβεβαιώσουμε αφήνοντας το ποντίκι μας.

Πλέον έχουμε ένα πράσινο έδαφος. Ας συνεχίσουμε με την σφαίρα που θα δείχνει τον παίκτη μας.

  • Δημιουργούμε μια σφαίρα από το μενού GameObject –> 3D Object –> Sphere, με όνομα “Player”.
  • Στον Inspector θέτουμε Position = (0, 0.5, -9.5) και Rotation = (0, 0, 0).
  • Με τη διαδικασία που αναφέραμε ήδη, και στον φάκελο Materials, δημιουργούμε ένα νέο material με όνομα “Player” καθώς κι ένα σκούρο κίτρινο χρώμα (#A69400FF).
  • Το σέρνουμε στη σφαίρα του παίκτη ώστε να το ορίσουμε ως material της. Αποθηκεύουμε τη σκηνή μας στον φάκελο Scenes και με όνομα Game.unity. Πάμε ολοταχώς να γράψουμε το πρώτο μας script.
  • Με δεξί κλικ στον φάκελο Scripts, επιλέγουμε Create –> C# Script και του δίνουμε τ’ όνομα “Player”.

Εικόνα 4. Η σκηνή μας, έτοιμη προς αποθήκευση!

Εικόνα 4. Η σκηνή μας, έτοιμη προς αποθήκευση!

Αρχικά, το Script αυτό θα είναι υπεύθυνο για την κίνηση του παίκτη. Με διπλό κλικ ανοίγουμε τον editor που έχουμε επιλέξει και προσθέτουμε τον παρακάτω κώδικα.

using UnityEngine;
namespace Deltahacker
{
	public class Player : MonoBehaviour
	{
		public float Speed = 3f;
		public void Update()
		{
			float horizontal = Input.GetAxis("Horizontal");
			Vector3 movement = new Vector3(horizontal * Speed * Time.deltaTime, 0, 0);
			transform.position += movement;
		}
	}
}

Στο σημείο αυτό επιτρέψτε μας μερικές διευκρινίσεις. Αρχικά, το namespace definition δεν είναι αναγκαίο. Όσοι δεν είστε εξοικειωμένοι με τη χρήση namespaces στον κώδικά σας, π.χ., διότι η γλώσσα που χρησιμοποιείτε δεν τα υποστηρίζει, μπορείτε να το παραλείψετε. Γενικά είναι πολύ καλή τακτική, για διάφορους λόγους. Η αιτιολόγηση ξεφεύγει από το σκοπό του παρόντος άρθρου, οπότε σταματάμε εδώ λέγοντας μόνο ότι θα βλέπετε namespaces σχεδόν πάντα στον κώδικά μας.

Η μέθοδος Update της κλάσης είναι η προκαθορισμένη της Unity και καλείται σε συγκεκριμένα σημεία από την ίδια τη μηχανή. Πιο συγκεκριμένα, εκτελείται σε κάθε frame λειτουργίας του παιχνιδιού. Θα μιλήσουμε εκτενέστερα για τα frames σε επόμενο άρθρο. Το Game Loop pattern είναι σήμα κατατεθέν των παιχνιδιών και δεν γίνεται να μην κάνουμε μια αναφορά σ’ αυτό.

Μέσα στη μέθοδο, στη μεταβλητή horizontal αποθηκεύουμε το Input του παίκτη. Βασιζόμενοι στο Input δημιουργούμε ένα νέο τρισδιάστατο διάνυσμα που ορίζει τη μετατόπιση της σφαίρας, την ορισμένη ταχύτητα και την ώρα που έχει περάσει από το προηγούμενο frame, ώστε να έχουμε σταθερή ταχύτητα χωρίς να μας ενδιαφέρει αν το παιχνίδι τρέχει με πολλά ή με λίγα frames.

User Input, κανείς;
Στο script αυτό επιλέγουμε να διαβάσουμε την είσοδο από τον παίκτη, μέσω του άξονα με όνομα Horizontal. Κάθε νέο project έχει προκαθορισμένους ένα σύνολο από άξονες, με τους οποίους μπορούμε να διαβάζουμε την είσοδο του παίκτη.

Τους εν λόγω άξονες μπορούμε να βλέπουμε από το μενού Edit –> Settings –> Input και, με expand στον Inspector, βλέπουμε και τη λίστα Axes. Αν κάνουμε κλικ στο entry ονόματι Horizontal, θα δούμε πώς ορίζεται αυτός ο άξονας.

Εικόνα 5. Οι προκαθορισμένοι άξονες εισόδου για το παιχνίδι μας, όπως τους έχει ορίσει η Unity.

Εικόνα 5. Οι προκαθορισμένοι άξονες εισόδου για το παιχνίδι μας, όπως τους έχει ορίσει η Unity.

Τα κυριότερα σημεία είναι τα Negative και Positive Buttons, καθώς και τα εναλλακτικά τους (Alt Negative Button και Alt Positive Button). Στη συγκεκριμένη περίπτωση βλέπουμε ότι ο άξονας αυτός παίρνει θετικές τιμές αν πατήσουμε το δεξί βελάκι του πληκτρολογίου ή το πλήκτρο [D], και αρνητικές τιμές με το αριστερό βελάκι ή με το πλήκτρο [A] αντίστοιχα. Αν παρατηρήσουμε τη λίστα, θα δούμε ότι υπάρχει ακόμα μια εγγραφή με το ίδιο όνομα. Η δεύτερη εγγραφή είναι για χρήστες που χρησιμοποιούν joystick. Το αποτέλεσμα του άξονα, σε περίπτωση που χρησιμοποιούμε τα κουμπιά, είναι οι διακριτές τιμές -1, 0 και 1. Σε περίπτωση που χρησιμοποιήσουμε joystick οι τιμές έχουν εύρος [-1, 1], ανάλογα με την κλίση ή τη θέση του χειριστηρίου. Ας επιστρέψουμε όμως στο project μας.

Move baby, move!
Μια και το script είναι έτοιμο, πρέπει να το προσθέσουμε στη σφαίρα μας. Αυτό γίνεται με δύο τρόπους. Ο πρώτος είναι να σύρουμε την εγγραφή του από το παράθυρο του project στη σφαίρα, στο παράθυρο Hierarchy (ή στη σκηνή κατευθείαν). Εναλλακτικά, επιλέγουμε το αντικείμενο από το παράθυρο Hierarchy και πατάμε το κουμπί Add Component στον Inspector. Αν το κάνουμε με τον δεύτερο τρόπο, μπορούμε είτε να ψάξουμε το όνομα του script από το search box που εμφανίζεται είτε να το βρούμε δίνοντας Scripts –> Deltahacker –> Player.

Πριν δούμε τον κώδικά μας εν δράσει, έχουμε μια ακόμα μικρή λεπτομέρεια να διευθετήσουμε. Πρέπει συγκεκριμένα να τοποθετήσουμε την κάμερα σε ένα καλό σημείο, ώστε να φαίνεται όλη η πίστα κι ο παίκτης να βρίσκεται στο κάτω μέρος της.

  • Γυρίστε το viewport της σκηνής σε μια καλή θέση (όπως, π.χ., φαίνεται στην εικόνα 3) κι επιλέξτε την κάμερα (Main Camera) από το Hierarchy.
  • Για να κάνουμε την κάμερα να δείχνει το σημείο που βλέπουμε μέσω του viewport της σκηνής μας, πρέπει να πάμε στο μενού GameObject –> Align With View ή να πατήσουμε το συνδυασμό πλήκτρων [CTRL+SHIFT+F].

Προσοχή στην επιλογή του αντικειμένου της κάμερας! Αν δεν το επιλέξετε μπορεί να αλλάξετε τη θέση και την περιστροφή κάποιου άλλου αντικειμένου. Αν γίνει αυτό, ένα [CTRL+Z] θα λύσει το πρόβλημα.

Αφού η κάμερα έχει μετακινηθεί, αποθηκεύουμε τη σκηνή μας και τρέχουμε το παιχνίδι πατώντας [CTRL+P] ή επιλέγοντας Edit –> Play ή με κλικ στο κουμπί Play, στο κέντρο του πάνω μέρους του παραθύρου της Unity. Εν ώρα εκτέλεσης, αν πατήσουμε τα [A], [D] ή το δεξί/αριστερό βελάκι, θα δούμε τη σφαίρα να κινείται αριστερά-δεξιά.

Ως άσκηση, σας προτρέπουμε να μετακινήσετε τη σφαίρα στο κέντρο του πράσινου δαπέδου και να προσπαθήσετε να την κάνετε να κινείται και πάνω-κάτω. Ενδεικτικά, αναφέρουμε ότι πρέπει να πάρετε την είσοδο του παίκτη από τον κάθετο άξονα και να προσθέσετε το αποτέλεσμα στο διάνυσμα της κίνησης. Ο κώδικας της λύσης θα ανεβεί ως σχόλιο του άρθρου, στο site του περιοδικού. Τον κώδικα του project θα τον βρείτε στο GitHub και στη διεύθυνση https://github.com/ikromm/project-sphere.

Την επόμενη φορά θα μιλήσουμε για το Game Loop και στη συνέχεια θα κάνουμε τη σφαίρα να πηδάει μπρος και πίσω, ώστε να μπορεί ν’ αλλάζει λωρίδες στο τελικό μας game.

3 Responses to “Η κινούμενη σφαίρα”

  1. bshark | 08/04/2016 at 13:11

    https://www.dropbox.com/s/gx34dzr708l5qfm/Assets.rar?dl=0

    Ωραία παρουσίαση Χρήστο, τσέκαρε και κάτι που είχα φτιάξει στα πλαίσια μιας εργασίας και για πλάκα βέβαια. δεν είναι τίποτα το σοβαρό αλλά έχει πλάκα :)

    • subZraw | 08/04/2016 at 18:58

      Ευχαριστούμε για το feedback και τον καλό λόγο, Σταύρο! Υπογραμμίζω μόνο ότι το άρθρο δεν είναι του γράφοντα αλλά του Γιάννη Κ. (νέος συνεργάτης, με όρεξη και πολλές ιδέες :))

Leave a Reply

You must be logged in to post a comment.

Σύνδεση

Αρχείο δημοσιεύσεων