Κατέβασμα παρουσίασης
Η παρουσίαση φορτώνεται. Παρακαλείστε να περιμένετε
1
Μαθαίνοντας Python -- 10 ΣΕΜΙΝΑΡΙΟ PYTHON 2014
ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΑΠΘ, ΣΤ. ΔΗΜΗΤΡΙΑΔΗΣ
2
PYGAME Δ Μέρος
3
Collision detection & Keyboard Input
Στην ενότητα αυτή θα ασχοληθούμε (β) με την Ανίχνευση Σύγκρουσης (Collision detection) μεταξύ αντικειμένων στην οθόνη (β) Έλεγχο πληκτρολογήσεων του χρήστη
4
Το παράδειγμά μας Στο παράδειγμα αυτό θα χρησιμοποιήσουμε την κλάση Ball και θα σχεδιάσουμε επιπρόσθετα την κλάση με όνομα Raketa Τα αντικείμενα τύπου Raketa θα μπορούν να “χτυπούν” τα αντικείμενα τύπου Ball Έτσι μπορούμε να φτιάξουμε αθλητικά παιχνίδια, τύπου τένις, πινγκ-πονγκ κλπ. ή παιχνίδια με ρακέτα πχ. τύπου arkanoid Επίσης θα δούμε το πώς ο παίκτης ελέγχει τη ρακέτα του μέσω των πλήκτρων Left & Right Arrow (Δεξί – Αριστερό Βέλος) του πληκτρολογίου
5
Κλάση Raketa, Constructor -- 1
Class Raketa υποκλάση της γενικής Sprite __init__ constructor που καλεί και την αντίστοιχη init της Sprite createX, createY συντεταγμένες όπου θα δημιουργηθεί το αντικείμενο τύπου Raketa dimX, dimY διαστάσεις της εικόνας του αντικειμένου στον Χ & Υ άξονα speedX αρχική ταχύτητα στον άξονα Χ (ΔΕΝ χρειαζόμαστε στον άξονα Υ καθώς η ρακέτα κινείται μόνον ΟΡΙΖΟΝΤΙΑ)
6
Κλάση Raketa, Constructor -- 2
self.rect η ορθογώνια περιοχή (Surface) που περικλείει την εικόνα του αντικειμένου τύπου Raketa self.image ‘φορτώνουμε’ την εικόνα από το αρχείο ‘raketa.png’ καλώντας την image.load self.transImage προσαρμόζουμε (transform) τις διαστάσεις της εικόνας (με βάση τις τιμές των ορισμάτων dimX, dimY)
7
Κλάση Raketa, Constructor -- 3
self.moveLeft μεταβλητή Flag – Όταν είναι True δείχνει πως ο παίκτης ζητά να κινηθεί η ρακέτα προς τα αριστερά self.moveRight μεταβλητή Flag – Όταν είναι True δείχνει πως ο παίκτης ζητά να κινηθεί η ρακέτα προς τα δεξιά self.speedX η ταχύτητα του αντικειμένου στον άξονα Χ – Παίρνει αρχική τιμή από την παράμετρο speedX
8
Κλάση Raketa, Μέθοδος move
Ελέγχει: (α) αν το αντικείμενο κινείται αριστερά (moveLeft) ΚΑΙ δεν έχει φτάσει στο όριο της αριστερής πλευράς αν True τότε μειώνει τη συντεταγμένη left κατά το ποσό speedX (β) αν το αντικείμενο κινείται δεξιά (moveRight) ΚΑΙ δεν έχει φτάσει στο όριο της δεξιάς πλευράς αν True τότε αυξάνει τη συντεταγμένη right κατά το ποσό speedX Τέλος καλεί την blit για αποτύπωση στην επιφάνεια surf (η οποία περνά ως παράμετρος)
9
Main -- 1 Συντεταγμένες κέντρου οθόνης
Θα χρειαστούμε τις συντεταγμένες κέντρου οθόνης Καλέστε την get_rect().centerx & get_rect(). centery για να τις περάσετε στις δικές σας μεταβλητές wSCenterX & wSCenterY
10
Main -- 2 Δημιουργία αντικειμένου τύπου Raketa
Δημιουργείται το αντικείμενο r1 τύπου Raketa Προσέξτε τα ορίσματα αρχικής θέσης wSCenterX στο κέντρο της οθόνης στον άξονα Χ wSCenterY +200 200 pxls κάτω από το κέντρο της οθόνης στον άξονα Υ Αμέσως μετά καλείται η update για ενημέρωση της οθόνης
11
Main -- 3 Έλεγχος Πληκτρολόγιου
Αν δημιουργήθηκε γεγονός τύπου KEYDOWN (ο παίκτης πατά το πλήκτρο) ΤΟΤΕ αν πατήθηκε K_LEFT ή K_RIGHT ρύθμισε κατάλληλα τις σημαίες moveRight & moveLeft του r1 Αν δημιουργήθηκε γεγονός τύπου KEYUP (ο παίκτης αφήνει το πλήκτρο) ΤΟΤΕ αν πατήθηκε ESCAPE ή K_LEFT ή K_RIGHT κάνε τις κατάλληλες ενέργειες Πχ. ρύθμισε κατάλληλα τις σημαίες moveRight & moveLeft του r1
12
Main -- 4 Έλεγχος Πληκτρολόγιου
Παρατηρήστε τον κώδικα ελέγχου του πληκτρολογίου Ο κώδικας: (α) ελέγχει τι πλήκτρο πατήθηκε (β) ρυθμίζει κατάλληλες μεταβλητές-σημαίες (moveLeft & moveRight) (γ) στην περίπτωση του ESCAPE εγκαταλείπει το πρόγραμμα Οι ενέργειες ρύθμισης της κίνησης της ρακέτας θα γραφούν παρακάτω, μετά τον κώδικα ελέγχου Γιατί ΔΕΝ δηλώνουμε εμείς πουθενά τις σταθερές K_LEFT, K_RIGHT κλπ;
13
Main -- 5 Κίνηση αντικειμένων
Αφού χρωματίσουμε λευκή την επιφάνεια της οθόνης (ώστε να σβήσει την προηγούμενη θέση των αντικειμένων)… …καλούμε τις μεθόδους move των αντικειμένων ώστε να τα σχεδιάσουν στη νέα τους θέση Θυμηθείτε ότι οι μέθοδοι move καλούν και την blit
14
Main -- 6 Ανίχνευση σύγκρουσης
Η ανίχνευση σύγκρουσης μπορεί να γίνει με πολλούς τρόπους Στο παράδειγμά μας καλούμε την μέθοδο colliderect του αντικειμένου b1 με όρισμα το r1.rect, δηλ. την ορθογώνια επιφάνεια που περιλαμβάνει το αντικείμενο r1
15
Διαφάνεια sprites Transparency
16
Το γενικό πρόβλημα Πως μπορούμε να παρουσιάσουμε με διάφανο τρόπο (transparent) τα sprites στην οθόνη;; … ώστε να μην εμφανίζεται το χρώμα που υπάρχει στο περιθώριο του ορθογωνίου Rect ενός sprite
17
Το παράδειγμά μας Γενικά ένα sprite εμφανίζει συνήθως ένα ανεπιθύμητο περίγραμμα χρώματος μέσα στην ορθογώνια περιοχή Rect όπου το προβάλλουμ Πχ. η μπάλα δεξιά εμφανίζει ένα λευκό περίγραμμα αν προβληθεί σε background διαφορετικού χρώματος Πώς μπορούμε να εμφανίσουμε τη μπάλα χωρίς το λευκό περίγραμμα;
18
Λύση Α Με έναν επεξεργαστή εικόνας μετατρέπω το ανεπιθύμητο χρώμα της εικόνας σε διάφανο Η εικόνα δεξιά επάνω εμφανίζει το sprite της μπάλας (αρχείο ballw.png) όπως αρχικά είναι με το λευκό περίγραμμα Η εικόνα δεξιά κάτω εμφανίζει το sprite της μπάλας (αρχείο ball.png) μετά την επεξεργασία. Το ανεπιθύμητο περίγραμμα εμφανίζεται ως γκρίζα περιοχή (transparent)
19
Λύση Α --- 2 «Φορτώνω» κανονικά την εικόνα που έχω επεξεργαστεί
Λύση Α «Φορτώνω» κανονικά την εικόνα που έχω επεξεργαστεί Η δηλωμένη ως διάφανη (transparent) περιοχή δεν θα εμφανίζεται στην οθόνη self.image=pygame.image.load('ball.png')
20
Λύση Β Φορτώνω την κανονική εικόνα (αρχείο ballw.png) χωρίς καμιά επεξεργασία με χρήση της convert() self.image=pygame.image.load('ballw.png').convert() H convert δημιουργεί ένα ακόμη ‘κανάλι’ χρώματος αφιερωμένο στη διαφάνεια της εικόνας
21
Λύση Β Δηλώνω το χρώμα της εικόνας που θέλω να είναι διαφανές με την set_colorkey() Το αποτέλεσμα είναι πως το λευκό περίγραμμα της μπάλας δεν εμφανίζεται πλέον καθώς θεωρείται διάφανο
Παρόμοιες παρουσιάσεις
© 2024 SlidePlayer.gr Inc.
All rights reserved.