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
240
Unearth Ruby builtin Gems 發掘 Ruby 的內建 Gems
johnlinvc
0
330
Ruby 型別檢查工具簡介
johnlinvc
0
560
Swift Actor 實作探索
johnlinvc
0
190
用 mruby 來寫跨平台工具
johnlinvc
0
110
Actor model 簡介
johnlinvc
0
230
一起玩 Helm 3
johnlinvc
1
140
為什麼 App 卡卡的
johnlinvc
2
1.2k
如何使用 byebug 來除錯 Ruby 程式
johnlinvc
0
230
Other Decks in Programming
See All in Programming
20260228_JAWS_Beginner_Kansai
takuyay0ne
5
610
Angular-Apps smarter machen mit Gen AI: Lokal und offlinefähig - Hands-on Workshop!
christianliebel
PRO
0
130
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
360
Linux Kernelの1文字のミスで 権限昇格ができた話
rqda
0
2.1k
AI時代のシステム設計:ドメインモデルで変更しやすさを守る設計戦略
masuda220
PRO
6
1.1k
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
180
Codexに役割を持たせる 他のAIエージェントと組み合わせる実務Tips
o8n
4
1.4k
[SF Ruby Feb'26] The Silicon Heel
palkan
0
120
ロボットのための工場に灯りは要らない
watany
12
3.2k
Claude Codeログ基盤の構築
giginet
PRO
7
3.6k
我々はなぜ「層」を分けるのか〜「関心の分離」と「抽象化」で手に入れる変更に強いシンプルな設計〜 #phperkaigi / PHPerKaigi 2026
shogogg
2
360
モダンOBSプラグイン開発
umireon
0
180
Featured
See All Featured
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
390
Navigating Weather and Climate Data
rabernat
0
140
Designing Experiences People Love
moore
143
24k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
150
The SEO Collaboration Effect
kristinabergwall1
0
400
Building Adaptive Systems
keathley
44
3k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
480
Java REST API Framework Comparison - PWX 2021
mraible
34
9.2k
Paper Plane
katiecoart
PRO
0
48k
A Modern Web Designer's Workflow
chriscoyier
698
190k
How to Ace a Technical Interview
jacobian
281
24k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
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