Alchemist` Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Καλησπέρα παίδες... Άλλη μια ερώτηση χωρίς τον κατάλληλο τίτλο... Ελπίζω να μην σας έχω κουράσει πιά... Έχουμε ένα αντικείμενο Α που είναι ο παίκτης, το οποίο μπορεί να αλληλεπιδράσει με το αντικείμενο Β, εάν ο παίκτης βρίσκεται μέσα σε μια Χ απόσταση, όταν αυτός πατήσει ένα πλήκτρο. Για να καταλάβαιτε τι εννοώ φανταστείτε ένα κόσμο ενός 2D rpg, όπως του final fantasy 3, όπου όταν πλησιάσει κανείς ενα npc μπορεί να του μιλήσει πατώντας κάτι. Στον κόσμο μας λοιπόν έχουμε πολλά αντικείμενα Β, και Γ και Δ, που έχουν τον ίδιο σκοπό. Δλδ όταν ο παίκτης είναι κοντά (μέσα στα πλαίσια μιας δεδομένης απόστασης), και πατήσει ένα πλήτρο, θα αλληλεπιδράσει μεταξύ τους. Ο τρόπος που χρησιμοποιώ μέχρι στιγμής για να γίνει αυτό είναι ο εξής: Ο παίκτης έχει 3 μετβλητές, που δείχνουν το unique id, του αντικειμένου της κάθε κλάσης (Β,Γ,Δ) που είναι πιο κοντά σε αυτόν (μπορεί να έχουμε 20Β, 30Γ και 50Δ). Αυτά υπολογίζονται κάθε φορά που ο παίκτης πατάει το σχετικό πλήκτρο, και επίσης στον ίδιο κύκλο επεξεργασίας υπολογίζεται η απόσταση από αυτά. Εάν για κάποιο από τα 3 ικανοποιείτε το κριτήριο της απόστασης τότε υλοποιείται η σχετική ενέργεια. Το πρόβλημα σε αυτήν την μέθοδο, είναι κατ' αρχάς η σπατάλη πόρων, αν και μικρή. Η δυσκολία υλοποίησης αν έχουμε εκατοντάδες τέτοιες διαφορετικές κλάσεις. Και κατά κύριο λόγο, πως αν έχουμε πολλά τέτοια αντικείμενα των οποίων η απόσταση είναι κατάλληλη, θα ενεργοποιηθεί ο μηχανισμός για όλα. Αυτό μπορεί να αντιμετωπιστεί αν χρησιμοποιηθεί ως κριτήριο το προς τα που (direction) κοιτά ο παίκτης. Αλλά και πάλι κάτι δεν μ αρέσει. Έχετε μήπως υπόψιν σας κάποια καλύτερη μέθοδο για αυτήν την λειτουργία? Μου αρκεί και η περιγραφική ανάλυση της μεθόδου, δεν θέλω κώδικα! Ευχαριστώ προκαταβολικά! Υ.Γ. Επίσης εάν δυνατό δεν θέλω το collision ως κριτήριο, γιατί προκαλεί άλλα προβλήματα. Υ.Γ.2. αυτόν τον τρόπο σκέφτηκα πρώτο, και ειληκρινά έχω κολήσει. Δεν μπορώ να σκεφτώ τπτ άλλο...
MitsakosGR Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Ο παίκτης έχει 3 μετβλητές, που δείχνουν το unique id, του αντικειμένου της κάθε κλάσης (Β,Γ,Δ) που είναι πιο κοντά σε αυτόν (μπορεί να έχουμε 20Β, 30Γ και 50Δ). Αυτά υπολογίζονται κάθε φορά που ο παίκτης πατάει το σχετικό πλήκτρο, και επίσης στον ίδιο κύκλο επεξεργασίας υπολογίζεται η απόσταση από αυτά. Εάν για κάποιο από τα 3 ικανοποιείτε το κριτήριο της απόστασης τότε υλοποιείται η σχετική ενέργεια. Δεν κατάλαβα τι συμβολίζει η κάθε μεταβλητή από τις 3. Διανυσματικά δεν μπορείς να βρεις τα πιο κοντινά (υποθέτω χρησιμοποιείς x,y ως συντεταγμένες); Υπόθεση κάνω: Έστω ότι έχεις ένα πίνακα με τις αποστάσεις από όλα τα αντικείμενα ο οποίος ενημερώνεται στην αρχή και στη συνέχεια σε κάθε κίνηση ενημερώνεται με βάση την κίνηση του χαρακτήρα και όχι κάθε φορά που πατάει ο χρήστης το κουμπί. Έτσι με μία απλή αναζήτηση στον πίνακα θα ξέρεις αμέσως πιο είναι το πιο κοντινό στοιχείο. (τώρα που το σκέφτομαι μπορεί να έχει μεγάλη σπατάλη πόρων σε κάθε αναζήτηση, αλλά δεν ξέρω, ιδέα είπα).
Alchemist` Δημοσ. 28 Οκτωβρίου 2010 Μέλος Δημοσ. 28 Οκτωβρίου 2010 Δεν κατάλαβα τι συμβολίζει η κάθε μεταβλητή από τις 3.Διανυσματικά δεν μπορείς να βρεις τα πιο κοντινά (υποθέτω χρησιμοποιείς x,y ως συντεταγμένες); Τα Β, Γ και Δ είναι κλάσεις αντικειμένων. Μπορεί μέσα στο περιβάλλον να υπάρχουν ας πούμε πολλά Β. Οι 3 μεταβλητές δείχνουν το πιο Β, πιο Γ και Δ είναι τα πιο κοντινά στον παίκτη. Αυτό βέβαια δείχνει πιο Β είναι το πιο κοντινό, το αυτό Β μπορεί να μην βρίσκεται μέσα στην δεδομένη απόσταση Χ. Οπότε αφού βρούμε αυτό το συγκεκριμένο Β (μέσω του ID) τότε υπολογίζεται η απόσταση από αυτό και συγκρίνεται με την Χ. Δεν κατάλαβα τι συμβολίζει η κάθε μεταβλητή από τις 3.Διανυσματικά δεν μπορείς να βρεις τα πιο κοντινά (υποθέτω χρησιμοποιείς x,y ως συντεταγμένες); Υπόθεση κάνω: Έστω ότι έχεις ένα πίνακα με τις αποστάσεις από όλα τα αντικείμενα ο οποίος ενημερώνεται στην αρχή και στη συνέχεια σε κάθε κίνηση ενημερώνεται με βάση την κίνηση του χαρακτήρα και όχι κάθε φορά που πατάει ο χρήστης το κουμπί. Έτσι με μία απλή αναζήτηση στον πίνακα θα ξέρεις αμέσως πιο είναι το πιο κοντινό στοιχείο. (τώρα που το σκέφτομαι μπορεί να έχει μεγάλη σπατάλη πόρων σε κάθε αναζήτηση, αλλά δεν ξέρω, ιδέα είπα). Σε άξονα χ,y βρίσκονται τα αντικείμενα. Τα περισσότερα από τα αντικείμενα, όπως και ο παίκτης κινούνται διαρκώς. Οπότε στην ουσία σε κάθε κύκλο έχουμε αλλαγές. Οι υπολογισμοί γίνονται μόνο όταν πατιέται το κουμπί, για να ελαχιστοποιηθεί ο αριθμός τους, αφού μόνο τότε χρειάζονται.
computeras13 Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Βασικά δεν μπορώ να καταλάβω τον σκοπό της απόστασης από κάθε κλάση ξεχωριστά. Αν δεν υπάρχει κάποιος άλλος λόγος που το κάνεις αυτό, τότε μπορείς να υλοποιήσεις ένα interface ή αφηρημένη κλάση η οποία θα είναι γονέας των κλάσεων Β,Γ και Δ (ας την πούμε NPC) και κάθε φορά που θες να πατάς το κουμπί που λες θα κάνεις αναζήτηση για το πιο κοντικό NPC.
Alchemist` Δημοσ. 28 Οκτωβρίου 2010 Μέλος Δημοσ. 28 Οκτωβρίου 2010 Βασικά δεν μπορώ να καταλάβω τον σκοπό της απόστασης από κάθε κλάση ξεχωριστά. Αν δεν υπάρχει κάποιος άλλος λόγος που το κάνεις αυτό, τότε μπορείς να υλοποιήσεις ένα interface ή αφηρημένη κλάση η οποία θα είναι γονέας των κλάσεων Β,Γ και Δ (ας την πούμε NPC) και κάθε φορά που θες να πατάς το κουμπί που λες θα κάνεις αναζήτηση για το πιο κοντικό NPC. Βασικά έχω ένα use-key, το Ε, το οποίο κάνει χίλια 2 πράγματα... Π.χ. ανοίγει πόρτες, μιλάει με ένα npc, σηκώνει κάποιο item κτλπ... Δεν μπορεί όλα αυτά τα άσχετα αντικείμενα να μπούνε στην ίδια κλάση... Εκτός αν γίνει μια κλάση π.χ. Usable items, και μπούνε μέσα σχεδόν όλα τα αντικείμενα του παιχνιδιού... Δεν είναι άσχημη ιδέα...
computeras13 Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Ή μπορείς να ορίσεις μια boolean μεταβλητή σε κάθε κλάση αντικειμένου που θέλεις η οποία θα καθορίζει το αν είναι usable ή όχι. Πιστεύω πάντως πως το να κάνεις μια κλάση usable items όπως είπες είναι το πιο λογικό. Θα ορίσεις μέσα εκεί τις ιδιότητες που θα έχουν και αν χρειαστεί τις υπερφορτώνεις στις κλάσεις παιδιά.
m1cRo Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Καλησπέρα παίδες... Άλλη μια ερώτηση χωρίς τον κατάλληλο τίτλο... Ελπίζω να μην σας έχω κουράσει πιά... Έχουμε ένα αντικείμενο Α που είναι ο παίκτης, το οποίο μπορεί να αλληλεπιδράσει με το αντικείμενο Β, εάν ο παίκτης βρίσκεται μέσα σε μια Χ απόσταση, όταν αυτός πατήσει ένα πλήκτρο. Για να καταλάβαιτε τι εννοώ φανταστείτε ένα κόσμο ενός 2D rpg, όπως του final fantasy 3, όπου όταν πλησιάσει κανείς ενα npc μπορεί να του μιλήσει πατώντας κάτι. Στον κόσμο μας λοιπόν έχουμε πολλά αντικείμενα Β, και Γ και Δ, που έχουν τον ίδιο σκοπό. Δλδ όταν ο παίκτης είναι κοντά (μέσα στα πλαίσια μιας δεδομένης απόστασης), και πατήσει ένα πλήτρο, θα αλληλεπιδράσει μεταξύ τους. Ο τρόπος που χρησιμοποιώ μέχρι στιγμής για να γίνει αυτό είναι ο εξής: Ο παίκτης έχει 3 μετβλητές, που δείχνουν το unique id, του αντικειμένου της κάθε κλάσης (Β,Γ,Δ) που είναι πιο κοντά σε αυτόν (μπορεί να έχουμε 20Β, 30Γ και 50Δ). Αυτά υπολογίζονται κάθε φορά που ο παίκτης πατάει το σχετικό πλήκτρο, και επίσης στον ίδιο κύκλο επεξεργασίας υπολογίζεται η απόσταση από αυτά. Εάν για κάποιο από τα 3 ικανοποιείτε το κριτήριο της απόστασης τότε υλοποιείται η σχετική ενέργεια. Το πρόβλημα σε αυτήν την μέθοδο, είναι κατ' αρχάς η σπατάλη πόρων, αν και μικρή. Η δυσκολία υλοποίησης αν έχουμε εκατοντάδες τέτοιες διαφορετικές κλάσεις. Και κατά κύριο λόγο, πως αν έχουμε πολλά τέτοια αντικείμενα των οποίων η απόσταση είναι κατάλληλη, θα ενεργοποιηθεί ο μηχανισμός για όλα. Αυτό μπορεί να αντιμετωπιστεί αν χρησιμοποιηθεί ως κριτήριο το προς τα που (direction) κοιτά ο παίκτης. Αλλά και πάλι κάτι δεν μ αρέσει. Έχετε μήπως υπόψιν σας κάποια καλύτερη μέθοδο για αυτήν την λειτουργία? Μου αρκεί και η περιγραφική ανάλυση της μεθόδου, δεν θέλω κώδικα! Ευχαριστώ προκαταβολικά! Υ.Γ. Επίσης εάν δυνατό δεν θέλω το collision ως κριτήριο, γιατί προκαλεί άλλα προβλήματα. Υ.Γ.2. αυτόν τον τρόπο σκέφτηκα πρώτο, και ειληκρινά έχω κολήσει. Δεν μπορώ να σκεφτώ τπτ άλλο... Είναι απλό το κάθε αντικείμενο ( Χαρακτήρας ) έχει μέσα τις συντεταγμένες του, φαντάζομαι ότι έχεις κάποιο pool από χαρακτήρες. Απλά όταν ένας χαρακτήρας θέλει να επικοινωνήσει με άλλον δημιουργεί ένα event και το στέλνει σε όλους, το event περιέχει και τον αποστολέα μέσα, ο κάθε χαρακτήρας που δέχεται το event υπολογίζει την ευκλείδεια απόσταση ανάμεσα στον δημιουργό του event και τον εαυτό του, και ανάλογος ενεργεί. Ελπίζω να κατάλαβες τι ενοώ. ---------- Προσθήκη στις 19:02 ---------- Προηγούμενο μήνυμα στις 18:30 ---------- Είναι απλό το κάθε αντικείμενο ( Χαρακτήρας ) έχει μέσα τις συντεταγμένες του, φαντάζομαι ότι έχεις κάποιο pool από χαρακτήρες. Απλά όταν ένας χαρακτήρας θέλει να επικοινωνήσει με άλλον δημιουργεί ένα event και το στέλνει σε όλους, το event περιέχει και τον αποστολέα μέσα, ο κάθε χαρακτήρας που δέχεται το event υπολογίζει την ευκλείδεια απόσταση ανάμεσα στον δημιουργό του event και τον εαυτό του, και ανάλογος ενεργεί. Ελπίζω να κατάλαβες τι ενοώ. A ξέχασα να πω ότι αν θέλεις να κόψεις το event μετά από την πρώτη αντίδραση του αντικειμενου απλά κάντο invalid, βάλε μέσα μια boolean τιμή δλδ.
RubiksCube Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 ...Ο παίκτης έχει 3 μετβλητές, που δείχνουν το unique id, του αντικειμένου της κάθε κλάσης (Β,Γ,Δ) που είναι πιο κοντά σε αυτόν (μπορεί να έχουμε 20Β, 30Γ και 50Δ). Αν κατάλαβα καλά κάθε αντικείμενο παίκτης έχει ένα reference σε όλα τα αντικείμενα με τα οποία μπορεί να κάνει interact? Αν είναι έτσι, αυτό όντως είναι μεγάλη σπατάλη πόρων. Νομίζω ότι χρειάζεσαι μια κλάσση που να λέγεται πχ LocationController, όπου μόνο εκεί υπάρχουν reference σε όλα τα ανιτκείμενα. Τώρα όταν πατηθεί το κουμπί, το αντικείμενο πάικτης καλεί μια μέθοδο η οποία επιστρέφει σε μια λίστα όλα τα αντικείμενα με τα οποία μπορεί να κάνει interact. δλδ όταν πατηθεί το κουμπί List neighbors = locationController.getNeighborsOfObject(playerObject);
m1cRo Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Αν κατάλαβα καλά κάθε αντικείμενο παίκτης έχει ένα reference σε όλα τα αντικείμενα με τα οποία μπορεί να κάνει interact?Αν είναι έτσι, αυτό όντως είναι μεγάλη σπατάλη πόρων. Νομίζω ότι χρειάζεσαι μια κλάσση που να λέγεται πχ LocationController, όπου μόνο εκεί υπάρχουν reference σε όλα τα ανιτκείμενα. Τώρα όταν πατηθεί το κουμπί, το αντικείμενο πάικτης καλεί μια μέθοδο η οποία επιστρέφει σε μια λίστα όλα τα αντικείμενα με τα οποία μπορεί να κάνει interact. δλδ όταν πατηθεί το κουμπί List neighbors = locationController.getNeighborsOfObject(playerObject); Όταν περπατάς βλέπεις να βρίσκεται κανένας LocationController στον δρόμο??? Νομίζω από εδώ ξεκινάει η κακή σχεδίαση. Μπορείς να έχεις Location που να έχει πολλούς characters, αλλα όχι LocationController, δεν υπάρχουν controllers στον πραγματικό κόσμο!!!
RubiksCube Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Όταν περπατάς βλέπεις να βρίσκεται κανένας LocationController στον δρόμο??? Νομίζω από εδώ ξεκινάει η κακή σχεδίαση. Μπορείς να έχεις Location που να έχει πολλούς characters, αλλα όχι LocationController, δεν υπάρχουν controllers στον πραγματικό κόσμο!!! Νομίζω ότι λανθασμένα πιστεύεις ότι κάθε κλάσση προέρχεται από ένα πραγματικό αντικείμενο στον κόσμο. Δεν είναι έτσι. Δες ένα οποιοδήποτε API πχ java, υπάρχουν κλάσσεις που προσφέρουν κάποιες υπηρεσίες. Απλά σε παραπέμπω στο MVC (Model/View/Controller) design pattern. Ούτε model ούτε view ούτε controller υπάρχουν στο δρόμο.
m1cRo Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Νομίζω ότι λανθασμένα πιστεύεις ότι κάθε κλάσση προέρχεται από ένα πραγματικό αντικείμενο στον κόσμο. Δεν είναι έτσι. Δες ένα οποιοδήποτε API πχ java, υπάρχουν κλάσσεις που προσφέρουν κάποιες υπηρεσίες. Απλά σε παραπέμπω στο MVC (Model/View/Controller) design pattern. Ούτε model ούτε view ούτε controller υπάρχουν στο δρόμο. Προφανώς στον πραγματικό κόσμο δεν υπάρχει ούτε το model ούτε το view ούτε το controller. Και ποιος σου είπε ότι το MVC είναι καλο πράδειγμα του OOP?? http://forums.sun.com/thread.jspa?threadID=740512 http://www.coderanch.com/t/96679/patterns/MVC-not-object-oriented Ψάξε λίγο στο google δεν είμαι ο μονος που το λέει. Δηλαδή διαφωνείς ότι ο άνθρωπος έπρεπε να φτιάξει Location και όχι LocationController έτσι?
RubiksCube Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 ... Και ποιος σου είπε ότι το MVC είναι καλο πράδειγμα του OOP?? Δηλαδή διαφωνείς ότι ο άνθρωπος έπρεπε να φτιάξει Location και όχι LocationController έτσι? Το αν είναι καλό pattern εξαρτάται από το πως το χρησιμοποιείς και αν ταιριάζει στο πρόβλημα που πας να λύσεις. Έχει πολλές παραλλαγές και είναι off topic να το αναλύσουμε εδώ. Όσο για το Location δεν ξέρω τι ακριβώς εννοείς. Εγώ απλά σε πολύ abstract level έδωσα ένα παράδειγμα του πώς αποφεύγεις να έχεις κάθε object να γνωρίζει τα locations όλων των υπολοίπων (που δεν συμβαίνει ούτε στην παραγματικότητα) και πώς έχεις ένα κεντρικό μηχανισμό που σου προσφέρει την υπηρεσια του να ξέρεις με ποιον μπορείς να επκοινωνήσεις.
m1cRo Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Το αν είναι καλό pattern εξαρτάται από το πως το χρησιμοποιείς και αν ταιριάζει στο πρόβλημα που πας να λύσεις. Έχει πολλές παραλλαγές και είναι off topic να το αναλύσουμε εδώ. Όσο για το Location δεν ξέρω τι ακριβώς εννοείς. Εγώ απλά σε πολύ abstract level έδωσα ένα παράδειγμα του πώς αποφεύγεις να έχεις κάθε object να γνωρίζει τα locations όλων των υπολοίπων (που δεν συμβαίνει ούτε στην παραγματικότητα) και πώς έχεις ένα κεντρικό μηχανισμό που σου προσφέρει την υπηρεσια του να ξέρεις με ποιον μπορείς να επκοινωνήσεις. Εξηγώ. Στην πραγματικότητα έχεις μια περιοχή : Location. Η περιοχή μπορεί να έχει κάποια αντικείμενα. Εμενα μου φαίνεται πιο λογικό να έχουμε Location με αντικείμενα παρα κάποιον controller. Ξαναλέω ότι πιστεύω ότι αν αρχίζεις και δημιουργείς κλάσεις που κάνουν και όχι είναι έχεις πρόβλημα στην σχεδίαση. Ο Controller "κάνει" "δεν είναι"...
RubiksCube Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Εξηγώ. Στην πραγματικότητα έχεις μια περιοχή : Location. Η περιοχή μπορεί να έχει κάποια αντικείμενα. Εμενα μου φαίνεται πιο λογικό να έχουμε Location με αντικείμενα παρα κάποιον controller. Ξαναλέω ότι πιστεύω ότι αν αρχίζεις και δημιουργείς κλάσεις που κάνουν και όχι είναι έχεις πρόβλημα στην σχεδίαση. Ο Controller "κάνει" "δεν είναι"... Δηλαδή αντί να έχεις συντεταγμένες x και y, θα χωρίσεις τον χώρο σε περιοχές?? px north south etc? Δεν καταλαβαίνω ακριβώς πώς το έχεις σκεφτεί. Εφόσον κάθε player επικοινωνεί με αντικείμενα που είναι εντός μιας ακτίνας από αυτόν δεν βλέπω πώς θα χωρίσεις τις περιοχές. Anyway δεν θα λύσουμε εδώ το πρόβλημα του topic starter. Ας διαβάσει όλες τις απόψεις και ας διαλέξει.
m1cRo Δημοσ. 28 Οκτωβρίου 2010 Δημοσ. 28 Οκτωβρίου 2010 Δηλαδή αντί να έχεις συντεταγμένες x και y, θα χωρίσεις τον χώρο σε περιοχές?? px north south etc? Δεν καταλαβαίνω ακριβώς πώς το έχεις σκεφτεί. Εφόσον κάθε player επικοινωνεί με αντικείμενα που είναι εντός μιας ακτίνας από αυτόν δεν βλέπω πώς θα χωρίσεις τις περιοχές. Anyway δεν θα λύσουμε εδώ το πρόβλημα του topic starter. Ας διαβάσει όλες τις απόψεις και ας διαλέξει. Όπως το κάνουν σε όλα τα παιχνίδια rpg κάθε φορα φορτώνεις μια περιοχή με αντικείμενα. Το κάθε αντικείμενο έχει μέσα του τις συντεταγμένες του γενικός. Για να μην έχεις όλα τα αντικείμενα του κόσμου πρέπει να χωρίσεις τον κόσμο σε περιοχές. Μετά λες στην περιοχή πάτησα E αυτή προωθεί το mnma στα αντικείμενα τις το κάθε αντικείμενο αποφασίζει αν θα αντιδράσει η όχι.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.