Πώς να γράψετε το πρώτο σας παιχνίδι Android στην Java

Συγγραφέας: John Stephens
Ημερομηνία Δημιουργίας: 1 Ιανουάριος 2021
Ημερομηνία Ενημέρωσης: 19 Ενδέχεται 2024
Anonim
Πως παίζεται το Minecraft. Τα βασικά που πρέπει να γνωρίζετε για να αρχίσετε να παίζεται.
Βίντεο: Πως παίζεται το Minecraft. Τα βασικά που πρέπει να γνωρίζετε για να αρχίσετε να παίζεται.

Περιεχόμενο


Υπάρχουν πολλοί τρόποι για να δημιουργήσετε ένα παιχνίδι για Android και ένας σημαντικός τρόπος είναι να το κάνετε από την αρχή στο Android Studio με Java. Αυτό σας δίνει τον μέγιστο έλεγχο για το πώς θέλετε να βλέπει το παιχνίδι σας και να συμπεριφέρεται και η διαδικασία θα σας διδάξει δεξιότητες που μπορείτε να χρησιμοποιήσετε και σε μια σειρά άλλων σεναρίων - είτε δημιουργείτε μια οθόνη εκκίνησης για μια εφαρμογή είτε απλά θέλετε να προσθέστε μερικά κινούμενα σχέδια. Με αυτό το μυαλό, αυτό το σεμινάριο θα σας δείξει πώς να δημιουργήσετε ένα απλό παιχνίδι 2D χρησιμοποιώντας το Android Studio και την Java. Μπορείτε να βρείτε τον κώδικα και τους πόρους στο Github αν θέλετε να ακολουθήσετε.

Εγκαθιστώ

Για να δημιουργήσουμε το παιχνίδι μας, θα πρέπει να ασχοληθούμε με μερικές συγκεκριμένες έννοιες: βρόχους παιχνιδιών, σπειρώματα και καμβά. Αρχικά ξεκινήστε το Android Studio. Εάν δεν το έχετε εγκαταστήσει, ελέγξτε την πλήρη εισαγωγή μας στο Android Studio, το οποίο ξεπερνά τη διαδικασία εγκατάστασης. Τώρα ξεκινήστε ένα νέο έργο και βεβαιωθείτε ότι έχετε επιλέξει το πρότυπο "Empty Activity". Αυτό είναι ένα παιχνίδι, έτσι φυσικά δεν χρειάζεστε στοιχεία όπως το κουμπί FAB που περιπλέκει τα θέματα.


Το πρώτο πράγμα που θέλετε να κάνετε είναι να αλλάξετε AppCompatActivity προς το Δραστηριότητα. Αυτό σημαίνει ότι δεν θα χρησιμοποιήσουμε τα χαρακτηριστικά της γραμμής δράσης.

Ομοίως, θέλουμε επίσης να κάνουμε το παιχνίδι μας πλήρη οθόνη. Προσθέστε τον ακόλουθο κώδικα στο onCreate () πριν από την κλήση στο setContentView ():

getWindow (). setFlags (WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN). this.requestWindowFeature (Window.FEATURE_NO_TITLE).

Σημειώστε ότι αν γράψετε κάποιο κωδικό και υπογραμμιστεί με κόκκινο χρώμα, αυτό πιθανώς σημαίνει ότι πρέπει να εισαγάγετε μια τάξη. Με άλλα λόγια, θα πρέπει να πείτε στο Android Studio ότι θέλετε να χρησιμοποιήσετε συγκεκριμένες δηλώσεις και να τις θέσετε στη διάθεσή σας. Εάν απλά πατήσετε οπουδήποτε στην υπογραμμισμένη λέξη και στη συνέχεια πατήσετε Alt + Enter, τότε αυτό θα γίνει αυτόματα για εσάς!


Δημιουργία της προβολής του παιχνιδιού σας

Μπορεί να χρησιμοποιείτε εφαρμογές που χρησιμοποιούν δέσμη ενεργειών XML για να καθορίσετε τη διάταξη των προβολών όπως κουμπιά, εικόνες και ετικέτες. Αυτή είναι η γραμμή setContentView κάνει για μας.

Αλλά και πάλι, αυτό είναι ένα παιχνίδι που σημαίνει ότι δεν χρειάζεται να έχουν παράθυρα του προγράμματος περιήγησης ή να μετακινηθούν οι ανακυκλωτικές προβολές. Αντί αυτού, θέλουμε να δείξουμε έναν καμβά αντί. Στο Android Studio ένας καμβάς είναι ακριβώς ο ίδιος όπως και στην τέχνη: είναι ένα μέσο που μπορούμε να αντλήσουμε.

Έτσι αλλάξτε αυτή τη γραμμή για να διαβάσετε ως εξής:

setContentView (νέο GameView (αυτό))

Θα διαπιστώσετε ότι αυτό για άλλη μια φορά υπογραμμίζεται κόκκινο. Αλλά τώρα αν πατήσετε Alt + Enter, δεν έχετε την επιλογή εισαγωγής της κλάσης. Αντ 'αυτού, έχετε την επιλογή να δημιουργώ μια τάξη. Με άλλα λόγια, πρόκειται να φτιάξουμε τη δική μας τάξη που θα καθορίσει τι θα ακολουθήσει στον καμβά. Αυτό είναι που θα μας επιτρέψει να ζωγραφίζουμε στην οθόνη, αντί να δείχνουμε μόνο έτοιμες απόψεις.

Έτσι κάντε δεξί κλικ στο όνομα του πακέτου στην ιεραρχία σας στα αριστερά και επιλέξτε Νέα> Κλάση. Θα εμφανιστεί τώρα ένα παράθυρο για να δημιουργήσετε την τάξη σας και θα την ονομάσετε GameView. Κάτω από το SuperClass, γράψτε: android.view.SurfaceView πράγμα που σημαίνει ότι η τάξη θα κληρονομήσει μεθόδους - τις δυνατότητές της - από την SurfaceView.

Στο πλαίσιο Διεπαφής (Interfaces), θα γράψετε android.view.SurfaceHolder.Callback. Όπως και με οποιαδήποτε κατηγορία, τώρα πρέπει να δημιουργήσουμε τον κατασκευαστή μας. Χρησιμοποιήστε αυτόν τον κωδικό:

ιδιωτικό νήμα MainThread; δημόσιο GameView (πλαίσιο περιεχομένου) {super (context); getHolder () addCallback (αυτό). }}

Κάθε φορά που η τάξη μας καλείται να κάνει ένα νέο αντικείμενο (στην περίπτωση αυτή την επιφάνεια μας), θα τρέξει τον κατασκευαστή και θα δημιουργήσει μια νέα επιφάνεια. Η γραμμή 'super' καλεί την υπερκλάση και στην περίπτωσή μας, αυτή είναι η SurfaceView.

Με την προσθήκη Callback, μπορούμε να παρακολουθήσουμε τα γεγονότα.

Τώρα αντικαταστήστε μερικές μεθόδους:

@Override δημόσια κενή επιφάνειαChanged (Holder SurfaceHolder, int format, int width, int ύψος) {} @Override δημόσιο κενό surfaceCreated (Holder SurfaceHolder) {} @Override δημόσιο κενό επιφάνειαDestroyed (Holder SurfaceHolder) {}

Αυτά βασικά μας επιτρέπουν να παρακάμψουμε (εξ ου και το όνομα) τις μεθόδους στην υπερκλάση (SurfaceView). Τώρα δεν θα πρέπει να υπογραμμίζετε κόκκινο στον κωδικό σας. Ομορφη.

Μόλις δημιουργήσατε μια νέα τάξη και κάθε φορά που αναφερόμαστε σε αυτό, θα χτίσει τον καμβά για να βάψετε το παιχνίδι σας. Μαθήματα δημιουργώ αντικείμενα και χρειαζόμαστε ένα ακόμα.

Δημιουργία νημάτων

Η νέα μας τάξη πρόκειται να ονομαστεί MainThread. Και η δουλειά του θα είναι να δημιουργήσει ένα νήμα. Ένα νήμα είναι ουσιαστικά σαν ένα παράλληλο πιρούνι του κώδικα που μπορεί να τρέξει ταυτόχρονα μαζί με το κύριος μέρος του κώδικα σας. Μπορείτε να έχετε πολλά threads που τρέχουν ταυτόχρονα, επιτρέποντας έτσι τα πράγματα να συμβαίνουν ταυτόχρονα και όχι να ακολουθούν μια αυστηρή ακολουθία. Αυτό είναι σημαντικό για ένα παιχνίδι, γιατί πρέπει να σιγουρευτούμε ότι συνεχίζει να τρέχει ομαλά, ακόμα και όταν συμβαίνει πολλά.

Δημιουργήστε τη νέα τάξη σας όπως ακριβώς κάνατε και αυτή τη φορά πρόκειται να επεκταθεί Νήμα. Στον κατασκευαστή απλά θα καλέσουμε σούπερ(). Θυμηθείτε, αυτή είναι η σούπερ τάξη, η οποία είναι η Νήμα και η οποία μπορεί να κάνει όλη τη βαριά ανύψωση για εμάς. Αυτό είναι σαν να δημιουργείτε ένα πρόγραμμα για να πλύνετε τα πιάτα που μόλις καλούν πλυντήριο().

Όταν αυτή η κλάση ονομάζεται, πρόκειται να δημιουργήσει ένα ξεχωριστό νήμα που τρέχει ως παρακλάδι του κύριου αντικειμένου. Και είναι από εδώ ότι θέλουμε να δημιουργήσουμε το GameView μας. Αυτό σημαίνει ότι πρέπει επίσης να αναφέρουμε την κλάση GameView και επίσης χρησιμοποιούμε το SurfaceHolder το οποίο περιέχει τον καμβά. Έτσι εάν ο καμβάς είναι η επιφάνεια, το SurfaceHolder είναι το καβαλέτο. Και το GameView είναι αυτό που τα βάζει όλα μαζί.

Το πλήρες πράγμα θα πρέπει να μοιάζει έτσι:

η δημόσια τάξη MainThread επεκτείνει το νήμα {private SurfaceHolder surfaceHolder; ιδιωτικό GameView gameView; το δημόσιο MainThread (SurfaceHolder surfaceHolder, GameView gameView) {super (); this.surfaceHolder = surfaceHolder; this.gameView = gameView; }}

Schweet. Έχουμε τώρα ένα GameView και ένα νήμα!

Δημιουργία του βρόχου παιχνιδιών

Τώρα έχουμε τις πρώτες ύλες που πρέπει να κάνουμε το παιχνίδι μας, αλλά τίποτα δεν συμβαίνει. Αυτό είναι όπου βγαίνει ο βρόχος του παιχνιδιού. Βασικά, αυτός είναι ένας βρόχος κώδικα που πηγαίνει γύρω και γύρω και ελέγχει εισροές και μεταβλητές πριν από την σχεδίαση της οθόνης. Στόχος μας είναι να το κάνουμε αυτό όσο το δυνατόν πιο συνεπές, έτσι ώστε να μην υπάρχουν τραυματισμοί ή λόγχες στο καρέ, κάτι που θα εξερευνήσω αργότερα.

Προς το παρόν, είμαστε ακόμα στο MainThread και θα ξεπεράσουμε μια μέθοδο από την υπερκλάση. Αυτό είναι τρέξιμο.

Και πηγαίνει λίγο κάτι τέτοιο:

@Override δημόσιο κενό εκτέλεσης () {while (τρέχει) {canvas = null; δοκιμάστε {canvas = this.surfaceHolder.lockCanvas (); συγχρονισμένο (surfaceHolder) {this.gameView.update (); this.gameView.draw (καμβάς); }} αλίευση (Εξαίρεση e) {} τελικά {if (canvas! = null) {try {surfaceHolder.unlockCanvasAndPost (καμβάς); } αλίευση (Εξαίρεση e) {e.printStackTrace (); }}}}}}

Θα δείτε πολλά υπογράμμιση, οπότε πρέπει να προσθέσουμε κάποιες άλλες μεταβλητές και αναφορές. Επιστρέψτε στην κορυφή και προσθέστε:

ιδιωτική SurfaceHolder surfaceHolder; ιδιωτικό GameView gameView; ιδιωτική λειτουργία boolean; δημόσιο στατικό καμβά καμβά?

Θυμηθείτε να εισαγάγετε καμβά. Ο καμβάς είναι το πράγμα που πραγματικά θα αντλήσουμε. Όσον αφορά το «lockCanvas», αυτό είναι σημαντικό επειδή είναι αυτό που ουσιαστικά παγώνει τον καμβά για να μας επιτρέψει να αντλήσουμε από αυτό. Αυτό είναι σημαντικό γιατί, διαφορετικά, θα μπορούσατε να έχετε πολλαπλά θέματα που προσπαθούν να αντλήσουν από αυτό αμέσως. Απλά ξέρετε ότι για να επεξεργαστείτε τον καμβά, πρέπει πρώτα κλειδαριά τον καμβά.

Η ενημέρωση είναι μια μέθοδος που θα δημιουργήσουμε και εδώ θα γίνουν τα πράγματα διασκέδασης αργότερα.

ο προσπαθήστε και σύλληψη Εν τω μεταξύ, είναι απλά απαιτήσεις της Java που δείχνουν ότι είμαστε πρόθυμοι να δοκιμάσουμε και να χειριστούμε εξαιρέσεις (σφάλματα) που μπορεί να συμβούν αν ο καμβάς δεν είναι έτοιμος κλπ.

Τέλος, θέλουμε να μπορέσουμε να ξεκινήσουμε το νήμα μας όταν το χρειαζόμαστε. Για να γίνει αυτό, θα χρειαστούμε μια άλλη μέθοδο εδώ που μας επιτρέπει να θέτουμε τα πράγματα σε κίνηση. Αυτό είναι το τρέξιμο η μεταβλητή είναι για (σημειώστε ότι ένα Boolean είναι ένας τύπος μεταβλητής που είναι πάντα αληθής ή ψευδής). Προσθέστε αυτή τη μέθοδο στο MainThread τάξη:

δημόσιο κενό setRunning (boolean isRunning) {running = isRunning; }}

Αλλά σε αυτό το σημείο, ένα πράγμα πρέπει να τονιστεί ακόμα και αυτό είναι εκσυγχρονίζω. Αυτό συμβαίνει επειδή δεν έχουμε δημιουργήσει ακόμα τη μέθοδο ενημέρωσης. Γυρίστε πάλι πίσω GameView και τώρα προσθέστε τη μέθοδο.

δημόσια άκυρη ενημέρωση () {}

Πρέπει επίσης αρχή το νήμα! Θα κάνουμε αυτό στο δικό μας surfaceCreated μέθοδος:

@Override δημόσια κενό surfaceCreated (Holder SurfaceHolder) {thread.setRunning (αληθινό); thread.start (); }}

Πρέπει επίσης να σταματήσουμε το νήμα όταν καταστραφεί η επιφάνεια. Όπως ίσως έχετε μαντέψει, χειριζόμαστε αυτό στο surfaceDestroyed μέθοδος. Αλλά βλέποντας ότι μπορεί να κάνει πολλές προσπάθειες για να σταματήσει ένα νήμα, πρόκειται να το βάλουμε σε ένα βρόχο και να το χρησιμοποιήσουμε προσπαθήστε και σύλληψη πάλι. Σαν:

@Override δημόσιο κενό surfaceDestroyed (κάτοχος SurfaceHolder) {boolean retry = true; ενώ (δοκιμάστε ξανά) {δοκιμάστε {thread.setRunning (false); thread.join (); } αλίευση (InterruptedException e) {e.printStackTrace (); } retry = false; }}

Και τελικά, επικεφαλίστε μέχρι τον κατασκευαστή και βεβαιωθείτε ότι έχετε δημιουργήσει τη νέα εμφάνιση του νήματος σας, αλλιώς θα πάρετε την επίφοβη εξαίρεση μηδενικού δείκτη! Και έπειτα θα κάνουμε το GameView εστιασμένο, που σημαίνει ότι μπορεί να χειριστεί τα γεγονότα.

νήμα = νέο MainThread (getHolder (), αυτό); setFocusable (true);

Τώρα μπορείς τελικά δοκιμάστε πραγματικά αυτό το πράγμα! Αυτό είναι σωστό, κάντε κλικ στο τρέξιμο και αυτό πρέπει στην πραγματικότητα τρέχει χωρίς λάθη. Προετοιμαστείτε να απομακρυνθείτε!

Είναι ... είναι ... μια κενή οθόνη! Όλο τον κώδικα. Για κενή οθόνη. Αλλά, αυτή είναι μια κενή οθόνη ευκαιρία. Έχετε την επιφάνεια σας σε λειτουργία με ένα βρόχο παιχνιδιού για να χειριστείτε τα γεγονότα. Τώρα το μόνο που έχει απομείνει είναι να συμβεί κάτι. Δεν έχει σημασία ακόμη και αν δεν ακολουθήσατε τα πάντα στον οδηγό μέχρι αυτό το σημείο. Το σημείο είναι, μπορείτε απλά να ανακυκλώσετε αυτόν τον κώδικα για να αρχίσετε να κάνετε λαμπρά παιχνίδια!

Κάνοντας γραφικά

Σωστά, τώρα έχουμε μια κενή οθόνη για να αντλήσουμε, το μόνο που πρέπει να κάνουμε είναι να αντλήσουμε από αυτό. Ευτυχώς, αυτό είναι το απλό κομμάτι. Το μόνο που χρειάζεται να κάνετε είναι να αντικαταστήσετε τη μέθοδο ισοπαλίας GameView και στη συνέχεια προσθέστε μερικές όμορφες εικόνες:

@Override δημόσιο κενό κλήρωση (Canvas καμβά) {super.draw (καμβάς)? αν (καμβάς! = null) {canvas.drawColor (Color.WHITE); Βαφή χρώματος = νέα Paint (); paint.setColor (Color.rgb (250, 0, 0)). canvas.drawRect (100, 100, 200, 200, χρώμα). }}

Εκτελέστε αυτό και τώρα θα πρέπει να έχετε ένα όμορφο κόκκινο τετράγωνο στην πάνω αριστερή γωνία μιας αλλιώς λευκής οθόνης. Αυτό είναι σίγουρα μια βελτίωση.

Θα μπορούσατε να δημιουργήσετε θεωρητικά λίγο περισσότερο ολόκληρο το παιχνίδι σας με το να το κολλήσετε μέσα σε αυτή τη μέθοδο (και υπερισχύει onTouchEvent για να χειριστεί την είσοδο), αλλά αυτό δεν θα ήταν ένας τρομερά καλός τρόπος για να πάτε για πράγματα. Η τοποθέτηση νέου χρώματος μέσα στον βρόχο μας θα επιβραδύνει σημαντικά τα πράγματα και ακόμα κι αν το βάλουμε αυτό αλλού, προσθέτοντας πάρα πολύ κώδικα στο σχεδιάζω η μέθοδος θα ήταν άσχημη και δύσκολη να ακολουθηθεί.

Αντίθετα, κάνει πολύ πιο νόημα να χειρίζεστε αντικείμενα παιχνιδιού με τις δικές τους κλάσεις. Θα ξεκινήσουμε με ένα που δείχνει έναν χαρακτήρα και αυτή η τάξη θα κληθεί CharacterSprite. Πήγαινε και κάνε αυτό.

Αυτή η τάξη πρόκειται να σχεδιάσει ένα sprite στον καμβά και θα μοιάζει έτσι

δημόσια class CharacterSprite {ιδιωτική εικόνα bitmap? δημόσιο CharacterSprite (bitmap bmp) {image = bmp; } Δημόσια κενή κλήρωση (καμβάς καμβά) {canvas.drawBitmap (εικόνα, 100, 100, null); }}

Τώρα για να χρησιμοποιήσετε αυτό, θα χρειαστεί πρώτα να φορτώσετε το bitmap και στη συνέχεια να καλέσετε την κλάση από GameView. Προσθέστε μια αναφορά στο ιδιωτικό CharacterSprite characterSprite και στη συνέχεια στο surfaceCreated , προσθέστε τη γραμμή:

characterSprite = new CharacterSprite (BitmapFactory.decodeResource (getResources (), R.drawable.avdgreen)).

Όπως μπορείτε να δείτε, το bitmap που φορτώνουμε αποθηκεύεται σε πόρους και ονομάζεται avdgreen (ήταν από προηγούμενο παιχνίδι). Τώρα το μόνο που χρειάζεται να κάνετε είναι να μεταβιβάσετε αυτό το bitmap στη νέα κλάση στο σχεδιάζω μέθοδος με:

characterSprite.draw (καμβάς);

Τώρα κάντε κλικ στο κουμπί Run και θα πρέπει να δείτε το γραφικό σας να εμφανίζεται στην οθόνη σας! Αυτό είναι BeeBoo. Τον συνήθιζα να τον ζωγραφίζω στα σχολικά μου εγχειρίδια.

Τι κι αν θέλαμε να κάνουμε αυτό το μικρό παιδί να κινηθεί; Απλή: δημιουργούμε μόνο μεταβλητές x και y για τις θέσεις του και στη συνέχεια αλλάζουμε αυτές τις τιμές σε μια εκσυγχρονίζω μέθοδος.

Προσθέστε λοιπόν τις αναφορές στο δικό σας CharacterSprite και στη συνέχεια να σχεδιάσετε το bitmap σας στο x, y. Δημιουργήστε τη μέθοδο ενημέρωσης εδώ και τώρα θα προσπαθήσουμε απλά:

y ++;

Κάθε φορά που τρέχει ο βρόχος παιχνιδιών, θα μετακινήσουμε τον χαρακτήρα κάτω από την οθόνη. Θυμάμαι, y οι συντεταγμένες μετρώνται από την κορυφή έτσι 0 είναι η κορυφή της οθόνης. Φυσικά πρέπει να καλέσουμε το εκσυγχρονίζω στη μέθοδο CharacterSprite από το εκσυγχρονίζω στη μέθοδο GameView.

Πατήστε επανειλημμένα την αναπαραγωγή και τώρα θα δείτε ότι η εικόνα σας παρακολουθεί σιγά σιγά την οθόνη. Δεν κερδίζουμε ακόμα κανένα βραβείο παιχνιδιού, αλλά είναι ξεκίνημα!

Εντάξει, να κάνεις τα πράγματα ελαφρώς πιο ενδιαφέρουσα, είμαι απλά να ρίξω έναν κώδικα 'bouncy ball' εδώ. Αυτό θα κάνει την γραφική αναπήδησή μας γύρω από την οθόνη από τις άκρες, όπως τα παλιά προφύλαξη οθόνης των Windows. Ξέρετε, τα περίεργα υπνωτικά.

δημόσια άκυρη ενημέρωση () {x + = xVelocity; y + = yVelocity; αν ((x> screenWidth - image.getWidth ()) || (x <0)) {xVelocity = xVelocity * -1; } αν ((y> screenHeight - image.getHeight ()) || (y <0)) {yVelocity = yVelocity * -1; }}

Θα πρέπει επίσης να ορίσετε αυτές τις μεταβλητές:

ιδιωτική int xVelocity = 10; ιδιωτική int yVelocity = 5; ιδιωτική int screenWidth = Resources.getSystem (). getDisplayMetrics () widthPixels; ιδιωτική int screenHeight = Resources.getSystem (). getDisplayMetrics () heightPixels;

Βελτιστοποίηση

Υπάρχει αφθονία περισσότερα για να βυθιστείτε εδώ, από το χειρισμό της εισόδου του παίκτη, έως την κλιμάκωση των εικόνων, τη διαχείριση των πολλών χαρακτήρων που κινούνται γύρω από την οθόνη ταυτόχρονα. Αυτή τη στιγμή, ο χαρακτήρας αναπηδά, αλλά αν κοιτάξετε πολύ προσεκτικά, υπάρχει ελαφρά τραύλισμα. Δεν είναι τρομερό αλλά το γεγονός ότι το βλέπετε με γυμνό μάτι είναι κάτι σαν προειδοποιητικό σημάδι. Η ταχύτητα ποικίλει επίσης πολύ στον εξομοιωτή σε σύγκριση με μια φυσική συσκευή. Τώρα φανταστείτε τι συμβαίνει όταν έχετε τόνους συνεχίζεται αμέσως στην οθόνη!

Υπάρχουν κάποιες λύσεις σε αυτό το πρόβλημα. Αυτό που θέλω να κάνω για να ξεκινήσω, είναι να δημιουργήσω ένα ιδιωτικό ακέραιο στο MainThread και καλέστε αυτό targetFPS. Αυτό θα έχει αξία 60.Πάω να προσπαθήσω να παίξω το παιχνίδι μου για να τρέξω με αυτή την ταχύτητα και εν τω μεταξύ, θα ελέγξω για να διασφαλίσω ότι είναι. Για αυτό, θέλω επίσης ένα ιδιωτικό διπλό καλείται averageFPS.

Θα ενημερώσω επίσης τρέξιμο για να μετρήσετε πόσο καιρό παίρνει κάθε βρόχος παιχνιδιών και μετά παύση αυτόν τον βρόχο παιχνιδιών προσωρινά αν είναι μπροστά από το targetFPS. Τότε θα υπολογίσουμε πόσο καιρό τώρα πήρε και στη συνέχεια να εκτυπώσει έτσι ώστε να μπορούμε να το δούμε στο ημερολόγιο.

@Override δημόσιο κενό εκτέλεσης () {long startTime; long timeMillis; long waitTime; συνολικός χρόνος = 0; int frameCount = 0; long targetTime = 1000 / targetFPS. ενώ (τρέξιμο) {startTime = System.nanoTime (); canvas = null; δοκιμάστε {canvas = this.surfaceHolder.lockCanvas (); συγχρονισμένο (surfaceHolder) {this.gameView.update (); this.gameView.draw (καμβάς); }} αλίευση (Εξαίρεση e) {} τελικά {if (canvas! = null) {try {surfaceHolder.unlockCanvasAndPost (καμβάς); } αλίευση (Εξαίρεση e) {e.printStackTrace (); }}} timeMillis = (System.nanoTime () - startTime) / 1000000; waitTime = targetTime - timeMillis; δοκιμάστε {this.sleep (waitTime); } αλίευση (Εξαίρεση e) {} totalTime + = System.nanoTime () - startTime; frameCount ++; αν (frameCount == targetFPS) {averageFPS = 1000 / ((συνολικό χρόνο / frameCount) / 1000000). frameCount = 0; totalTime = 0; System.out.println (μέση τιμή FPS); }}}

Τώρα το παιχνίδι προσπαθεί να κλειδώσει το FPS σε 60 και θα πρέπει να διαπιστώσετε ότι μετρά γενικά ένα αρκετά σταθερό 58-62 FPS σε μια σύγχρονη συσκευή. Ωστόσο, στον εξομοιωτή μπορεί να έχετε ένα διαφορετικό αποτέλεσμα.

Δοκιμάστε να αλλάξετε τα 60 με 30 και να δείτε τι συμβαίνει. Το παιχνίδι επιβραδύνει και αυτό πρέπει τώρα διαβάσετε 30 στο logcat σας.

Κλείσιμο Σκέψεις

Υπάρχουν και άλλα πράγματα που μπορούμε να κάνουμε για να βελτιστοποιήσουμε την απόδοση. Υπάρχει μια μεγάλη θέση blog σχετικά με το θέμα εδώ. Προσπαθήστε να αποφύγετε να δημιουργείτε νέες εμφανίσεις χρωμάτων ή bitmaps μέσα στον βρόχο και να κάνετε όλες τις προετοιμασίες εξω απο πριν αρχίσει το παιχνίδι.

Αν σχεδιάζετε να δημιουργήσετε το επόμενο χτύπημα του Android παιχνιδιού τότε υπάρχουν σίγουρα ευκολότερους και πιο αποτελεσματικούς τρόπους για να το κάνουμε αυτές τις μέρες. Αλλά υπάρχουν σίγουρα ακόμα σενάρια χρήσης για να μπορέσετε να σχεδιάσετε σε έναν καμβά και είναι μια πολύ χρήσιμη ικανότητα να προσθέσετε στο ρεπερτόριό σας. Ελπίζω ότι αυτός ο οδηγός βοήθησε κάπως και σας εύχομαι την καλύτερη τύχη στις επερχόμενες επιχειρήσεις κωδικοποίησης!

ΕπόμενοΈνας οδηγός για αρχάριους στην Java

Το σύστημα ακουστικών Paww Waveound 3 κανονικά πωλεί για $149.99, αλλά για ένα περιορισμένο χρονικό διάστημα, μπορείτε να τους χαλάσετε για 46 τοις εκατό μακριά. Αυτό σημαίνει ότι για λιγότερο από 80 ...

Ξεκινώντας από $ 799, το Pixel 3 είναι μια ακριβή συσκευή που προφανώς θέλετε να διατηρήσετε σε μια παρθένα κατάσταση όσο το δυνατόν περισσότερο. Ένα προστατευτικό οθόνης είναι ένας πολύ καλός τρόπος ...

Ενδιαφέρον Σήμερα