Καλησπέρα.
Ο σωστός τρόπος για να κάνεις αντικείμενα για ένα παιχνίδι είναι με αντικειμενοστραφή
προγραμματισμό. Θα πρέπει να ξέρεις κλάσεις (κ.ο.κ) για να μπορέσεις να το κάνεις αυτό.
Στα 2d games οι κλάσεις που υλοποιούν αντικείμενα παιχνιδιού ονομάζονται
sprites. Το pygame
έχει δική του υλοποιήσει για Sprites αλλά εγώ θα σε δείξω πως γίνονται για να έχεις καλύτερο
έλεγχο σε αυτό που θες να κάνεις.
Πρώτα σκεφτόμαστε τη πρέπει να έχει ένα αντικείμενο παιχνιδιού.
1) Πρέπει να έχει μια εικόνα που αντιπροσωπεύει το αντικείμενο μέσα στο παιχνίδι.
2) Πρέπει να έχει κάποιες συντεταγμένες (x,y) που αντιπροσωπεύουν την θέση του μέσα στον κόσμο.
3) Θα πρέπει να έχει κάποιο όνομα (tag) για να μπορούμε να το ξεχωρίζουμε από άλλα αντικείμενα
μέσω κώδικα.
Επίσης θα πρέπει να υλοποιήσουμε και μία λειτουργικότητα που θα το ζωγραφίζει στην οθόνη
του υπολογιστεί χρησιμοποιώντας το blit του pygame και βέβαια μπορούμε να υλοποιήσουμε
και ότι άλλες μεθόδους θέλουμε. Πχ μία μπορεί να είναι η κίνηση με το click του ποντικιού
που προσπαθείς να κάνεις και εσύ.
Πάμε να δούμε πως γίνεται αυτό στην πράξη. Να ξέρεις, μην αντιγράψεις τον κώδικα αλλά προσπάθησε με αυτά που σε είπα να καταλάβεις την λογική και να τον υλοποιήσεις μόνος σου.
class Sprite:
#Κατασκευαστείς της κλάσης.
def __init__(self, image):
self.image = image #Εικόνα του αντικειμένου.
self.tag = "" #Tag name του αντικειμένου.
self.pos = (0,0) #Αρχική θέσει στον κόσμο.
self.width = image.get_width() #Πλάτος του αντικειμένου.
self.height= image.get_height()#Ύψος του αντικειμένου.
#Μέθοδος που ζωγραφίζει την εικόνα του αντικειμένου
#στην θέση self.pos του κόσμου.
def render(self, screen):
'''Ζωγραφίζει την εικόνα στο screen surface.'''
screen.blit(self.image, self.pos)
#Αντικατάσταση της παλιάς εικόνας με μια άλλη.
#Αυτήν είναι μια επιπλέον μέθοδος. Μπορείς να
#κάνεις ότι θέλεις εσύ είσαι ο προγραμματιστής :p
def set_image(self, new_image):
self.image = new_image #Αποθήκευση νέας εικόνας.
self.width = new_image.get_width() #Δημιουργία νέου πλάτους.
self.height= new_image.get_height() #Δημιουργία νέου ύψους.
Και τώρα δες πως χρησιμοποιώ αυτήν την κλάση που μόλις υλοποίησα για να φτιάξω ένα αντικείμενο
το οποίο κινείτε όλο προς τα δεξιά και δεν σταματάει ποτέ.
import pygame, sys
from pygame.locals import *
from sprite import Sprite
#Αρχικοποίηση του pygame.
pygame.init()
screen = pygame.display.set_mode( (400,400) )
pygame.display.set_caption("Test")
#Φόρτωση εικόνας.
image = pygame.image.load("ball.png").convert()
#Δημιουργία αντικειμένου sprite.
player = Sprite(image)
#---------------Main Loop---------------#
while True:
#Background άσπρο χρώμα.
screen.fill( (255,255,255) )
#-----------Events System-----------#
for event in pygame.event.get():
#έξοδος πατώντας το κουμπί x.
if event.type == QUIT:
pygame.quit()
sys.exit()
#-----------Events System-----------#
#Render player.
player.render(screen)
#---Player Animation---#
#(x,y) συντεταγμένες του παίχτη.
x,y = player.pos
#Αυξάνω το x κατά 50 * (1/1000) pixels.
#Άμα βάλεις σκέτο 50 δεν θα προλάβεις να δεις καν
#την κίνηση επειδή η θέση του παίχτη θα αλλάζει πολύ
#γρήγορα.
x += 50 * (1/1000)
#Kάνω update το position του παίχτη.
player.pos = (x,y)
#---Player Animation---#
#Flip the display.
pygame.display.flip()
#---------------Main Loop---------------#
Τώρα πάμε να δούμε πως μπορούμε να υλοποιήσουμε μια μέθοδο μέσα στην κλάση sprite έτσι ώστε
όταν κάνουμε click το αντικείμενό μας να πηγαίνει προς την κατεύθυνση που "κλικάραμε"
Για να δώσουμε την αίσθηση της κίνησης πρέπει να αλλάζουμε την θέση του αντικειμένου μας
συνέχεια και ομαλά. Πως όμως θα ξέρουμε αν πρέπει να αυξάνουμε ή να μειώνουμε το x ή το y
έτσι ώστε τελικά να φτάσουμε στο σημείο που "κλικάραμε"; Θα πρέπει να ελέγχουμε εάν το
x ή το y του αντικειμένου μας είναι μικρότερο ή μεγαλύτερο από το τις συντεταγμένες του
σημείου που "κλικάραμε" και να τα αυξομειώνουμε ανάλογα μέχρι να γίνουν ίσα.
Ας δούμε πως το κάνουμε σε κώδικα:
Αυτήν την μέθοδο απλός την προσθέτεις στην κλάση sprite.
def mouse_move(self, clicked_pos, speed):
mousex, mousey = clicked_pos
x , y = self.pos
#Εάν οι συντεταγμένες του αντικειμένου μου δεν είναι
#ίσες με του σημείο που "κλίκαρα" τότε συνέχισε να κινείς
#το αντικείμενό μου.
if x != mousex and y != mousey:
#Πρέπει να αυξήσω το x.
if x < mousex:
x += speed * (1/1000)
#Πρέπει να μειώσω το x.
elif x > mousex:
x -= speed * (1/1000)
#Πρέπει να αυξήσω το y.
if y < mousey:
y += speed * (1/1000)
#Πρέπει να μειώσω το y.
elif y > mousey:
y -= speed * (1/1000)
#Κάνω update στην θέση του αντικειμένου μου.
self.pos = (x, y)
Και τώρα δες ένα παράδειγμα που τα χρησιμοποιώ όλα αυτά για να κάνω μια εικόνα να
ακολουθεί το ποντίκι.
import pygame, sys
from pygame.locals import *
from sprite import Sprite
#Αρχικοποίηση του pygame.
pygame.init()
screen = pygame.display.set_mode( (400,400) )
pygame.display.set_caption("Test")
#Φόρτωση εικόνας.
image = pygame.image.load("ball.png").convert()
#Δημιουργία αντικειμένου sprite.
player = Sprite(image)
#---------------Main Loop---------------#
while True:
#Background άσπρο χρώμα.
screen.fill( (255,255,255) )
#-----------Events System-----------#
for event in pygame.event.get():
#έξοδος πατώντας το κουμπί x.
if event.type == QUIT:
pygame.quit()
sys.exit()
#-----------Events System-----------#
#Render player.
player.render(screen)
#---Player Animation---#
#(x,y) συντεταγμένες του ποντικιού.
x,y = pygame.mouse.get_pos()
#Κίνησε τον παίχτη όπου βρίσκεται ο κέρσορας του ποντικιού.
player.mouse_move( (x,y), 50 )
#---Player Animation---#
#Flip the display.
pygame.display.flip()
#---------------Main Loop---------------#
Κατέβασε επίσης αυτό το παράδειγμα από
εδώ για να το
τρέξεις να δεις πως λειτουργεί.
Στην γραμμή
image = pygame.image.load("ball.png").convert()
αντικατέστησε
το string "ball.png" με το path μιας δικής σου εικόνας.
Πάντως για να καταλάβεις όλα αυτά που σε είπα πρέπει να ξέρεις αντικειμενοστραφή προγραμματισμό
διαφορετικά θα τα βρεις σκούρα τα πράματα.