Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
用SpriteKit 做一個FB 投籃遊戲
Search
Johnlin
April 12, 2016
Programming
1
200
用SpriteKit 做一個FB 投籃遊戲
Johnlin
April 12, 2016
Tweet
Share
More Decks by Johnlin
See All by Johnlin
用 MLIR 實作 一個 Ruby IR (intermediate representation)
johnlinvc
0
120
Unearth Ruby builtin Gems 發掘 Ruby 的內建 Gems
johnlinvc
0
250
Ruby 型別檢查工具簡介
johnlinvc
0
460
Swift Actor 實作探索
johnlinvc
0
160
用 mruby 來寫跨平台工具
johnlinvc
0
71
Actor model 簡介
johnlinvc
0
190
一起玩 Helm 3
johnlinvc
1
110
為什麼 App 卡卡的
johnlinvc
2
1.2k
如何使用 byebug 來除錯 Ruby 程式
johnlinvc
0
200
Other Decks in Programming
See All in Programming
Go1.25からのGOMAXPROCS
kuro_kurorrr
1
670
赤裸々に公開。 TSKaigiのオフシーズン
takezoux2
0
130
Cursor AI Agentと伴走する アプリケーションの高速リプレイス
daisuketakeda
1
110
Prism.parseで 300本以上あるエンドポイントに 接続できる権限の一覧表を作ってみた
hatsu38
1
110
イベントストーミングから始めるドメイン駆動設計
jgeem
4
840
コード書くの好きな人向けAIコーディング活用tips #orestudy
77web
3
310
カクヨムAndroidアプリのリブート
numeroanddev
0
420
XSLTで作るBrainfuck処理系
makki_d
0
200
Claude Codeの使い方
ttnyt8701
1
110
Perplexity Slack Botを作ってAI活用を進めた話 / AI Engineering Summit プレイベント
n3xem
0
660
FormFlow - Build Stunning Multistep Forms
yceruto
1
170
DroidKnights 2025 - 다양한 스크롤 뷰에서의 영상 재생
gaeun5744
3
240
Featured
See All Featured
The Cost Of JavaScript in 2023
addyosmani
50
8.4k
Done Done
chrislema
184
16k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
910
Bash Introduction
62gerente
614
210k
Facilitating Awesome Meetings
lara
54
6.4k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
The Cult of Friendly URLs
andyhume
79
6.4k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.8k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Writing Fast Ruby
sferik
628
61k
Transcript
༻SpriteKit ၏ҰݸFB ឈ༡ፍ John Lin @johnlinvc
SpriteKit • Apple ։ᚙత2D ༡ፍᐽՍɼࢧԉiOS & OSX • แؚ៸ᅷɼཧٖɼӨԻ
FB ឈ༡ፍ
Ꮠ ឈᐽ ឈٿ
༡ፍྲྀఔ • ឈ • ఁଌ༗ᔒ༗ਐ • ᰖࣔᏐ
SKView • UIView త Subclass • ෛመࡍత៸ᅷ • ՄҎᰖࣔҰࠣআࡨ༻తࢿ㘤
SKScene • ෛ႔ཧ༡ፍతҰݸܠɻ • ෛ႔ཧಈᙘᢛཧٖɻ • ༻ SKView.presentScene ိᰖࣔ •
ݐٞࡏ didMoveToView தݐཱመࡍత݅
SKNode • ද༡ፍதత݅ɼՄҎੋᅷยɼจࣈɼܗ㐫ɼӨԻ • SKScene ੋSKNode త subclass • ݸ༡ፍதత݅ੋҰݸथ㐫݁ߏɼrootबੋ
SKScene
SKLabelNode • ᰖࣔจࣈ༻ • ༻ိᙘ
ఁଌख • SKNode ੋ UIResponder త subclass • ༻ touchesBegan(_:withEvent:)
ိܭࢉىᴍ • ༻ touchesEnded(_:withEvent:) ိܭࢉऴᴍ • ၷݸ૬ݮबՄҎፙग़खతํ
SKPhysicsBody • 㑌ݸSKNode ՄҎ༗Ұݸ physicsBody ိਐߦ ཧٖɻ • ՄҎࣗݾఆٛܗ㐫ɼՄҎኺtexture ࣗಈ㗞ੜ
• ՄҎઃఆ֤छཧಛੑɼ࣭ྔɼີɼຎࡲᏐɼኧ ੑᏐɼҠಈ્ྗɼટ્ྗ
㟚ٿ • ҝ߶߶తLabel Ճ্Ұݸᅵܗత physicsBody physicsBody = SKPhysicsBody(circleOfRadius: 95, center:
CGPointMake(0, 75)) • ࡏ㟚ٿલෆཁडॏྗӨڹ physicsBody?.affectedByGravity = false • ሣٿࢪՃҰݸিྔɼฒ⬏ಈॏྗ let impulse = CGVectorMake(base * (dx/norm), base * (dy/norm)) physicsBody?.applyImpulse(impulse) physicsBody?.affectedByGravity = true
None
ឈᐽ • Ұᑍߚઢɼࠨӈၷᬑ༗ఁଌ䉰తეҬ • ՄҎ༻ SKShapeNode ိᙘ ring = SKShapeNode(rect:
CGRectMake(0, 0, rad, 2*h))
ឈᐽ䉰 • ࠨӈ֤ᙘҰᑍឈᐽ let l = SKPhysicsBody(edgeFromPoint: CGPointMake(0, 2*h), toPoint:
CGPointMake(3*h, 2*h)) let r = SKPhysicsBody(edgeFromPoint: CGPointMake(rad-3*h, 2*h), toPoint: CGPointMake(rad, 2*h)) • Ұݸཟᐽ ring!.physicsBody = SKPhysicsBody(bodies: [l,r])
None
ٿؐࡏ্ঋब౸ឈᐽྃ • ҼҝឈᐽҰࡏಹཪɼॴҎ্ঋब။౸ • ղܾํ๏ɿ㭎๏ᩋଞ༗ࡏԼ߱త࣌ީ࠽။౸
༡ፍ㑌ݸᙘ໘త॥
্ঋ࣌ෆཁ䉰 func ballAboveRing()->Bool { return basket?.position.y < ball?.position.y } override
func update(currentTime: NSTimeInterval) { if ballAboveRing() { basket?.ringEnabled = true } }
categoryBitMask:UInt32 & collisionBitMask:UInt32 • ᙛၷݸᱪA,B ᯪۙሣํ࣌ɼ။༻&(bitwise and) ိ ֬ఆၷݸ౦။ෆ။䉰 (a.categoryBitMask
& b.collisionBitMask) && (b.categoryBitMask & a.collisionBitMask) • ҙɿෆੋ༻ძํతcollisionBitMask ိᏗɼ ࣕੋҰํతcategory ሣ্ሣํత collision
ٿઃఆ။౸ᐽ • physicsBody?.categoryBitMask = CollisionMask.Ball physicsBody?.collisionBitMask = CollisionMask.Basket
ᐽՄҎબᎩཁෆཁ䉰 var ringEnabled:Bool { set { ring?.physicsBody?.collisionBitMask = newValue ?
CollisionMask.Ball : CollisionMask.None ring?.physicsBody?.categoryBitMask = newValue ? CollisionMask.Basket : CollisionMask.None } get { return ring?.physicsBody?.collisionBitMask == CollisionMask.Ball } }
ఁଌ༗ᔒ༗ਐ • ෆೳ༻ٿతҐஔိఁଌ • ༻ឈػత၏๏ɼፙग़Ұݸ໋தޙҰఆ။ៃաతᴍ • ༻ҰݸphysicsBoby ိఁଌٿ༗ᔒ༗䉰౸ಹݸᴍ
䉰ఁଌ • ༻ contactTestBitMask & categoryBitMask (a.categoryBitMask & b.contactTestBitMask)
&& (b.categoryBitMask & a.contactTestBitMask) • ༗䉰ᚙੜ࣌။ݺڣ scene.physicsWorld.contactDelegate త didBeginContact(_:) & didEndContact(_:)
መ࡞ܭఁଌث • ᩋఁଌثෆ။౸ٿɼୠੋೳఁଌᢛٿతᨀ phy.collisionBitMask = CollisionMask.None phy.contactTestBitMask = CollisionMask.Ball phy.categoryBitMask
= CollisionMask.Sensor • Լ్߱தɼ䉰౸बՃҰ func didEndContact(contact: SKPhysicsContact) { guard basket!.ringEnabled else { return } score += 1 }
ᰖࣔᏐ var score:Int = 0 { didSet { scoreText?.text =
"Score: \(score)" } }
Bonus: ٻਅመײ • ᩋٿ㟚ग़ڈ೭ޙ။Ꮣখ • ႔ཧٿឈᐽ೭ؒతલޙҐஔ᮫
SKAction • ᩋNodeՄҎํศత၏ग़֤छಈ࡞ɼ૾ੋҠಈɼվᏓ େখɼટ • ՄҎ۲֤छෆಉతಈ࡞ိ၏ग़֤छᏈՌ
ᩋٿᏓখ let scale:CGFloat = 0.5 let scaleDuration:NSTimeInterval = 1.1 runAction(SKAction.scaleBy(scale,
duration: scaleDuration))
ٿᐽతલޙҐஔ • ٿࡏ্ঋత࣌ީጯ֘ཁ֖ॅᐽɼԼ߱࣌ཁඃᐽ֖ॅ var appearBeforeRing:Bool { set { zPosition =
newValue ? 1 : -1 } get { return zPosition == 1 } }
Demo
Source Code https://gist.github.com/ bdf61305b74305079d3bae198b09 e0b2
Q&A