Moderators Kercyn Δημοσ. 29 Αυγούστου 2018 Moderators Δημοσ. 29 Αυγούστου 2018 (επεξεργασμένο) Καλησπέρα σας. Θέλω να φτιάξω μια πλατφόρμα η οποία θα έχει διάφορα εργαλεία για D&D αλλά επειδή δεν έχω ξανασχοληθεί με web χρειάζομαι τη βοήθειά σας! Έχω διαβάσει κάποια πράγματα για το MVC και θέλω να μου πείτε αν η προσέγγιση που έχω σκεφτεί είναι σωστή. Το πρώτο εργαλείο που θέλω να φτιάξω θα επιτρέπει τη δημιουργία χαρτών οι οποίοι θα χρησιμοποιούνται στη συνέχεια στο εκάστοτε adventure. Υπάρχουν τρεις διαφορετικές χρήσεις του εργαλείου αυτού (αρχικός σχεδιασμός του χάρτη, παίξιμο ως DM, παίξιμο ως παίκτης). Και για τις τρεις αυτές χρήσεις, το οπτικό μέρος του χάρτη θα γίνεται render σε ένα canvas με το Three.js. Επίσης, και ο έλεγχος της κάμερας (μετακίνηση, περιστροφή και ζουμ) είναι ίδιος για όλες τις χρήσεις. Αυτό που θα αλλάζει θα είναι οι παρεχόμενες λειτουργίες και η αλληλεπίδραση. Για παράδειγμα, μπορεί το δεξί κλικ στο σχεδιασμό του χάρτη να ανοίγει ένα μικρό μενού, όταν το παίζει ο DM ένα διαφορετικό μενού, και όταν το παίζει ο παίκτης, αν είναι η σειρά του, να κουνάει το χαρακτήρα του εκεί που έκανε δεξί κλικ. Πώς το έχω σκεφτεί τώρα: Ένα data structure που θα διατηρεί τις πληροφορίες του χάρτη (ας το πούμε Map). 3 views για το χάρτη (ένα για το σχεδιασμό και για το παίξιμο ως DM, ένα για τον παίκτη και ένα για τον spectator), όπου θα παίρνουν ως είσοδο το Map και θα το ζωγραφίζει στο canvas. 5 models: ένα για κοινό functionality, 3 για τα 3 διαφορετικά "modes" κι άλλο ένα για spectators του παιχνιδιού. 5 controllers, ένα για κάθε model. Ο κάθε controller θα παίρνει το user input, θα κοιτάει αν η ενέργεια που πάει να γίνει είναι επιτρεπτή (αν πχ ένας χαρακτήρας μπορεί να μετακινηθεί στο tile όπου έγινε το κλικ) και θα καλεί το κατάλληλο functionality του model. Πέρα από το canvas, θα υπάρχει και ένα UI για κάθε περίπτωση. Έτσι όπως το καταλαβαίνω, θα χρειαστώ μόνο ένα view για το UI, το model και ο controller για τις ενέργειες του UI θα είναι ίδιοι με του χάρτη (δηλαδή για το σχεδιασμό του χάρτη θα έχουμε 2 views (canvas + UI), 1 model και 1 controller). Οπότε μετά από όλο αυτό το κατεβατό, έχω 4 ερωτήσεις: Ο τρόπος σκέψης μου είναι, έστω, προς τη σωστή κατεύθυνση ή το έχω καταλάβει όλο λάθος; Ο έλεγχος της κάμερας υλοποιείται από το OrbitController του Three.js, το οποίο κολλάει πάνω σε μια κάμερα και επιτρέπει το χειρισμό της. Αυτό το αντικείμενο θα έπρεπε να μπει στο κάθε view ξεχωριστά, μιας και ανήκει στο Three.js (και όχι, ας πούμε, να γίνουν ταρζανιές του τύπου το βάζω στον controller και περνάω το αντικείμενο της κάμερας ως παράμετρο από το view); Θα χρειαστούν επιπλέον κλάσεις που θα διαχειρίζονται πράγματα όπως σύνδεση στη βάση, έλεγχος privileges των χρηστών για διάφορες ενέργειες που πάνε να κάνουν, queries στη βάση κλπ. Αυτές οι κλάσεις μπαίνουν η καθεμιά σε δικό της αρχείο ή τα βάζω όλα σε ένα; Το MVC είναι ένα "σωστό" pattern γι' αυτήν την περίπτωση; Θα μου προτείνατε να διαβάσω κάτι άλλο όπως MVP ή MVVM ή δεν ξέρω γω ποιο άλλο αρτικόλεξο; Ευχαριστώ! Επεξ/σία 29 Αυγούστου 2018 από Kercyn
defacer Δημοσ. 5 Σεπτεμβρίου 2018 Δημοσ. 5 Σεπτεμβρίου 2018 (επεξεργασμένο) Είναι λίγο δυσκολο να σου απαντήσει κανείς σε όλο αυτό, μπέρδεμα γενικά, αλλά να κάνω μια προσπάθεια. Σε πάρα μα πάρα πολύ γενικές γραμμές, αυτό που καταλαβαίνω από αυτά που έγραψες είναι ότι πας να εφαρμόσεις ένα pattern που δεν κάνεις απαραίτητα ακόμα grok με τρόπο που ακούγεται σε αναμενόμενα επίπεδα οκ για το σενάριο που έχεις μπροστά σου. Οπότε αν ανησυχείς μήπως πας να βάλεις ρόδες σε τζετ σκι, μην ανησυχείς. Από κει και πέρα... Πρώτα απ'όλα θα είναι λίγο nontrivial αυτό που λες καθώς το view σου δεν είναι στην ουσία στον έλεγχο σου, είναι three πάνω σε canvas και ότι κάνεις θα πρέπει να το κάνεις πάνω σε αυτό. Τώρα, δεν έχω ιδέα από three και το state of canvas interfaces, αλλά αφού αυτό είναι έτσι θα πρέπει να ξεκινήσεις από εκεί: πως θα ήθελες να είναι το interface ανάμεσα στον canvas και την υπόλοιπη εφαρμογή. Παρακάτω, δεν έχω καταλάβει (και δεν έχω καταλάβει αν εσύ έχεις καταλάβει) κατά πόσο η όλη εφαρμογή θα είναι client based ή server based ή και τα δύο μαζί. Αν και τα δύο μαζί (που μου ακούγεται πιθανό) τότε ξεκαθάρισε πως δεν υπάρχει ένα view/model/whatever, αλλά δύο, που θα έχουν διαφορετικό προσανατολισμό και θα κάνουν διαφορετικά πράγματα και αν δεν κάνεις τον server σε node θα είναι και σε άλλη γλώσσα. Και τέλος, προς αποφυγή παρεξηγήσεων, όταν μιλάμε για ολόκληρη εφαρμογή το model είναι ένα concept, όχι μία class. Σε εφαρμογή ρεαλιστικού μεγέθους μιλάμε για δεκάδες/εκατοντάδες/χιλιάδες classes. Επεξ/σία 5 Σεπτεμβρίου 2018 από defacer
Moderators Kercyn Δημοσ. 6 Σεπτεμβρίου 2018 Μέλος Moderators Δημοσ. 6 Σεπτεμβρίου 2018 Καταρχάς σ' ευχαριστώ που κάθησες και απάντησες. Το καταλαβαίνω ότι είναι μπερδεμένο όλο αυτό, απλώς με αυτά που ξέρω προσπάθησα να σχεδιάσω για κάτι που δεν ξέρω. Οπότε πήρα τα όσα ξέρω, διάβασα για το MVC και προσπάθησα να κάνω μια "μετάφραση" αυτών που ξέρω. Θα προσπαθήσω να εξηγήσω καλύτερα το πώς το έχω στο μυαλό μου. Ας πούμε ότι έχουμε ένα toolbox με διάφορα εργαλεία, μια λίστα με διάφορα layers διαφορετικού τύπου (για τη ζωγραφική των tiles, τοποθέτηση παικτών/NPCs, triggers κλπ) και μια γκαλερί με textures, εικόνες κλπ. Έχουμε επίσης τον canvas στον οποίο γίνεται render ο χάρτης. Κάθε εργαλείο του toolbox δουλεύει σε διαφορετικό είδους layer (πχ ένα fill tool μπορεί να ζωγραφίσει μόνο σε tile layer, ένας εχθρός μπορεί να μπει μόνο σε NPC layer κλπ). Ας πούμε λοιπόν ότι θέλουμε να ζωγραφίσουμε ένα ξέφωτο. Πατάμε το stamp tool. Ένας toolbox listener βλέπει ότι κάναμε κλικ και πού και ενημερώνει ένα "coordinator" class ότι έχουμε πατήσει το stamp tool. Μετά πάμε να κάνουμε κλικ στον canvas. Ο canvas listener το πιάνει και περνάει τις παραμέτρους στον coordinator. Ο coordinator βλέπει ότι δεν έχει επιλεγεί σωστό layer ή κατάλληλο texture και δε συνεχίζει. Αν τα έχουμε κάνει όλα σωστά, ο coordinator περνάει τις παραμέτρους στο renderer (περνάει πχ συντεταγμένες, tool, layer και texture ID) και επίσης ενημερώνει το Map ότι στο Χ layer άλλαξε το Υ tile με τις Ζ παραμέτρους. Ο renderer στη συνέχεια ζωγραφίζει στο canvas με βάση αυτά που του πέρασε ο listener. Για τη δημιουργία του χάρτη, οι διαδικασίες θα είναι σχεδόν εξ ολοκλήρου client-side. Οι μόνες φορές που θα επικοινωνεί με το server είναι όταν θα γίνεται αποθήκευση του χάρτη και όταν θα παίρνει tiles, εικόνες κλπ από τη συλλογή του χρήστη και θα τις βάζει στο UI. Για το παίξιμο, είτε ως DM είτε ως παίκτης θα υπάρχει μια κλασσική client-server αρχιτεκτονική όπου ο client θα ζητάει να κάνει πράγματα, ο server θα κάνει validate και αν όλα είναι οκ θα στέλνει μήνυμα στους clients για το τι ενέργεια έγινε. Επειδή δεν έχω ούτε τις γνώσεις ούτε την εμπειρία να υπολογίσω από πριν διάφορα τεχνικά θέματα, σου λέω περίπου πώς το έχω στο μυαλό μου. Μπορεί κάποια απ' αυτά που λέω να μη γίνονται ή να γίνονται αλλιώς, γι' αυτό ξεκίνησα να διαβάζω για MVC, για ν' αρχίσω απ' την αρχή σωστά αλλά κάπου το έχασα.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα