Το πρώτο μας παιχνίδι: ένα κυκλάκι θα κινείται μέσα στο παράθυρο. Όταν ο παίκτης προλαβαίνει να κάνει click με το ποντίκι πάνω του, τότε το σκορ του παίκτη ανεβαίνει αλλά και το κυκλάκι κινείται πιο γρήγορα. Όταν ο παίκτης κάνει click με το ποντίκι στον κενό χώρο, τότε χάνει μία ζωή. Αρχικά ο παίκτης έχει 5 ζωές.
ΒΗΜΑ 1ο: Ενα κυκλάκι που θα κινείται στον οριζόντιο άξονα
Οι μεταβλητές x, y θα δειχνουν την θέση της μπάλας: που βρίσκεται το κέντρο της.
H λέξη float σημαίνει πραγματικός αριθμός.
H μεταβλητή dir δείχνει την κατεύθυνση της μπάλας: αν είναι θετική η μπάλα κινείται προς τα δεξιά. Αν είναι αρνητική, η μπάλα κινείται προς τα αριστερά.
float x = 300;
float y = 300;
float dir = 2;
void setup()
{
size(600, 600); // ορίζουμε το μέγεθος του παραθύρου
}
void draw()
{
background(.......); // Επιλέξτε χρώμα για το φόντο
fill(............); // Επιλέξτε χρώμα για τη μπάλα
ellipse(x, y, 60, 60); // Το κέντρο της μπάλας είναι στη θέση (x,y)
// και η διάμετρός της είναι 60 pixel
x = x + dir; // Υπολογισμός της επόμενης θέσης της μπάλας στον οριζόντιο άξονα
if (x >= 540) // έλεγχος αν η μπάλα ακούμπησε στο δεξί άκρο του παραθύρου
{
dir = -2;
}
if (..........) // έλεγχος αν η μπάλα ακούμπησε στο αριστερό άκρο του παραθύρου
{
dir = 2;
}
} // εδώ κλείνει η draw
ΒΗΜΑ 2ο: Εμφάνιση στοιχείων του παίκτη (σκορ κ ζωές)
Οι μεταβλητές δηλώνονται στην αρχή του προγράμματος.
int score = 0;
int lives = 5;
Μέσα στην draw() προσθέτουμε εντολές για να εμφανίζονται οι πληροφορίες στο παράθυρο.
textSize(18);
fill(255); // χρώμα κειμένου άσπρο, μπορείτε να το αλλάξετε
text("SCORE: " + score, 10, 30); // το κείμενο θα εμφανιστεί στη θέση (10, 30) δηλ. πάνω αριστερά
text("LIVES: " + lives, 410, 30); // το κείμενο θα εμφανιστεί στη θέση (410, 30) δηλ. πάνω δεξιά
ΒΗΜΑ 3ο: Όταν ο παίκτης πετυχαίνει τη μπάλα, να κερδίζει σκορ
Η εντολή για να αυξηθεί το σκορ είναι:
score = score + 1;
Η εντολή αυτή όμως θα πρέπει να εκτελείται μόνο όταν ο παίκτης πετυχαίνει τη μπάλα.
Γνωρίζουμε ότι ο παίκτης πέτυχε τη μπάλα, όταν η θέση του ποντικιού είναι μέσα στον κύκλο.
Όταν δηλαδή η απόσταση της θέσης του ποντικιού (mouseX, mouseY) από το κέντρο του κύκλου (x, y) είναι μικρότερη από την ακτίνα του κύκλου.
Η εντολή dist() μας δίνει την απόσταση ανάμεσα σε δύο σημεία.
Αυτός ο έλεγχος δεν θα μπει μέσα στη draw(), αλλά στο event mousePressed() ή στο mouseReleased().
Τα events γράφονται μετά τη draw().
void mousePressed()
{
if (dist(mouseX, mouseY, x, y) < 30) // αν ο παίκτης πέτυχε το μπάλα
{
....... // να αυξάνεται το σκορ του παίκτη
}
}
ΒΗΜΑ 4ο: Όταν ο παίκτης πετυχαίνει τη μπάλα, η ταχύτητα της μπάλας να αυξάνεται
Χρειαζόμαστε μία καινούργια μεταβλητή: speed και την δηλώνουμε στην αρχή του προγράμματος.
float speed = 1; // είναι πραγματικό αριθμός (float) και έχει αρχική τιμή 1
Η εντολή για την αύξηση της ταχύτητας είναι
speed = speed + 1;
Σε ποιό σημείο του προγράμματος θα προστεθεί;
ΒΗΜΑ 5ο: Όταν ο παίκτης δεν πετυχαίνει τη μπάλα, χάνει μία ζωή
Την μεταβλητή lives την έχουμε ήδη. Η εντολή για την μείωση είναι
lives = lives - 1;
Σε ποιό σημείο του προγράμματος θα προστεθεί;
void mousePressed()
{
if (dist(mouseX, mouseY, x, y) < 30)
{
....... // εντολές που θα γίνουν όταν ο παίκτης πετύχει τη μπάλα
}
else
{
..... // εντολές που θα γίνουν όταν ο παίκτης δεν πετύχει τη μπάλα
}
}
ΒΗΜΑ 6ο: Game Over!
Η εντολή για να σταματήσει το πρόγραμμα είναι η noLoop(). Η εντολή αυτή θα μπει μέσα στη draw() και μέσα σε έλεγχο της μεταβλητής lives.
if (lives == 0)
{
textSize(30);
text("GAME OVER!", 200, 250);
noLoop();
}
Είναι πολύ χρήσιμο (όπως θα φανεί πιο κάτω), να έχουμε μία μεταβλητή που να θυμάται αν ο παίκτης έχασε: να είναι true όταν έχασε και false όταν δεν έχει χάσει.
Δηλώνουμε τη μεταβλητή στην αρχή του προγράμματος
boolean lost = false;
Σε ποιό σημείο θα βάλουμε την εντολή αλλαγής σε true;
lost = true;
ΒΗΜΑ 7ο: Restart!
Ας υποθέσουμε ότι θέλουμε να γίνεται restart με απλό πάτημα του ποντικιού.
Μέχρι τώρα μέσα στο mousePressed() έχουμε εντολές για το κανονικό παιχνίδι, για το score, την ταχύτητα και τις ζωές του παίκτη. Αυτές οι εντολές θέλουμε να συνεχίσουν να γίνονται, όμως εφόσον ο παίκτης δεν έχει χάσει.
Αν ο παίκτης έχει χάσει και κάνει κλικ με το ποντίκι, θέλουμε απλώς να γίνεται restart.
Άρα αλλάζει λίγο η δομή του mousePressed()
void mousePressed()
{
if (lost == false)
{
if (dist(mouseX, mouseY, x, y) < 30)
{
....... // εντολές που θα γίνουν όταν ο παίκτης πετύχει τη μπάλα
}
else
{
..... // εντολές που θα γίνουν όταν ο παίκτης δεν πετύχει τη μπάλα
}
}
else
{
loop(); // για να αρχίσει πάλι το παιχνίδι
}
}
Παρατηρείτε κάτι παράξενο;