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



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.
1 |
private var invincible = false |
2 |
private var lives:Int = 3 { |
3 |
didSet { |
4 |
if(lives < 0){ |
5 |
kill() |
6 |
}else{ |
7 |
respawn() |
8 |
}
|
9 |
}
|
10 |
}
|
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:
1 |
func respawn(){ |
2 |
invincible = true |
3 |
let fadeOutAction = SKAction.fadeOutWithDuration(0.4) |
4 |
let fadeInAction = SKAction.fadeInWithDuration(0.4) |
5 |
let fadeOutIn = SKAction.sequence([fadeOutAction,fadeInAction]) |
6 |
let fadeOutInAction = SKAction.repeatAction(fadeOutIn, count: 5) |
7 |
let setInvicibleFalse = SKAction.runBlock(){ |
8 |
self.invincible = false |
9 |
}
|
10 |
runAction(SKAction.sequence([fadeOutInAction,setInvicibleFalse])) |
11 |
|
12 |
}
|
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
.
1 |
func die (){ |
2 |
if(invincible == false){ |
3 |
lives -= 1 |
4 |
}
|
5 |
}
|
Langkah 4: membunuh
Metode membunuh
me-reset invaderNum
ke 1 dan membawa pengguna kembali ke StartGameScene sehingga mereka dapat mulai permainan baru.
1 |
func kill(){ |
2 |
invaderNum = 1 |
3 |
let gameOverScene = StartGameScene(size: self.scene!.size) |
4 |
gameOverScene.scaleMode = self.scene!.scaleMode |
5 |
let transitionType = SKTransition.flipHorizontalWithDuration(0.5) |
6 |
self.scene!.view!.presentScene(gameOverScene,transition: transitionType) |
7 |
}
|
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(_:).
1 |
func didBeginContact(contact: SKPhysicsContact) { |
2 |
...
|
3 |
if ((firstBody.categoryBitMask & CollisionCategories.Player != 0) && |
4 |
(secondBody.categoryBitMask & CollisionCategories.InvaderBullet != 0)) { |
5 |
player.die() |
6 |
}
|
7 |
|
8 |
if ((firstBody.categoryBitMask & CollisionCategories.Invader != 0) && |
9 |
(secondBody.categoryBitMask & CollisionCategories.Player != 0)) { |
10 |
player.kill() |
11 |
}
|
12 |
|
13 |
}
|
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.
1 |
func didBeginContact(contact: SKPhysicsContact) { |
2 |
...
|
3 |
if ((firstBody.categoryBitMask & CollisionCategories.Invader != 0) && |
4 |
(secondBody.categoryBitMask & CollisionCategories.PlayerBullet != 0)){ |
5 |
if (contact.bodyA.node?.parent == nil || contact.bodyB.node?.parent == nil) { |
6 |
return
|
7 |
}
|
8 |
|
9 |
let invadersPerRow = invaderNum * 2 + 1 |
10 |
let theInvader = firstBody.node? as Invader |
11 |
let newInvaderRow = theInvader.invaderRow - 1 |
12 |
let newInvaderColumn = theInvader.invaderColumn |
13 |
if(newInvaderRow >= 1){ |
14 |
self.enumerateChildNodesWithName("invader") { node, stop in |
15 |
let invader = node as Invader |
16 |
if invader.invaderRow == newInvaderRow && invader.invaderColumn == newInvaderColumn{ |
17 |
self.invadersWhoCanFire.append(invader) |
18 |
stop.memory = true |
19 |
}
|
20 |
}
|
21 |
}
|
22 |
let invaderIndex = findIndex(invadersWhoCanFire,valueToFind: firstBody.node? as Invader) |
23 |
if(invaderIndex != nil){ |
24 |
invadersWhoCanFire.removeAtIndex(invaderIndex!) |
25 |
}
|
26 |
theInvader.removeFromParent() |
27 |
secondBody.node?.removeFromParent() |
28 |
|
29 |
}
|
30 |
}
|
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.
1 |
func findIndex<T: Equatable>(array: [T], valueToFind: T) -> Int? { |
2 |
for (index, value) in enumerate(array) { |
3 |
if value == valueToFind { |
4 |
return index |
5 |
}
|
6 |
}
|
7 |
return nil |
8 |
}
|
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
.
1 |
func fireInvaderBullet(){ |
2 |
if(invadersWhoCanFire.isEmpty){ |
3 |
invaderNum += 1 |
4 |
levelComplete() |
5 |
}else{ |
6 |
let randomInvader = invadersWhoCanFire.randomElement() |
7 |
randomInvader.fireBullet(self) |
8 |
}
|
9 |
}
|
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.
1 |
class GameScene: SKScene, SKPhysicsContactDelegate{ |
2 |
...
|
3 |
let player:Player = Player() |
4 |
let maxLevels = 3 |
Sekarang menambahkan metode levelComplete
di bagian bawah GameScene.swift.
1 |
func levelComplete(){ |
2 |
if(invaderNum <= maxLevels){ |
3 |
let levelCompleteScene = LevelCompleteScene(size: size) |
4 |
levelCompleteScene.scaleMode = scaleMode |
5 |
let transitionType = SKTransition.flipHorizontalWithDuration(0.5) |
6 |
view?.presentScene(levelCompleteScene,transition: transitionType) |
7 |
}else{ |
8 |
invaderNum = 1 |
9 |
newGame() |
10 |
}
|
11 |
}
|
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:
1 |
import Foundation |
2 |
import SpriteKit |
3 |
|
4 |
class LevelCompleteScene:SKScene{ |
5 |
|
6 |
override func didMoveToView(view: SKView) { |
7 |
self.backgroundColor = SKColor.blackColor() |
8 |
let startGameButton = SKSpriteNode(imageNamed: "nextlevelbtn") |
9 |
startGameButton.position = CGPointMake(size.width/2,size.height/2 - 100) |
10 |
startGameButton.name = "nextlevel" |
11 |
addChild(startGameButton) |
12 |
}
|
13 |
|
14 |
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) { |
15 |
/* Called when a touch begins */
|
16 |
for touch: AnyObject in touches { |
17 |
let touchLocation = touch.locationInNode(self) |
18 |
let touchedNode = self.nodeAtPoint(touchLocation) |
19 |
if(touchedNode.name == "nextlevel"){ |
20 |
let gameOverScene = GameScene(size: size) |
21 |
gameOverScene.scaleMode = scaleMode |
22 |
let transitionType = SKTransition.flipHorizontalWithDuration(0.5) |
23 |
view?.presentScene(gameOverScene,transition: transitionType) } |
24 |
|
25 |
|
26 |
}
|
27 |
}
|
28 |
}
|
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.
1 |
func newGame(){ |
2 |
let gameOverScene = StartGameScene(size: size) |
3 |
gameOverScene.scaleMode = scaleMode |
4 |
let transitionType = SKTransition.flipHorizontalWithDuration(0.5) |
5 |
view?.presentScene(gameOverScene,transition: transitionType) |
6 |
}
|
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.
1 |
import SpriteKit |
2 |
import CoreMotion |
Kita juga perlu beberapa properti baru.
1 |
let maxLevels = 3 |
2 |
let motionManager: CMMotionManager = CMMotionManager() |
3 |
var accelerationX: CGFloat = 0.0 |
Selanjutnya, tambahkan setupAccelerometer
metode di bagian bawah GameScene.swift.
1 |
func setupAccelerometer(){ |
2 |
motionManager.accelerometerUpdateInterval = 0.2 |
3 |
motionManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue(), withHandler: { |
4 |
(accelerometerData: CMAccelerometerData!, error: NSError!) in |
5 |
let acceleration = accelerometerData.acceleration |
6 |
self.accelerationX = CGFloat(acceleration.x) |
7 |
})
|
8 |
}
|
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
.
1 |
struct CMAcceleration { |
2 |
var x: Double |
3 |
var y: Double |
4 |
var z: Double |
5 |
init() |
6 |
init(x x: Double, y y: Double, z z: Double) |
7 |
}
|
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.
1 |
override func didSimulatePhysics() { |
2 |
player.physicsBody?.velocity = CGVector(dx: accelerationX * 600, dy: 0) |
3 |
}
|
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.
1 |
override func didMoveToView(view: SKView) { |
2 |
...
|
3 |
setupInvaders() |
4 |
setupPlayer() |
5 |
invokeInvaderFire() |
6 |
setupAccelerometer() |
7 |
}
|
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
.
1 |
struct CollisionCategories{ |
2 |
static let Invader : UInt32 = 0x1 << 0 |
3 |
static let Player: UInt32 = 0x1 << 1 |
4 |
static let InvaderBullet: UInt32 = 0x1 << 2 |
5 |
static let PlayerBullet: UInt32 = 0x1 << 3 |
6 |
static let EdgeBody: UInt32 = 0x1 << 4 |
7 |
}
|
Menetapkan ini sebagai pemain collisionBitMask
di init
metode.
1 |
override init() { |
2 |
...
|
3 |
self.physicsBody?.categoryBitMask = CollisionCategories.Player |
4 |
self.physicsBody?.contactTestBitMask = CollisionCategories.InvaderBullet | CollisionCategories.Invader |
5 |
self.physicsBody?.collisionBitMask = CollisionCategories.EdgeBody |
6 |
animate() |
7 |
}
|
Akhirnya, kami membuat physicsBody
pada adegan itu sendiri. Tambahkan baris berikut ke didMoveToView(view: SKView)
metode dalam GameScene.swift.
1 |
override func didMoveToView(view: SKView) { |
2 |
self.physicsWorld.gravity=CGVectorMake(0, 0) |
3 |
self.physicsWorld.contactDelegate = self |
4 |
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: frame) |
5 |
self.physicsBody?.categoryBitMask = CollisionCategories.EdgeBody |
6 |
}
|
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.
1 |
override init() { |
2 |
...
|
3 |
self.physicsBody?.collisionBitMask = CollisionCategories.EdgeBody |
4 |
self.physicsBody?.allowsRotation = false |
5 |
animate() |
6 |
}
|
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.
1 |
override func didMoveToView(view: SKView) { |
2 |
backgroundColor = SKColor.blackColor() |
3 |
let starField = SKEmitterNode(fileNamed: "StarField") |
4 |
starField.position = CGPointMake(size.width/2,size.height/2) |
5 |
starField.zPosition = -1000 |
6 |
addChild(starField) |
7 |
}
|
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.
1 |
import UIKit |
2 |
import SpriteKit |
3 |
|
4 |
class PulsatingText : SKLabelNode { |
5 |
|
6 |
func setTextFontSizeAndPulsate(theText: String, theFontSize: CGFloat){ |
7 |
self.text = theText; |
8 |
self.fontSize = theFontSize |
9 |
let scaleSequence = SKAction.sequence([SKAction.scaleTo(2, duration: 1),SKAction.scaleTo(1.0, duration:1)]) |
10 |
let scaleForever = SKAction.repeatActionForever(scaleSequence) |
11 |
self.runAction(scaleForever) |
12 |
}
|
13 |
}
|
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(_:).
1 |
override func didMoveToView(view: SKView) { |
2 |
backgroundColor = SKColor.blackColor() |
3 |
let invaderText = PulsatingText(fontNamed: "ChalkDuster") |
4 |
invaderText.setTextFontSizeAndPulsate("INVADERZ", theFontSize: 50) |
5 |
invaderText.position = CGPointMake(size.width/2,size.height/2 + 200) |
6 |
addChild(invaderText) |
7 |
}
|
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(_:)
.
1 |
override func didMoveToView(view: SKView) { |
2 |
self.backgroundColor = SKColor.blackColor() |
3 |
let invaderText = PulsatingText(fontNamed: "ChalkDuster") |
4 |
invaderText.setTextFontSizeAndPulsate("LEVEL COMPLETE", theFontSize: 50) |
5 |
invaderText.position = CGPointMake(size.width/2,size.height/2 + 200) |
6 |
addChild(invaderText) |
7 |
}
|
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.