Καλησπέρα!
Φτιάχνω μια μηχανή για 2D Gaming σε python με βασικό εργαλείο το pygame. Έχω φτάσει στο σημείο όπου πρέπει να
γίνονται έλεγχοι για συγκρούσεις μεταξύ αντικειμένων (Collisions). Αν θέλετε μπορείτε να δείτε και τον αλγόριθμο που
ελέγχει τις συγκρούσεις.
Spoiler:
Μέχρι τώρα για να ελέγξω για συγκρούσεις έκανα το εξής:
Το παραπάνω δουλεύει τέλεια αλλά είναι πάρα μα πάρα πολύ αργό!!!Κώδικας:for i in range( len(allSprites) ): for j in range( i+1, len(allSprites) ): if allSprites[i].collider.getCollision( allSprites[j] ): #Do Something.
H πολυπλοκότητα είναι Χ^2 - 1 !!!
Στην συνέχεια σκέφτηκα κάτι άλλο. Αντικείμενα που δεν κινούνται γιατί να τα ελέγχω μεταξύ τους αφού ποτέ δεν θα συγκρουστούν;
Έτσι χώρισα τα αντικείμενα μου σε στατικά και μή στατικά ως εξής:
Έτσι κατάφερα να ρίξω την πολυπλοκότητα από x^2 - 1 σε x + m όπου x το μέγεθοςΚώδικας:allSprites = [] #All the sprites in the scene. notStatic = [] #Sprites that sprite.isStatic = False for sprite in allSprites : for movingSprite in notStatic: if movingSprite != sprite and movingSprite.collider.getCollision( sprite ): #Do Something
του allSprites και m του notStatic. Αυτό βοήθησε πάρα πολύ αλλά και πάλι είναι πολύ αργό. Σύν ότι μπορεί x = m και έτσι η πολυπλοκότητα να
γίνει x^2 = m^2 άρα δεν κατάφερα και πάλι τίποτα.
Και τώρα πάμε σε αυτό που με βασανίζει αυτήν την στιγμή. Σκέφτηκα να κάνω το εξής:
Ένα τετραδικό δένδρο αναζήτησης το οποίο θα έχει τις εξής ιδιότητες:
(Αυτό το δένδρο περιέχει μόνο αντικείμενα notStatic)
-Εαν x+ και y+ τότε αποθήκευσε το sprite στο πρώτο υποδένδρο.
-Εαν x- και y+ τότε αποθήκευσε το sprite στο δεύτερο υποδένδρο.
-Εαν x- και y- τότε αποθήκευσε το sprite στο τρίτο υποδένδρο.
-Εαν x+ και y- τότε αποθήκευσε το sprite στο τέταρτο υποδένδρο.
Επομένως ο αλγοριθμός μου γίνεται ως εξής:
Το tree.getCollision( sprite ) στην ουσία ψάχνει με δεδομέναΚώδικας:for sprite in allSprites: tree.reCreate(allSprites) if tree.getCollision( sprite ): #Do Something.
το x και y του αντικειμένου sprite να βρεί κόμβους στο δένδρο για
αντικείμενα notStatic που είναι σχετικά στην ίδια περιοχή. Και βέβαια
αν το δένδρο δεν είναι εκφυλισμένο αυτός ο αλγοριθμός είναι πάρα
πολύ ποιο γρήγορος από τον προιγούμενο!!!! Το πρόβλημα είναι ότι σε κάθε
frame/second πρέπει να ξανά δημιουργώ το δένδρο όλο από την αρχή διότι
τα notStatic αντικείμενα αλλάζουν τα x και y τους καθώς κινούνται. Και αυτό είναι το
μόνο πρόβλημα που με απασχολή τώρα διότι το tree.reCreate(allSprites)
αργεί πάρα πολύ και ρίχνει τα fps στο παιχνίδι!!!
Για αυτό θα ήθελα να με πείτε τρόπους βελτίωσεις ή και άλλες μεθόδους που δουλεύουν πολύ καλύτερα.
Ευχαριστώ!
Εμφάνιση 1-9 από 9
-
27-10-16, 18:31 Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #1
-
27-10-16, 21:38 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #2
δοκίμασε από την λίστα των sprite να εξαιρέσεις αυτά που έχουν απόσταση μεγαλύτερη μιας τιμής. Επειδή δεν γνωρίζω python, νήματα υποστηρίζει;
ουδέν μονιμότερο του προσωρινού
-
28-10-16, 12:39 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #3
-
28-10-16, 15:44 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #4
Κάποια πράγματα δεν μπορείς να τ' αποφύγεις. Στην ουσία έχεις sprites που αλλάζει το Χ μόνο, sprite που αλλάζει μόνο το Υ και sprites που αλλάζει και το Χ και το Υ. Δοκίμασε να φτιάξεις το δέντρο σου με αυτή την λογική. Μαι άλλη σκέψη που μου έρχεται τώρα είναι χρήση γράφου με βάρη στις ακμές όπου η πιο σύντομη διαδρομή είναι αυτή που επιλέγεται κάθε φορά για έλεγχο. Οι κορυφές του γράφου είναι τα sprite
ουδέν μονιμότερο του προσωρινού
-
28-10-16, 20:08 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #5
-
28-10-16, 21:44 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #6
Δώσε βάση σε αυτό το μάθημα γιατί είναι πολύ σημαντικό. Και ας μη τα καταλαβαίνει όλα. Δεν πειράζει.
ουδέν μονιμότερο του προσωρινού
-
29-10-16, 10:37 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #7
Τα loops στην Python είναι εξαιρετικά αργά. Δεν μπορείς να τα αποφύγεις, ακόμα και με το κόστος να κάνεις παραπάνω πράξεις;
-
31-10-16, 18:35 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #8
Ένα loop είναι αναγκαίο για να τρέχει το παιχνίδι. Τώρα από εκεί και πέρα, μπορείς να κάνεις διάφορα "κόλπα" για να τρέχει γρήγορα ο κωδικά σου. Για παράδειγμα εγώ θέλω να καταφέρω να έχω μόνο το main loop:
Κώδικας:for sprite in allSprites: #Game Loop.
-
03-12-16, 13:52 Απάντηση: Pygame Ελαχιστοποίηση Συγκρούσεων (Collision Detection). #9
Πέρασε καιρός, οπότε απλά αγνόησέ με αν έχεις λύσει το πρόβλημα.
Αν πάλι όχι, μπορείς ίσως να τα κάνεις όλα numpy arrays, κάθε pixel και κελί.
Μιλάμε για κουτιά σε 2d space, σωστά; Σε αυτή την περίπτωση δεν χρειάζεται να κάνεις έλεγχο ανά αντικείμενο.
Σου αρκεί ένας πίνακας που έχει 0 όπου δεν υπάρχει αντικείμενο, και από εκεί και μετά x όταν x αντικείμενα καταλαμβάνουν ένα pixel.
Όποτε κινείται κάτι, θα αφαιρείς 1 από την προηγούμενη θέση του (όλα τα κελιά/pixels που καταλάμβανε) και θα τη προσθέτεις στην επόμενη (όλα τα κελιά/pixels που καταλαμβάνει πλέον). Σε κάθε collision check θα ελέγχεις ότι δεν υπάρχουν τιμές >1 στον πίνακά σου. Αν υπάρχει έστω και ένα pixel, έχεις collision.
Ούτε καν το game engine δεν χρειάζεσαι έτσι :P
Γλιτώνεις όλα τα for και εσωτερικά η numpy δουλεύει με vectors, οπότε θα είναι πολύ πιο γρήγορη.
Υπάρχουν βελτιστοποιήσεις, πχ μπορείς να μεταφέρεις μόνο το περίγραμμα κάθε φορά αντί για όλη την επιφάνεια, που μάλλον θα σου ρίξει την πολυπλοκότητα αρκετά (με naive υλοποίηση θα έχεις ~Ο(n+m) μεταφορές να κάνεις αντί για ~O(n*m), όπου n είναι η μεγαλύτερη από τις δύο πλευρές σε pixel και m η μικρότερη), αλλά το τι είναι πιο εύκολο να υλοποιήσεις εξαρτάται από το τι δεδομένα έχεις και δεδομένου ότι και η numpy κάνει σημαντικές βελτιστοποιήσεις, είναι πολύ πιθανό να μη χρειαστεί να κάνεις δικές σου.
Παρόμοια Θέματα
-
Collision Detection για δημιουργία μηχανής βίντεο παιχνιδιών.
Από babaliaris στο φόρουμ Προγραμματισμός και γλώσσες προγραμματισμούΜηνύματα: 12Τελευταίο Μήνυμα: 02-06-16, 19:44 -
Elastix fax detect
Από mazout στο φόρουμ Voice over IP (VoIP) SoftwareΜηνύματα: 1Τελευταίο Μήνυμα: 06-01-16, 22:48 -
True Detective - Season 2
Από flamelab στο φόρουμ Πολιτιστικό στέκιΜηνύματα: 82Τελευταίο Μήνυμα: 06-01-16, 15:39
Bookmarks