Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. SpriteKit
Code

Membuat Space Invaders dengan Swift dan Sprite Kit: menyelesaikan permainan

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Create Space Invaders with Swift and Sprite Kit.
Create Space Invaders with Swift and Sprite Kit: Implementing Gameplay

Indonesian (Bahasa Indonesia) translation by poipoi (you can also view the original English article)

Final product image
What You'll Be Creating

Dalam bagian sebelumnya dari seri ini, kami membuat para penyerbu yang bergerak, pemain dan penyerbu api peluru, dan dilaksanakan deteksi tabrakan. Dalam keempat dan terakhir bagian dari seri ini, kita akan menambahkan kemampuan untuk memindahkan pemain menggunakan accelerometer, mengelola tingkat dan memastikan dies pemain bila terkena peluru. Mari kita mulai.

1. menyelesaikan kelas pemain

Langkah 1: Menambahkan properti

Menambah properti berikut kelas pemain di bawah canFire properti.

Properti tak terkalahkan akan digunakan untuk membuat pemain sementara tak terkalahkan ketika kehilangan kehidupan. Hidup properti adalah jumlah dari kehidupan pemain memiliki sebelum dibunuh.

Kami menggunakan seorang pengamat properti pada kehidupan properti, yang akan dipanggil setiap kali nilai yang ditentukan. Pengamat didSet disebut segera setelah baru nilai properti diatur. Dengan melakukan ini, setiap kali kita pengurangan properti hidup secara otomatis memeriksa apakah kehidupan kurang dari nol, memanggil metode membunuh jika itu. Jika pemutar memiliki kehidupan yang tersisa, metode respawn dipanggil. Pengamat properti sangat berguna dan dapat menyimpan banyak kode tambahan.

Langkah 2: respawn

Metode respawn membuat pemain yang tak terkalahkan untuk jumlah waktu yang singkat dan memudar pemain masuk dan keluar untuk menunjukkan bahwa itu sementara tak terkalahkan. Pelaksanaan metode respawn terlihat seperti ini:

Kami menetapkan tak terkalahkan untuk benar dan membuat sejumlah SKAction objek. Sekarang, Anda harus akrab dengan bagaimana kelas SKAction bekerja.

Langkah 3: mati

Metode mati cukup sederhana. Memeriksa apakah tak terkalahkan palsu dan, jika itu, usaha variabel kehidupan.

Langkah 4: membunuh

Metode membunuh me-reset invaderNum ke 1 dan membawa pengguna kembali ke StartGameScene sehingga mereka dapat mulai permainan baru.

Kode ini harus akrab bagi Anda karena hal ini hampir identik dengan kode yang kita digunakan untuk pindah ke GameScene dari StartGameScene. Perhatikan bahwa kita memaksa membuka adegan untuk mengakses adegan ukuran dan sifat scaleMode.

Ini melengkapi pemain kelas. Kita sekarang perlu untuk memanggil metode yang mati dan membunuh dalam metode didBeginContact(_:).

Kini kita dapat menguji segalanya. Cara cepat untuk menguji metode mati adalah dengan komentar keluar panggilan moveInvaders dalam metode update(_:). Setelah pemain mati dan respawns tiga kali, Anda harus dibawa kembali ke StartGameScene.

Untuk menguji metode membunuh, pastikan panggilan moveInvaders tidak berkomentar keluar. Set properti invaderSpeed ke nilai yang tinggi, misalnya, 200. Para penyerbu harus mencapai pemain sangat cepat, yang mengakibatkan membunuh instan. Mengubah invaderSpeed kembali ke 2 setelah Anda selesai pengujian.

2. finishing menembakkan penyerbu

Seperti permainan sekarang, hanya baris bawah penyerbu dapat api peluru. Kita sudah memiliki deteksi tabrakan untuk ketika peluru pemain hits penjajah. Dalam langkah ini, kami akan menghapus penyerbu yang terkena peluru dan tambahkan penyerbu satu baris ke array penjajah yang dapat api. Tambahkan baris berikut ke didBeginContact(_:) metode.

Kami telah menghapus NSLog pernyataan dan cek pertama jika contact.bodyA.node?.parent dan contact.bodyB.node.parent tidak nil. Mereka akan menjadi nil jika kita sudah diproses kontak ini. Dalam hal ini, kita kembali dari fungsi.

Kita menghitung invadersPerRow seperti yang kita telah dilakukan sebelumnya dan menetapkan theInvader untuk firstBody.node?, casting untuk Invader. Selanjutnya, kita mendapatkan newInvaderRow dengan mengurangi 1 dan newInvaderColumn, yang tetap sama.

Kami hanya ingin mengaktifkan penyerbu api jika newInvaderRow lebih besar dari atau sama dengan 1, sebaliknya kita akan mencoba untuk mengatur penjajah dalam baris 0 untuk dapat api. Ada tidak ada baris 0 sehingga hal ini akan menyebabkan kesalahan.

Berikutnya, kita menghitung melalui para penyerbu, mencari para penyerbu yang benar baris dan kolom. Setelah itu adalah menemukan, kami menambahkan ke invadersWhoCanFire array dan memanggil stop.memory untuk benar jadi pencacahan akan berhenti awal.

Kita perlu menemukan penyerbu yang dihantam dengan peluru dalam invadersWhoCanFire array sehingga kami dapat menghapusnya. Biasanya, array memiliki beberapa jenis fungsi seperti metode indexOf atau sesuatu yang serupa untuk mencapai hal ini. Pada saat penulisan, ada tidak ada metode untuk array dalam bahasa Swift. Perpustakaan standar Swift mendefinisikan fungsi find yang bisa kita pakai, tapi saya menemukan metode dalam bagian pada obat generik dalam panduan bahasa pemrograman Swift yang akan mencapai apa yang kita butuhkan. Fungsi adalah aptly bernama findIndex. Tambahkan baris berikut ke bagian bawah GameScene.swift.

Jika Anda ingin tahu tentang bagaimana fungsi ini bekerja, maka saya sarankan Anda membaca lebih lanjut tentang obat generik di Swift pemrograman bahasa panduan.

Sekarang bahwa kita memiliki metode yang bisa kita gunakan untuk menemukan penyerbu, kita memanggil, melewati dalam invadersWhoCanFire array dan theInvader. Kami memeriksa jika invaderIndex tidak sama dengan nol dan menghapus penyerbu dari invadersWhoCanFire array menggunakan removeAtIndex(index: Int) metode.

Anda sekarang dapat menguji apakah itu bekerja sebagaimana mestinya. Cara mudah akan komentar di mana panggilan untuk player.die dalam metode didBeginContact(_:). Pastikan Anda menghapus komentar ketika Anda selesai pengujian. Perhatikan bahwa program crash jika Anda membunuh para penyerbu. Kami akan memperbaiki hal ini pada langkah berikutnya.

Aplikasi lumpuh, karena kita memiliki repeatActionForever(_:) SKAction yang menyerukan penyerbu api peluru. Pada titik ini, ada tidak ada penyerbu kiri untuk api peluru sehingga permainan crash. Kita bisa memperbaiki ini dengan memeriksa properti isEmpty pada invadersWhoCanFire array. Jika array kosong, tingkat adalah. Masukkan berikut dalam metode fireInvaderBullet.

Tingkat lengkap, yang berarti kita kenaikan invaderNum, yang digunakan untuk tingkat. Kita juga memanggil levelComplete, yang kita masih perlu untuk membuat dalam langkah-langkah yang datang.

3. menyelesaikan tingkat

Kita perlu memiliki seperangkat jumlah tingkat. Jika tidak, setelah beberapa putaran kita akan memiliki begitu banyak penjajah mereka tidak muat di layar. Menambahkan maxLevels properti untuk GameScene kelas.

Sekarang menambahkan metode levelComplete di bagian bawah GameScene.swift.

Kami pertama-tama memeriksa untuk melihat apakah invaderNum adalah kurang dari atau sama dengan maxLevels yang kami telah menetapkan. Jika demikian, kita transisi ke LevelCompletScene, sebaliknya kita ulang invaderNum ke 1 dan memanggil newGame. LevelCompleteScene tidak ada namun juga tidak metode newGame jadi mari kita mengatasi ini satu pada suatu waktu selama langkah dua.

4. menerapkan kelas LevelCompleteScene

Buat baru kakao Touch kelas bernama LevelCompleteScene yang sublclass dari SKScene. Pelaksanaan kelas seperti ini:

Implementasi sama dengan kelas StartGameScreen, kecuali kita mengatur properti nama startGameButton untuk "nextlevel". Kode ini harus akrab. Jika tidak, kemudian kembali ke bagian pertama dari tutorial ini untuk penyegaran.

5. newGame

Metode newGame hanya transisi kembali ke StartGameScene. Tambahkan baris berikut ke bagian bawah GameScene.swift.

Jika Anda menguji aplikasi, Anda dapat bermain beberapa tingkat atau kehilangan beberapa permainan, tapi pemain telah tidak ada cara untuk bergerak dan ini membuat permainan yang membosankan. Mari kita memperbaikinya pada langkah berikutnya.

6. bergerak pemain menggunakan Accelerometer

Kami akan menggunakan accelerometer untuk memindahkan pemain. Pertama kita perlu mengimpor kerangka CoreMotion. Tambahkan pernyataan impor untuk kerangka di atas GameScene.swift.

Kita juga perlu beberapa properti baru.

Selanjutnya, tambahkan setupAccelerometer metode di bagian bawah GameScene.swift.

Di sini kita mengatur accelerometerUpdateInterval, yang merupakan interval dalam detik untuk menyediakan update ke handler. Saya menemukan karya-karya 0.2 baik, Anda dapat mencoba nilai yang berbeda jika Anda inginkan. Dalam penangan; penutupan, kita mendapatkan accelerometerData.acceleration, yang merupakan sebuah struktur dari jenis CMAcceleration.

Kita hanya tertarik pada properti x dan kita menggunakan tipe numerik konversi untuk dilemparkan ke CGFloat untuk properti accelerationX kami.

Sekarang bahwa kita memiliki properti accelerationX diatur, kita dapat memindahkan pemain. Kami melakukan ini dalam metode didSimulatePhysics. Tambahkan baris berikut ke bagian bawah GameScene.swift.

Memanggil setupAccelerometer di didMoveToView(_:) dan Anda harus mampu bergerak pemain dengan accelerometer. Ada hanya satu masalah. Pemain dapat memindahkan off-layar ke kedua sisi dan dibutuhkan beberapa detik untuk mendapatkan dia kembali. Kita bisa memperbaiki ini dengan menggunakan mesin fisika dan tabrakan. Kita melakukan ini pada langkah berikutnya.

7. membatasi gerakan pemain

Seperti disebutkan di langkah sebelumnya, pemain dapat memindahkan off-layar. Ini adalah memperbaiki sederhana yang menggunakan Sprite Kit fisika mesin. Pertama, tambahkan CollisionCategory baru yang bernama EdgeBody.

Menetapkan ini sebagai pemain collisionBitMask di init metode.

Akhirnya, kami membuat physicsBody pada adegan itu sendiri. Tambahkan baris berikut ke didMoveToView(view: SKView) metode dalam GameScene.swift.

Kami menginisialisasi tubuh fisika dengan menerapkan init(edgeLoopFromRect:), melewati dalam adegan bingkai. Initializer menciptakan tepi loop dari adegan bingkai. Hal ini penting untuk dicatat bahwa tepi tidak memiliki volume atau massa dan selalu diperlakukan seolah-olah properti dinamis sama dengan palsu. Tepi mungkin juga hanya bertabrakan dengan fisika berbasis volume tubuh, yang merupakan pemain kami.

Kami juga mengatur categoryBitMask ke CollisionCategories.EdgeBody. Jika Anda menguji aplikasi, Anda mungkin melihat bahwa kapal Anda tidak lagi dapat memindahkan off-layar, tapi kadang-kadang ia berputar. Ketika tubuh fisika bertabrakan dengan tubuh fisika lain, mungkin bahwa ini hasil dalam rotasi. Ini adalah aktivitas default. Untuk memperbaiki hal ini, kita mengatur allowsRotation menjadi false dalam Player.swift.

8. bintang Field

Langkah 1: Membuat bidang bintang

Permainan memiliki bidang bintang bergerak di latar belakang. Kita dapat membuat bidang mulai menggunakan Sprite Kit partikel mesin.

Buat sebuah file baru dan pilih sumber daya dari bagian iOS. Pilih File partikel SpriteKit sebagai template dan klik berikutnya. Untuk template partikel pilih hujan dan menyimpannya sebagai StarField. Klik buat untuk membuka file di editor. Untuk melihat pilihan, buka Inspektur SKNode pada sebelah kanan.


Alih-alih melalui setiap pengaturan di sini, yang akan mengambil waktu yang lama, itu akan lebih baik untuk membaca dokumentasi untuk belajar tentang setiap pengaturan individu. Aku tidak akan pergi ke detail tentang pengaturan dari bidang mulai baik. Jika Anda tertarik, membuka file dalam Xcode dan lihatlah pengaturan dulu.

Langkah 2: Menambahkan bidang bintang untuk adegan

Tambahkan baris berikut ke didMoveToView(_:) di StartGameScene.swift.

Kami menggunakan SKEmitterNode untuk memuat StarField.sks file, mengatur posisi dan memberikannya zPosition rendah. Alasan untuk zPosition rendah adalah untuk memastikan bahwa hal itu tidak mencegah pengguna menekan tombol start. Sistem partikel menghasilkan ratusan partikel sehingga dengan menetapkan itu benar-benar rendah kita mengatasi masalah. Anda juga harus tahu bahwa Anda dapat secara manual mengkonfigurasi semua sifat-sifat partikel pada SKEmitterNode, meskipun itu jauh lebih mudah untuk menggunakan editor untuk membuat .sks file dan beban pada saat runtime.

Sekarang tambahkan bidang bintang untuk GameScene.swift dan LevelCompleteScene.swift. Kode adalah persis sama seperti di atas.

9. menerapkan kelas PulsatingText

Langkah 1: Buat kelas PulsatingText

StartGameScene dan LevelCompleteScene memiliki teks yang tumbuh dan mengerut berulang kali. Kami akan subclass SKLabeNode dan menggunakan beberapa contoh SKAction untuk mencapai efek ini.

Membuat kakao Touch kelas baru yang subclass dari SKLabelNode, nama itu PulsatingText dan tambahkan kode berikut untuk itu.

Salah satu hal pertama yang Anda mungkin telah memperhatikan adalah bahwa ada tidak ada initializer. Jika Anda subclass tidak mendefinisikan initializer Ruangan Khusus, itu secara otomatis mewarisi semua nya superclass Ruangan Khusus initializers.

Kami memiliki satu setTextFontSizeAndPulsate(theText:theFontSize:) metode, yang melakukan persis apa yang dikatakannya. Ini set SKLabelNode teks dan ukuran tulisan properti dan menciptakan sejumlah contoh SKAction untuk membuat teks skala up dan kemudian kembali turun, menciptakan efek berdenyut.

Langkah 2: Tambahkan PulsatingText ke StartGameScene 

Tambahkan kode berikut untuk StartGameScene.swift di didMoveToView(_:).

Kami menginisialisasi instance PulsatingText, invaderText, dan memanggil setTextFontSizeAndPulsate(theText:theFontSize:) di atasnya. Kami kemudian menetapkan posisi dan menambahkannya ke TKP.

Langkah 3: Tambahkan PulsatingText ke LevelCompleteScene

Tambahkan kode berikut untuk LevelCompleteScene.swift di didMoveToView(_:).

Ini adalah persis sama dengan langkah sebelumnya. Teks hanya kita mengirimkan dalam berbeda.

10. Mengambil permainan lebih lanjut

Ini melengkapi permainan. Saya punya beberapa saran untuk bagaimana Anda dapat lebih lanjut memperluas pada permainan. Di dalam folder gambar, ada tiga berbeda penyerbu gambar. Ketika Anda menambahkan penyerbu ke adegan, secara acak memilih salah satu dari tiga gambar ini. Anda akan perlu untuk memperbarui initializer penyerbu menerima gambar sebagai parameter. Merujuk pada kelas peluru untuk petunjuk.

Ada juga sebuah UFO gambar. Mencoba untuk membuat ini muncul dan bergerak di layar setiap lima belas detik atau lebih. Jika pemain hits itu, memberi mereka kehidupan ekstra. Anda mungkin ingin membatasi jumlah kehidupan mereka dapat memiliki jika Anda melakukan ini. Terakhir, cobalah untuk membuat HUD untuk pemain kehidupan.

Ini adalah hanya beberapa saran. Cobalah dan membuat permainan Anda sendiri.

Kesimpulan

Ini membawa seri ini berakhir. Anda harus memiliki permainan yang menyerupai game Space Invaders asli. Saya harap Anda menemukan tutorial ini bermanfaat dan telah belajar sesuatu yang baru. Terima kasih untuk membaca.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.