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
160
Unearth Ruby builtin Gems 發掘 Ruby 的內建 Gems
johnlinvc
0
280
Ruby 型別檢查工具簡介
johnlinvc
0
500
Swift Actor 實作探索
johnlinvc
0
160
用 mruby 來寫跨平台工具
johnlinvc
0
84
Actor model 簡介
johnlinvc
0
200
一起玩 Helm 3
johnlinvc
1
120
為什麼 App 卡卡的
johnlinvc
2
1.2k
如何使用 byebug 來除錯 Ruby 程式
johnlinvc
0
220
Other Decks in Programming
See All in Programming
React Nativeならぬ"Vue Native"が実現するかも?_新世代マルチプラットフォーム開発フレームワークのLynxとLynxのVue.js対応を追ってみよう_Vue Lynx
yut0naga1_fa
1
120
contribution to astral-sh/uv
shunsock
0
470
O Que É e Como Funciona o PHP-FPM?
marcelgsantos
0
180
Reactive Thinking with Signals and the Resource API
manfredsteyer
PRO
0
100
バッチ処理を「状態の記録」から「事実の記録」へ
panda728
PRO
0
190
実践Claude Code:20の失敗から学ぶAIペアプログラミング
takedatakashi
17
7.5k
CSC305 Lecture 10
javiergs
PRO
0
220
CSC509 Lecture 05
javiergs
PRO
0
310
Devvox Belgium - Agentic AI Patterns
kdubois
1
140
Go言語はstack overflowの夢を見るか?
logica0419
0
520
bootcamp2025_バックエンド研修_WebAPIサーバ作成.pdf
geniee_inc
0
120
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
3
13k
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
190
55k
Keith and Marios Guide to Fast Websites
keithpitt
411
23k
Designing Experiences People Love
moore
142
24k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
990
Code Reviewing Like a Champion
maltzj
526
40k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.7k
A Modern Web Designer's Workflow
chriscoyier
697
190k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
127
54k
Building Adaptive Systems
keathley
44
2.8k
It's Worth the Effort
3n
187
28k
Practical Orchestrator
shlominoach
190
11k
Git: the NoSQL Database
bkeepers
PRO
431
66k
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