Sprite Kit゚ンゞンでゲヌムを䜜成するパヌト1

iOS 7の出珟により、䞖界にはAppleの新しいゲヌム゚ンゞンSpriteKitが登堎したした 。 圌が最近登堎したずいう事実に照らしお、この゚ンゞンに぀いおはほずんど曞かれおいたせん。もちろん、ネットワヌク䞊でいく぀かのチュヌトリアルを芋぀けるこずができたすが、基本的にはすべお英語です。 このために、この玠​​晎らしい゚ンゞンに関する詳现なチュヌトリアルを䜜成したした。

それでは、SpriteKitずは正確には䜕ですか


SpriteKitは、Appleデバむス向けのゲヌムを䜜成するために最適化された2D゚ンゞンです。 これは、人気のあるBox 2D物理゚ンゞンに基づいおいたす。 開発者がAppleデバむス専甚に䜜成したため、他の゚ンゞンよりも倧幅に優れおいたす。
SpriteKitでは、OpenGlはグラフィックスの最適化ず描画の党圹割を担いたす。すべお䜎レベルで行われるため、より高いレベルの問題の解決ず倧芏暡な2Dゲヌムの䜜成に集䞭できたす。 SpriteKitでゲヌムを䜜成するには、 Objective-c蚀語が䜿甚されたすが、 iOS 8ず新しいSwift蚀語のリリヌスにより、ゲヌムを䜜成するこずもできたす。
私自身で、䜕らかの方法でSwiftで曞くのがさらに簡単であるこずを付け加えたいず思いたす。ですから、もし始めたばかりで、どの蚀語を遞ぶべきかを考えおいるなら、 Swiftを遞ぶこずをお勧めしたす。

以䞋に、SpriteKitのゲヌムプレむを瀺すビデオを提䟛したした。興味をお持ちの方は倧歓迎です。






開始する




それでは始めたしょう、Xcodeを開きたす。
アプリケヌションテンプレヌトを遞択するように求められたら、新しいプロゞェクトを䜜成し、ゲヌムの皮類を遞択したす。



次に、デヌタを入力した埌、蚀語を遞択するように求められたす蚀語はObjective-cたたは完党に新しいSwiftです。
いずれかを遞択できたす。この蚘事では、䞡方に䟋を瀺したす。
次に、 Game Tehnologyの䞋でSpriteKitを遞択したす。
たた、曞く察象のデバむスを遞択するこずを忘れないでください。この堎合、それはIphoneです。



そこで、プロゞェクトを䜜成したした。巊偎には、 Objective-Cのファむルがありたす。
Objective-c

Swiftの堎合 
スむフト

既にお気付きのように、 Swiftを䜿甚したプロゞェクトにはファむルが半分しかありたせん。
巊偎に衚瀺されたす

1 AppDelegateはプロゞェクトのデリゲヌトです。
2 GameViewController-プロゞェクトのコントロヌラヌ。
3 GameSceneは、ゲヌムのメむンシヌンです。
4 GameScene.sksはシヌンのビゞュアルコンストラクタヌであり、 iOS 8のリリヌスで远加され、いく぀かの芁玠を芖芚的に远加するのに圹立ちたす。


いく぀かのファむルを芋お、䞭に䜕があるか芋おみたしょう。



Gameviewcontroller




GameViewController-圌はシヌンの䜜成ず初期化を担圓しおいたす。 シヌンの衚瀺に䜿甚されるすべおの初期蚭定は、ここで行う必芁がありたす。

䞀般に、 GameViewControllerで発生するすべおは、䞡方の蚀語で同じです。
最初に、メ゜ッドたたは関数viewDidLoadが呌び出されたす。
このメ゜ッドたたは関数では、シヌンずその衚瀺甚のパラメヌタヌを䜜成しお蚭定したす。

Objective-c
- (void)viewDidLoad { [super viewDidLoad]; // Configure the view. SKView * skView = (SKView *)self.view; //     SKView     View. skView.showsFPS = YES; //       skView.showsNodeCount = YES; //    Node (   ). /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = YES;//         // Create and configure the scene. GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"]; //      . scene.scaleMode = SKSceneScaleModeAspectFill; //   ScaleMode  Scene  SKSceneScaleModeAspectFill. // Present the scene. //   presentScene,  skView            [skView presentScene:scene]; } 

スむフト
 override func viewDidLoad() { super.viewDidLoad() // if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene //      GameScene { // Configure the view. let skView = self.view as SKView //  SKView   UIView skView.showsFPS = true //       skView.showsNodeCount = true //    Node (   ). /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true //         /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill //   ScaleMode  Scene  AspectFill. //   presentScene,  skView            skView.presentScene(scene) } } 


最初に、 SKView型のオブゞェクトぞのポむンタヌたたは定数がこのメ゜ッドたたは関数で䜜成され、珟圚のビュヌがそれに割り圓おられたす。

SKViewはUIViewの子孫であり、シヌンを衚瀺するのに圹立ちたす。

次に、 SKViewの基本的なプロパティを蚭定したす。
showFPS-このプロパティは、シヌンのリフレッシュレヌトを衚瀺したす。
showsNodeCount-ノヌドシヌン内のオブゞェクトの数を瀺したす。
ignoressSiblingOrder-远加の最適化を適甚しお、レンダリングのパフォヌマンスを改善したす。
リストされおいるものに加えお、 SKViewには他にも倚くの䟿利なプロパティがありたす。


次は、シヌンのオブゞェクトであるGameSceneの䜜成です。 Swiftの堎合、 Viewの構成前に既に䜜成されおいたす 。
デフォルトでは、シヌンオブゞェクトはメ゜ッドたたは関数呌び出しで初期化されたす。

Objective-c
 + (instancetype)unarchiveFromFile:(NSString *)file { /* Retrieve scene file path from the application bundle */ NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"]; /* Unarchive the file to an SKScene object */ NSData *data = [NSData dataWithContentsOfFile:nodePath options:NSDataReadingMappedIfSafe error:nil]; NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; [arch setClass:self forClassName:@"SKScene"]; SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey]; [arch finishDecoding]; return scene; } 

スむフト
 class func unarchiveFromFile(file : NSString) -> SKNode? { let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil) var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene archiver.finishDecoding() return scene } 

呌び出されたずきに䜕が起こるか、ビゞュアルコンストラクタヌGameScene.sksのファむルを芋぀けお解凍し、その埌のシヌンの初期化のためにタむプSKSceneのオブゞェクトを返したす。
シヌンのオブゞェクトにはプロパティがあるこずに泚意しおください
名前からわかるように、 scaleModeは、このプロパティが画面党䜓にシヌンを匕き䌞ばしたす。このプロパティを詊しおください

SKViewをカスタマむズし、シヌンのオブゞェクトを䜜成したら 、衚瀺できるようになりたした。 これは非垞に簡単に行われ、 SKViewクラスの関数たたはメ゜ッドを呌び出したす。
Objective-c
  - (void)presentScene:(SKScene *)scene transition:(SKTransition *)transition; 

スむフト
 func presentScene(scene: SKScene!, transition: SKTransition!) 

そしお、シヌンのオブゞェクトをパラメヌタヌずしお枡したす。これで、コンパむルが完了し、シヌンの準備が敎いたした。



以䞋に、完党なGameViewControllerコヌドを提䟛したした 。


Objective-c
 #import "GameViewController.h" #import "GameScene.h" @implementation SKScene (Unarchive) + (instancetype)unarchiveFromFile:(NSString *)file { /* Retrieve scene file path from the application bundle */ NSString *nodePath = [[NSBundle mainBundle] pathForResource:file ofType:@"sks"]; /* Unarchive the file to an SKScene object */ NSData *data = [NSData dataWithContentsOfFile:nodePath options:NSDataReadingMappedIfSafe error:nil]; NSKeyedUnarchiver *arch = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; [arch setClass:self forClassName:@"SKScene"]; SKScene *scene = [arch decodeObjectForKey:NSKeyedArchiveRootObjectKey]; [arch finishDecoding]; return scene; } @end @implementation GameViewController - (void)viewDidLoad { [super viewDidLoad]; // Configure the view. SKView * skView = (SKView *)self.view; // skView.showsFPS = YES; skView.showsNodeCount = YES; /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = YES; // Create and configure the scene. GameScene *scene = [GameScene unarchiveFromFile:@"GameScene"]; scene.scaleMode = SKSceneScaleModeAspectFill; // Present the scene. [skView presentScene:scene]; } - (BOOL)shouldAutorotate { return YES; } - (NSUInteger)supportedInterfaceOrientations { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return UIInterfaceOrientationMaskAll; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Release any cached data, images, etc that aren't in use. } @end 


スむフト
 import UIKit import SpriteKit extension SKNode { class func unarchiveFromFile(file : NSString) -> SKNode? { let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks") var sceneData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil) var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData) archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene") let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene archiver.finishDecoding() return scene } } class GameViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() if let scene = GameScene.unarchiveFromFile("GameScene") as? GameScene { // Configure the view. let skView = self.view as SKView skView.showsFPS = true skView.showsNodeCount = true /* Sprite Kit applies additional optimizations to improve rendering performance */ skView.ignoresSiblingOrder = true /* Set the scale mode to scale to fit the window */ scene.scaleMode = .AspectFill skView.presentScene(scene) } } override func shouldAutorotate() -> Bool { return true } override func supportedInterfaceOrientations() -> Int { if UIDevice.currentDevice().userInterfaceIdiom == .Phone { return Int(UIInterfaceOrientationMask.AllButUpsideDown.toRaw()) } else { return Int(UIInterfaceOrientationMask.All.toRaw()) } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Release any cached data, images, etc that aren't in use. } } 




ゲヌムシヌン




さお、シヌンをセットアップした埌、それは敵察心の準備ができおおり、ここで私の友人はすべおの楜しみが始たりたす

既にお気づきのように、デフォルトでは、すでにオブゞェクトが远加されおいるシヌンを開始したす。
GameSceneのすべおを削陀しお、以䞋のコヌドず䞀臎するようにしたす。

Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { } @end 

スむフト
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { } } 


プロゞェクトをコンパむルするず、以䞋が衚瀺されたす。



空癜の灰色の画面が衚瀺され、Nodeオブゞェクトの数ずシヌンのリフレッシュレヌトしか衚瀺されないので、 GameSceneのコヌドを停止しお分析したす。

シヌンがどのように機胜するかを理解するには、たずその䞻芁なメ゜ッドたたは機胜を理解する必芁がありたす。以䞋に䞻芁なものたたは機胜を瀺したす。残りは.hファむルで確認できたす。

䞻なプロパティ
1 サむズ - シヌンのサむズを決定したす。
2 scaleMode- シヌンの衚瀺を定矩したす。
3 backgroundColor- シヌンの色を定矩したす。デフォルトでは灰色です䞊で気付いたように。
4 anchorPoint- シヌンの開始点を定矩したす。
5 view-元のビュヌ。
6 physicsWorld- これは、シヌンの物理重力、速床を担圓する非垞に重芁なプロパティです。詳现に぀いおは埌で説明したす。

基本的なメ゜ッドたたは関数
1 didMoveToView - シヌンが衚瀺された埌に呌び出されたす。
2 willMoveFromView - シヌンが削陀された埌に呌び出されたす。
3 didChangeSize - シヌンのサむズを倉曎するずきに呌び出されたす。
4 convertPointToView - 座暙倉換に 圹立ちたす
5 convertPointFromView - 座暙の倉換に 圹立ちたす
6 initWithSize - シヌンが初期化されるずきに呌び出されたす。

私たちのシヌンの䞻なむベント
むベントは、ゲヌムの基本的なロゞックを蚘述するために必芁であり、私が曞いた順番どおりに呌び出されたす
1 曎新 - ここでは、ゲヌムの基本的なロゞックが実装されおいたす。
2 didEvaluateActions- アクションの蚈算に 圹立ち たす-アクション。
3 didSimulatePhysics- 物理的なむベントの蚈算に䜿甚したす。
4 didApplyConstriants- 制限の蚈算に䜿甚したす。
5 didFinishUpdate- 䞊蚘のすべおのむベントが完了した埌に呌び出されたす。

友人たち、シヌンの基本的なメ゜ッドや関数、プロパティ、むベントを芋おきたので、コヌドを少し倉曎できたす。 シヌンの色を倉曎しおみたしょう。このため、 backgroundColorプロパティに切り替えお、シヌンをオレンゞでペむントしたす。 䞊で芋たように、シヌンを初期化するずきは、 initWithSizeメ゜ッドたたは関数を最初に呌び出し、シヌンが既に衚瀺された埌、 didMoveToViewを呌び出したす。 この堎合、シヌンはメ゜ッドたたは関数unarchiveFromFileを呌び出すこずで初期化されるため、初期化メ゜ッドを曞き換えるこずはできたせん。 したがっお、 didMoveToViewで初期蚭定を定矩する必芁がありたす。

Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { [self SceneSetting]; //   SceneSetting } -(void)SceneSetting { self.backgroundColor = [SKColor orangeColor]; //      } @end 

スむフト
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { SceneSetting() //   SceneSetting } func SceneSetting() { self.backgroundColor = SKColor.orangeColor() //      } } 


䞊蚘の䟋からわかるように、 didMoveToViewメ゜ッドたたは関数が最初に呌び出され、その埌SceneSettingメ゜ッドたたは関数が呌び出されそれ、その埌、シヌンの色が倉わりたす。 色が倉曎されるず、 以前ず同じようにUIColorオブゞェクトにアクセスせず、 SKColorを䜿甚したす。本質的にはUIColorを定矩する ので 、このように曞くこずができ、゚ラヌにはなりたせん。 おそらく、別のメ゜ッドたたは関数で蚭定を行った理由を尋ねるでしょう。 これは利䟿性のために行ったもので、倧芏暡なプロゞェクトではナビゲヌトするのが非垞に困難な堎合があり、最初からすべおを慎重に行うず非垞に䟿利になりたす。

そのため、䞋の画像に衚瀺されおいるものをご芧ください。


私たちのステヌゞでは䜕も起きおいないので、友達に盎したしょう
さもなければ、ここで䜕をしおいるのでしょう


SKNode




さお、あなたが芋るこずができるように、友人は私たちのシヌンの色を倉曎し、おそらくあなたは疑問に思った、それだけですか このためにここに行きたしたか

友人たち、残念ながら私たちのシヌンが持っおいるすべおの力をあなたに瀺すこずはできたせん。このために、もう1぀の非垞に重芁なポむントであるSKNodeを研究する必芁がありたす。

SKNodeは䞍可欠な芁玠です。 SpriteKitでは、それがメむンずみなされ、他のすべおの芁玠はそこから継承されたす。
私たちのシヌンでさえ、本質的には盞続人であり、すべおのプロパティを持っおいたす。

SKNodeのプロパティ、メ゜ッド、たたは関数を芋おみたしょう。

物件
1 フレヌム - ノヌドの圢状を定矩したす。
2 䜍眮 - ノヌドの䜍眮を定矩したす。
3 zPosition - Z軞に察するNodeの䜍眮を決定したす。
4 zRotation- オむラヌ角のノヌドの回転を決定したす。
5 xScale - x軞に沿ったノヌドのスケヌルを決定したす。
6 yScale - y軞に沿ったノヌドのスケヌルを決定したす。
7 速床 - ノヌドの速床を決定したす。
8 alpha - Nodeのアルファコンポヌネントを定矩したす。
9 䞀時停止 - ノヌドがアクションアクションを実行しない堎合、はいを返したす。
10 hidden-ノヌドが非衚瀺の堎合はYesを返したす。
11 isUserInteractionEnabled- ノヌドがタッチを受け入れるずYesを返したす。
12 parent- 芪ノヌドを返したすnilを返す堎合、それ自䜓が芪ノヌドです
13 children- ノヌドのすべおの子孫を返したす。
14 name-ノヌドの名前を定矩したす。 非垞に重芁な財産
15 シヌン - ノヌドが珟圚配眮されおいるシヌン。
16 physicsBody- ノヌドの物理的ボディ埌で詳しく説明する非垞に重芁なプロパティ
17 userData- 有甚な情報をノヌドに曞き蟌むこずができる堎所を定矩したす。
18 reachConstraints - IKInverse Kinematics  -Action アクションの自由床を定矩したす。
19 制玄 - 制玄 のリストを定矩したす。


メ゜ッドたたは関数
1 setScale- スケヌルを蚭定したすXずYに 均等 に
2 addChild- 子孫を远加したす1぀のノヌドを別のノヌドに远加したす。
3 insertChild- 子を 削陀し たす。
4 removeChildrenInArray- リストから子孫を削陀したす。
5 removeAllChildren- すべおの子孫を削陀したす。
6 removeFromParent- 芪ノヌドを削陀したす。
7 childNodeWithName- 名前で子を返したす。
8 enumerateChildNodesWithName- すべおの子孫を特定の名前で再蚈算したす。
9 inParentHierarchy - NodeがHierarchyのメンバヌである堎合はYesを 返したす
10 runAction- アクションを実行したす。
11 runAction-完了 - アクションの実行-アクション;完了埌、完了ブロックを呌び出したす。
12 runAction-withKey- アクションの実行-指定されたキヌを持぀アクション。
13 hasAction- ノヌドがアクションを実行する堎合はYesを返したす-アクション
14 actionForKey - Action- 指定されたキヌを持぀アクションを返したす。
15 removeActionForKey - Remove Action- 指定されたキヌを持぀アクション。
16 removeAllActions- すべおのアクション-ノヌドのアクションを削陀したす。
17 containsPoint- ポむントがノヌド内にある堎合はYesを返したす/
18 nodeAtPoint- このポむントにあるSKNodeタむプのオブゞェクトを返したす。
19 nodesAtPoint- このポむントにあるSKNodeタむプのオブゞェクトのリストを返したす。
20 convertPoint-fromNode- 座暙系の座暙を倉換しお返したす。
21 convertPoint-toNode- 座暙系ではなく座暙を倉換しお返したす。
22 intersectionsNode- ノヌドが別のノヌドの境界ず亀差する堎合はYesを返したす
23 CalculateAccumulatedFrame- 子孫を含む境界の座暙を返したす。
24 locationInNode- タッチしたノヌドの座暙を返したす。
25 previousLocationInNode-前 にタッチしたノヌドの座暙を返したす。

ほが完成です。友人たちはもう少し我慢しおくれたす。 ご芧のずおり、 SKNodeは構造がそれほど耇雑ではありたせん
ずにかく、 SpriteKit自䜓は耇雑ではなく、少しの忍耐が必芁なだけです。

続けたしょう、いく぀かの基本的なオブゞェクトはSKNodeから継承されおいたす。それらを簡単に芋おみたしょう。


1 SKSpriteNode- これは暙準のスプラむトです。
2 SKShapeNode- これは耇合スプラむトです-ほずんどすべおの圢匏を取るこずができるオブゞェクトです。
3 SKFieldNode- これらは、他の物䜓に物理的な力の圱響を䞎えるフィヌルドです。
4 SKEmitterNode- これは特別なノヌドパヌティクルです。これらは特別なパヌティクルであり、そこからクヌルな゚フェクトを䜜成できたす。
5 SKLabelNode- これは、さたざたなオプションでテキストを衚瀺するノヌドです。
6 SKEffectNode- これは、子孫に特殊効果を远加するノヌドです。
7 SKLightNode- これはNodeであり、シヌンに光ず圱を远加し、iOS 8のリリヌスで登堎したした。
8 SKVideoNode- これは、シヌンにビデオを衚瀺できるノヌドです。
9 SKCropNode- これは、特定の圢状のオブゞェクトのテクスチャを倉曎できるノヌドです。
10 SK3DNode- 名前が 瀺すように 、これは3Dオブゞェクトを远加できるノヌドです。



䞊蚘の芁玠はすべお最も䜿甚されるオブゞェクトであり、 SpriteKitでゲヌムを䜜成するための基盀ずしお機胜したす 。

Nodeをラむブで芋るこずができる時が来たした。 ゚ンゞン自䜓ずその巚倧な機胜に぀いお少し理解できるように、この蚘事を少し理論的な資料から始めたした。 次に、それらの䞀郚の機胜の䟋を芋おみたしょう。順番に進んでSKSpriteNodeから始めたしょう。


ビゞュアルノヌドレビュヌ




レビュヌを開始する前に、方向をブロックし、シヌンscaleModeのプロパティを倉曎したす。これは䜕のためですか
利䟿性のために、倒立した画面でプロセス党䜓を衚瀺する方が䟿利です。画面を際限なく回転させるのに飜きるこずはありたせん。

ViewControllerを芋぀けお、これらのプロパティを倉曎したしょう。

Objective-c
 scene.scaleMode = SKSceneScaleModeResizeFill; 


 - (NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskLandscape; } 


スむフト
 scene.scaleMode = .ResizeFill 


 override func supportedInterfaceOrientations() -> Int { return Int(UIInterfaceOrientationMask.Landscape.toRaw()) } 



SKSpriteNode





SKSpriteNodeは、テクスチャグラフィックむメヌゞを衚瀺する暙準のスプラむトです。
それを近くで芋おみたしょう、䞋の画像には3぀のオブゞェクトスプラむトがありたす
青い正方圢、ボヌドスプラむト、および背景スプラむト。
SKSpriteNode型の3぀のオブゞェクトを具䜓的に䜜成したので、䜜成の違いを確認できたす。



開始するには、Xcodeを開いおプロゞェクトに新しいフォルダヌを䜜成し、 SpriteKitImageずいう名前を付けたす奜きな名前を付けるこずができたす
次に、 ここから画像を含むアヌカむブをダりンロヌドし、それを解凍しお、䜜成したばかりのフォルダにこれらの画像を远加したす。

䜜成プロセスを説明するすべおのコヌドは以䞋にありたす。ここでいく぀かのポむントを説明したす。

最初のスプラむトの名前はBackgroundSpriteです 。䜜成する前に、タむプSKTextureのオブゞェクトを䜜成し、画像の名前をパラメヌタヌずしお枡したす。 なぜこのオブゞェクトが必芁なのですか
テクスチャは、スプラむト自䜓を䜜成する前でも画像を操䜜するのに非垞に䟿利です。テクスチャを䜿甚するず、リ゜ヌスを経枈的に管理でき、同じオブゞェクトを耇数のスプラむトで䜿甚できたす。

次に、サむズず䜍眮を蚭定したす。 䜍眮に関するいく぀かの単語、 SKSpriteNodeでは、オブゞェクトの䞭倮からカりントしたす 。぀たり、そのようなスプラむトを100pxシフトしたず蚀うずき、これは䞭心点を100pxシフトしたこずを意味したす。
サむズず䜍眮を蚭定した埌、 anchorPointプロパティを倉曎したす。 倉曎する必芁はありたせん。画像を党画面に合わせやすくするために倉曎したした。 これで理解できたす
既にご存じのずおり、 anchorPointは参照ポむントであり、䞊で曞いたように、Spriteの䜍眮は䞭倮のポむントによっお決定されるため、 anchorPointはそれを倉曎したす。 よりよく理解するために、䞋の写真を芋おみたしょう。



ご芧のように、デカルト座暙が画像に描かれおいたす。 デフォルトでは、 SKSpriteNodeオブゞェクトのanchorPointは  0.5、0.5  、぀たり䞭倮にありたす。 この䟋では、このプロパティを倉曎しお0、0に蚭定したす。もう䞀床画像を芋るず、この点が巊䞋隅にあるこずがわかりたす。぀たり、開始点は䞭倮ではなく䞋からです。巊ぞ。 そしお今、もし圌らがそのようなスプラむトを100px動かしたず蚀うなら、それは私たちがその最も䜎い巊端の点を100pxだけシフトしたこずを意味したす。

次に、名前を割り圓おたす。これも非垞に重芁なプロパティです。これたでにアクションが発生しおいないため、この堎合は蚘述する必芁はありたせんでした。
なぜ名前が必芁なのですか それによっお、オブゞェクトを芋぀け、定矩し、区別したす。 名前を遞ぶずきは泚意しおください 。

必芁なプロパティを蚭定したら、シヌンに戻り、そのメ゜ッドたたは関数を呌び出したす。
addChild- 子孫を远加1぀のノヌドを別のノヌドに远加しお 、オブゞェクトをシヌンに远加したす。

䞊で曞いたように、私たちのシヌンはSKNodeの継承者でもあるため、あるノヌドを別のノヌドに远加したす。
たずえば、あるスプラむトを別のスプラむトに远加する堎合、このメ゜ッドたたは関数は同じように機胜したす。

SimpleSpriteずいう名前の2番目のSpriteは、䜜成時に、Colorずsizeの2぀のパラメヌタヌを枡したす。
䞊蚘で曞いたように、色ずしおUIColor型のオブゞェクトを枡したす。SKColorを枡すこずができたすが、これぱラヌにはなりたせん。
もう1぀のポむントはzPositionです。zPosition -Z軞に察するNodeの䜍眮を決定したす。
デフォルトでは、このプロパティは0です。 䜕らかの理由でオブゞェクトを䜜成したずきに、2番目のオブゞェクトであるSimpleSpriteずいうオブゞェクトが残りの郚分の䞋にありたした。明らかに初期化の特性のため、このスプラむトにzPositionプロパティを1に割り圓おたした。
別の非垞に重芁な点 同じ平面䞊にないノヌドは盞互䜜甚できたせん
぀たり、1぀のzPositionが0で、もう1぀が1の堎合、それらは接觊したせん

ImageSpriteずいう名前の3番目のSpriteは、初期化䞭に、パラメヌタヌずしお画像の名前を枡したした。
もちろん、このメ゜ッドは、タむプSKTextureのオブゞェクトを䜜成した最初のメ゜ッドずは異なりたすが、通垞の初期化に非垞に適しおいたす。

Objective-c
Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { [self SceneSetting]; [self SKSpriteNodeDemo]; //       } -(void)SceneSetting { self.backgroundColor = [SKColor orangeColor]; } -(void)SKSpriteNodeDemo { //      SKTexture   .       . SKTexture *Texture = [SKTexture textureWithImageNamed:@"desert_BG"]; //  SKSpriteNode   .       SKTexture,    . SKSpriteNode *BackgroundSprite = [SKSpriteNode spriteNodeWithTexture:Texture]; BackgroundSprite.size = CGSizeMake(640, 320); //  . BackgroundSprite.position = CGPointMake(0, 0); //  . BackgroundSprite.anchorPoint = CGPointMake(0, 0); //  . BackgroundSprite.name = @"BackgroundSprite";//  . [self addChild:BackgroundSprite];//     . //  SKSpriteNode   .       . SKSpriteNode *SimpleSprite = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(50, 50)]; SimpleSprite.position = CGPointMake(200, 150);//  . SimpleSprite.zPosition = 1;//       Z. SimpleSprite.name = @"SimpleSprite";//  . [self addChild:SimpleSprite];//     . //  SKSpriteNode   .       . SKSpriteNode *ImageSprite = [SKSpriteNode spriteNodeWithImageNamed:@"DerevoOpora"]; ImageSprite.position = CGPointMake(250, 50);//  . ImageSprite.size = CGSizeMake(100, 15);//  . ImageSprite.name = @"ImageSprite";//  . [self addChild:ImageSprite];//     . } @end 



Swift
Swift
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { SceneSetting() SKSpriteNodeDemo() //     . } func SceneSetting() { self.backgroundColor = SKColor.orangeColor() } func SKSpriteNodeDemo() { //  Texture      SKTexture.        var Texture = SKTexture(imageNamed: "desert_BG") //  BackgroundSprite      SKSpriteNode. //       SKTexture   . var BackgroundSprite = SKSpriteNode(texture: Texture) BackgroundSprite.size = CGSizeMake(640, 320) // . BackgroundSprite.position = CGPointMake(0, 0) // . BackgroundSprite.anchorPoint = CGPointMake(0, 0) //  . BackgroundSprite.name = "BackgroundSprite" //  . self.addChild(BackgroundSprite) //     . //  SimpleSprite      SKSpriteNode. //       . var SimpleSprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSizeMake(50, 50)) SimpleSprite.position = CGPointMake(200, 150) // . SimpleSprite.zPosition = 1; //       Z. SimpleSprite.name = "SimpleSprite" //  . self.addChild(SimpleSprite) //     . //  ImageSprite      SKSpriteNode. //       . var ImageSprite = SKSpriteNode(imageNamed: "DerevoOpora") ImageSprite.position = CGPointMake(250, 50) // . ImageSprite.size = CGSizeMake(100, 15) // . ImageSprite.name = "ImageSprite" //  . self.addChild(ImageSprite) //     . } } 


, SKSpriteNode , , Node — SKShapeNode .


SKShapeNode





SKShapeNode-これは耇合スプラむトです-ほずんどすべおの圢匏をずるこずができるオブゞェクトです。぀たり、円、正方圢、䞉角圢、楕円など、 ほがすべおの幟䜕孊的圢状を䜿甚できたす。ここではフォヌム党䜓が耇合であるため
、SKSpriteNodeよりも構築が少し耇雑です。しかし、耇雑なフォヌムの構築には䞍可欠であり、管理なしでは非垞に困難です。
申し分なく、ビゞネスに取り掛かりたしょう



䞊蚘の図が実装されおいるメ゜ッドたたは関数を芋おみたしょう。完党なコヌドは以䞋にありたす。
そのため、䟿宜䞊、以前のメ゜ッドたたは機胜をコメントアりトしたした。したがっお、以前のオブゞェクトが衚瀺されなくおも心配しないでください。

Objective-c
Objective-c
 -(void)SKShapeNodeDemo { //  SKShapeNode   .     . SKShapeNode *Circle = [SKShapeNode shapeNodeWithCircleOfRadius:20]; Circle.position = CGPointMake(50, 200); //  . Circle.lineWidth = 10; //   . Circle.strokeColor = [SKColor blueColor]; //   . Circle.fillColor = [SKColor redColor]; //   . Circle.name = @"Circle"; //  . [self addChild:Circle]; //      . //  SKShapeNode   .         (CGRectMake). SKShapeNode *Quad = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)]; Quad.position = CGPointMake(100, 200); //  . Quad.lineWidth = 4; //   . Quad.strokeColor = [SKColor whiteColor]; //   . Quad.fillColor = [SKColor blackColor]; //   . Quad.name = @"Quad"; //  . [self addChild:Quad]; //      . //   SKShapeNode   .         (CGRectMake). //              . SKShapeNode *Ellips = [SKShapeNode shapeNodeWithEllipseInRect:CGRectMake(0, 0, 50, 90)]; Ellips.position = CGPointMake(200, 200); //  . Ellips.lineWidth = 2; //   . Ellips.strokeColor = [SKColor greenColor]; //   . Ellips.fillColor = [SKColor purpleColor]; //   . Ellips.glowWidth = 5; //    . Ellips.name = @"Ellips"; //  . [self addChild:Ellips]; //      . //      UIBezierPath.         (CGRectMake), //     . UIBezierPath *RoundedRectPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 50) cornerRadius:12]; //   SKShapeNode   .           . //    ,          CGPath. SKShapeNode *RoundedRect = [ SKShapeNode shapeNodeWithPath:RoundedRectPath.CGPath centered:YES]; RoundedRect.position = CGPointMake(50, 100); //  . RoundedRect.lineWidth = 2; //   . RoundedRect.strokeColor = [SKColor blueColor]; //   . RoundedRect.fillColor = [SKColor redColor]; //   . RoundedRect.name = @"RoundedRect"; //  . [self addChild:RoundedRect]; //      . UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; //      UIBezierPath. [TrianglePath moveToPoint:CGPointMake(0, 0)]; //      . [TrianglePath addLineToPoint:CGPointMake(-25, -50)]; //     . [TrianglePath addLineToPoint:CGPointMake(25, -50)]; //     . [TrianglePath addLineToPoint:CGPointMake(0, 0)]; //     . //   SKShapeNode   .           . //    ,          CGPath. SKShapeNode *Triangle = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath centered:YES]; Triangle.position = CGPointMake(200, 70); //  . Triangle.lineWidth = 2; //   . Triangle.strokeColor = [SKColor blackColor]; //   . Triangle.fillColor = [SKColor blueColor]; //   . Triangle.name = @"Triangle"; //  . [self addChild:Triangle]; //      . } 


スむフト
スむフト
 func SKShapeNodeDemo() { //   Circle      SKShapeNode.     . var Circle = SKShapeNode(circleOfRadius: 20) Circle.position = CGPointMake(50, 200) //  . Circle.lineWidth = 10 //   . Circle.strokeColor = SKColor.blueColor() //   . Circle.fillColor = SKColor.redColor() //   . Circle.name = "Circle" //  . self.addChild(Circle) //      . //   Quad      SKShapeNode. //         (CGRectMake). var Quad = SKShapeNode(rect: CGRectMake(0, 0, 50, 50)) Quad.position = CGPointMake(100, 200) //  . Quad.lineWidth = 4 //   . Quad.strokeColor = SKColor.whiteColor() //   . Quad.fillColor = SKColor.blackColor() //   . Quad.name = "Quad" //  . self.addChild(Quad) //      . //   Ellips      SKShapeNode. //              . var Ellips = SKShapeNode(ellipseInRect: CGRectMake(0, 0, 50, 90)) Ellips.position = CGPointMake(200, 200) //  . Ellips.lineWidth = 2 //   . Ellips.strokeColor = SKColor.greenColor() //   . Ellips.fillColor = SKColor.purpleColor() //   . Ellips.glowWidth = 5 //    . Ellips.name = "Ellips" //  . self.addChild(Ellips) //      . //   RoundedRectPath      UIBezierPath. //         (CGRectMake),     . var RoundedRectPath = UIBezierPath(roundedRect: CGRectMake(0, 0, 50, 50), cornerRadius: 12) //   RoundedRect      SKShapeNode. //           . //    ,          CGPath. var RoundedRect = SKShapeNode(path: RoundedRectPath.CGPath, centered:true) RoundedRect.position = CGPointMake(50, 100) //  . RoundedRect.lineWidth = 2 //   . RoundedRect.strokeColor = SKColor.blueColor() //   . RoundedRect.fillColor = SKColor.redColor() //   . RoundedRect.name = "RoundedRect" //  . self.addChild(RoundedRect) //      . var TrianglePath = UIBezierPath() //      UIBezierPath. TrianglePath.moveToPoint(CGPointMake(0, 0)) //      . TrianglePath.addLineToPoint(CGPointMake(-25, -50)) //     . TrianglePath.addLineToPoint(CGPointMake(25, -50)) //     . TrianglePath.addLineToPoint(CGPointMake(0, 0)) //     . //   Triangle      SKShapeNode. //           . //    ,          CGPath. var Triangle = SKShapeNode(path: TrianglePath.CGPath, centered: true) Triangle.position = CGPointMake(200, 70) //  . Triangle.lineWidth = 2 //   . Triangle.strokeColor = SKColor.blackColor() //   . Triangle.fillColor = SKColor.blueColor() //   . Triangle.name = "Triangle" //  . self.addChild(Triangle) //      . } 


でSKShapeNode初期化するいく぀かの方法があり、それらは2぀のグルヌプに分けるこずができる
暙準的な初期化たたはオブゞェクトの䜿甚初期UIBezierPathを。

それらを個別に怜蚎したしょう

暙準初期化


• 初期化が簡単なオブゞェクトは、最初のグルヌプに分類されたす。これはどういう意味ですかこれらは、たずえば、フォヌムが既に䜜成されおいる初期化時のオブゞェクトであり、パラメヌタを蚭定するだけです。これで理解できたす

サヌクル
, Circle . , shapeNodeWithCircleOfRadius circleOfRadius (-) .

Objective-c
 //  SKShapeNode   .     . SKShapeNode *Circle = [SKShapeNode shapeNodeWithCircleOfRadius:20]; Circle.position = CGPointMake(50, 200); //  . Circle.lineWidth = 10; //   . Circle.strokeColor = [SKColor blueColor]; //   . Circle.fillColor = [SKColor redColor]; //   . Circle.name = @"Circle"; //  . [self addChild:Circle]; //      . 

Swift
 //   Circle      SKShapeNode.     . var Circle = SKShapeNode(circleOfRadius: 20) Circle.position = CGPointMake(50, 200) //  . Circle.lineWidth = 10 //   . Circle.strokeColor = SKColor.blueColor() //   . Circle.fillColor = SKColor.redColor() //   . Circle.name = "Circle" //  . self.addChild(Circle) //      . 


, , .
, , .
lineWidth , (), , .

: strokeColor fillColor .

• strokeColor — ( ).
• fillColor — .

, .
, 5 — 10 nodes? , fillColor , 10 nodes, . , .

, , .


クワッド
Objective-c
 //  SKShapeNode   .         (CGRectMake). SKShapeNode *Quad = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)]; Quad.position = CGPointMake(100, 200); //  . Quad.lineWidth = 4; //   . Quad.strokeColor = [SKColor whiteColor]; //   . Quad.fillColor = [SKColor blackColor]; //   . Quad.name = @"Quad"; //  . [self addChild:Quad]; //      . 

Swift
 //   Quad      SKShapeNode. //         (CGRectMake). var Quad = SKShapeNode(rect: CGRectMake(0, 0, 50, 50)) Quad.position = CGPointMake(100, 200) //  . Quad.lineWidth = 4 //   . Quad.strokeColor = SKColor.whiteColor() //   . Quad.fillColor = SKColor.blackColor() //   . Quad.name = "Quad" //  . self.addChild(Quad) //      . 

Quad , , . , (CGRectMake).
 CGRectMake(0, 0, 50, 50) 

, , : .
: x — X, y — Y.
.


゚リプス
Objective-c
 //   SKShapeNode   .         (CGRectMake). //              . SKShapeNode *Ellips = [SKShapeNode shapeNodeWithEllipseInRect:CGRectMake(0, 0, 50, 90)]; Ellips.position = CGPointMake(200, 200); //  . Ellips.lineWidth = 2; //   . Ellips.strokeColor = [SKColor greenColor]; //   . Ellips.fillColor = [SKColor purpleColor]; //   . Ellips.glowWidth = 5; //    . Ellips.name = @"Ellips"; //  . [self addChild:Ellips]; //      . 

Swift
 //   Ellips      SKShapeNode. //              . var Ellips = SKShapeNode(ellipseInRect: CGRectMake(0, 0, 50, 90)) Ellips.position = CGPointMake(200, 200) //  . Ellips.lineWidth = 2 //   . Ellips.strokeColor = SKColor.greenColor() //   . Ellips.fillColor = SKColor.purpleColor() //   . Ellips.glowWidth = 5 //    . Ellips.name = "Ellips" //  . self.addChild(Ellips) //      . 

Ellips , . , . shapeNodeWithEllipseInRect ellipseInRect . (CGRectMake) , .
, , glowWidth

• glowWidth — , , .


さお、最初のグルヌプから、簡単な初期化のいく぀かのメ゜ッドたたは関数を芋たした。もちろん、すべおをリストするこずはできたせん。自分でそれを理解する方がより興味深いず思いたす。


UIBezierPathオブゞェクトを䜿甚した初期化


• 2番目のグルヌプには、UIBezierPathオブゞェクトを䜿甚しお初期化が実行されるオブゞェクトが含たれたす。
これはどういう意味ですかこれたで、圢状がわかっおいるオブゞェクトを怜蚎しおおり、パラメヌタヌを枡すだけで枈みたしたが、たずえば䞉角圢を䜜成したい堎合はどうでしょうかそのような初期化メ゜ッドはありたせんこのような堎合、UIBezierPath型のオブゞェクトが必芁です。
このオブゞェクトを䜿甚しお、任意のフォヌムを䜜成し、SKShapeNodeに枡すず衚瀺されたす。

䞞みを垯びた
Objective-c
 //      UIBezierPath.         (CGRectMake), //     . UIBezierPath *RoundedRectPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 50) cornerRadius:12]; //   SKShapeNode   .           . //    ,          CGPath. SKShapeNode *RoundedRect = [ SKShapeNode shapeNodeWithPath:RoundedRectPath.CGPath centered:YES]; RoundedRect.position = CGPointMake(50, 100); //  . RoundedRect.lineWidth = 2; //   . RoundedRect.strokeColor = [SKColor blueColor]; //   . RoundedRect.fillColor = [SKColor redColor]; //   . RoundedRect.name = @"RoundedRect"; //  . [self addChild:RoundedRect]; //      . 

Swift
 //   RoundedRectPath      UIBezierPath. //         (CGRectMake),     . var RoundedRectPath = UIBezierPath(roundedRect: CGRectMake(0, 0, 50, 50), cornerRadius: 12) //   RoundedRect      SKShapeNode. //           . //    ,          CGPath. var RoundedRect = SKShapeNode(path: RoundedRectPath.CGPath, centered:true) RoundedRect.position = CGPointMake(50, 100) //  . RoundedRect.lineWidth = 2 //   . RoundedRect.strokeColor = SKColor.blueColor() //   . RoundedRect.fillColor = SKColor.redColor() //   . RoundedRect.name = "RoundedRect" //  . self.addChild(RoundedRect) //      . 


, RoundedRect .
, UIBezierPath , :
(CGRectMake) . , () .

UIBezierPath , SKShapeNode , .
UIBezierPath , centered .
, CGPath , ; , !
, — centered , !
, . , .



トラむアングル
Objective-c
 UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; //      UIBezierPath. [TrianglePath moveToPoint:CGPointMake(0, 0)]; //      . [TrianglePath addLineToPoint:CGPointMake(-25, -50)]; //     . [TrianglePath addLineToPoint:CGPointMake(25, -50)]; //     . [TrianglePath addLineToPoint:CGPointMake(0, 0)]; //     . //   SKShapeNode   .           . //    ,          CGPath. SKShapeNode *Triangle = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath centered:YES]; Triangle.position = CGPointMake(200, 70); //  . Triangle.lineWidth = 2; //   . Triangle.strokeColor = [SKColor blackColor]; //   . Triangle.fillColor = [SKColor blueColor]; //   . Triangle.name = @"Triangle"; //  . [self addChild:Triangle]; //      . 

Swift
 var TrianglePath = UIBezierPath() //      UIBezierPath. TrianglePath.moveToPoint(CGPointMake(0, 0)) //      . TrianglePath.addLineToPoint(CGPointMake(-25, -50)) //     . TrianglePath.addLineToPoint(CGPointMake(25, -50)) //     . TrianglePath.addLineToPoint(CGPointMake(0, 0)) //     . //   Triangle      SKShapeNode. //           . //    ,          CGPath. var Triangle = SKShapeNode(path: TrianglePath.CGPath, centered: true) Triangle.position = CGPointMake(200, 70) //  . Triangle.lineWidth = 2 //   . Triangle.strokeColor = SKColor.blackColor() //   . Triangle.fillColor = SKColor.blueColor() //   . Triangle.name = "Triangle" //  . self.addChild(Triangle) //      . 


Triangle . UIBezierPath . . , UIBezierPath , TrianglePath .
, . ! , , , . moveToPoint UIBezierPath . (), , , addLineToPoint . , , , ( ). . TrianglePath . SKShapeNode Triangle , «» !




• むンタヌネットにはUIBezierPathのようなオブゞェクトに関する情報がたくさんありたすので、芋぀けお読むこずをお勧めしたす。


なぜ䞭心パラメヌタヌが必芁なのかを説明するこずを玄束したした。SKShapeNodeのようなオブゞェクトの基本構造を理解できるようにするために、これを行ったこずはありたせん。そのため、䞭倮のパラメヌタヌが正の倀をずる堎合、タむプSKShapeNodeのオブゞェクトの䜍眮は䞭倮からカりントされたす。タむプSKSpriteNodeのオブゞェクトの䜍眮に぀いお説明したずき、それらの䜍眮は䞭倮からカりントされるこずを思い出しおください。したがっお、䞭倮パラメヌタが正の堎合、このオブゞェクトの䜍眮は䞭倮から蚈算されたす。

これは、SKShapeNodeタむプの単玔なオブゞェクトの䜍眮がどのように蚈算されるかずいう非垞に関連性のある質問を招きたすなぜなら、すべおのオブゞェクトが䞭倮の初期化パラメヌタヌで䜜成されるわけではないからですか



䟋ずしお、以前にQuadずいう名前で芋たオブゞェクトを芋おみたしょう。 CGRectMakeずいう名前の関数をパラメヌタヌずしお枡すこずから始たる初期化を調べたした。前に曞いたように、この関数は䜍眮ずサむズを返したす。

 CGRectMake(0, 0, 50, 50). 

その䞭で、最初の2぀のパラメヌタヌは、その原点䜍眮x、y、および残りの幅ず長さをそれぞれ決定したす。
幅ず長さが明確な堎合、原点は少し濁っおいたす。実際、タむプSKShapeNodeのオブゞェクトは、䜍眮が䞭倮からカりントされるタむプSKSpriteNodeのオブゞェクトずは少し異なる䜍眮蚈算システムを䜿甚したす。䞊蚘の画像を芋おみたしょう。したがっお、オブゞェクトをQuadずいう名前で初期化するずきに、CGRectMake0、0、50、50関数をパラメヌタヌずしお枡したした。画像でわかるように、原点は0、0です。画像から、䜍眮は巊䞊隅から始たるこずがわかりたす。
では、原点を倉曎しお、以前の関数を転送したすが、座暙は異なりたす。

 CGRectMake(-25, -25, 50, 50). 




そしお、私たちは䜕を芋たすか初期化時の正方圢には、䞭倮から基準䜍眮の開始点がありたす。
぀たり、オブゞェクトにはSKSpriteNodeオブゞェクトず同じ参照システムがあり、䜍眮が䞭倮からカりントされたす。

• originは、タむプSKSpriteNodeのオブゞェクトで以前芋たものず少し䌌たアンカヌの圹割を果たしたす。

質問があるかもしれたせんが、なぜ原点座暙を-25、-25に指定したのですか

•実際には、正方圢のサむズは50、50です。぀たり、その䞭間点は50/2、50/2、぀たり幅ず長さの半分です

最初の画像では、SKShapeNode型のオブゞェクトが衚瀺されおいたす開始点は0、0であるため、その䜍眮は巊䞊隅から決定されたすが、
-25、-25だけ移動するず、開始点は䞭倮になり、䜍眮は䞭倮でカりントされたす。

•そのようなスプラむトを100ピクセル移動したず蚀われたら、その䞭間点を100ピクセル移動したこずを意味したす。SKShapeNode

が奜きだったず思いたす。ご芧のずおり、難しいこずは䜕もありたせんが、いく぀かの点を理解しおいなくおも怖くないので、物理孊のデモンストレヌション䞭にすべおを理解できたす。簡単なヒントこのSpriteオブゞェクトをよりよく理解するには、UIBezierPathでよりよく勉匷し、垞に緎習しおください

Objective-c
Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { [self SceneSetting]; //[self SKSpriteNodeDemo]; [self SKShapeNodeDemo]; } -(void)SceneSetting { self.backgroundColor = [SKColor orangeColor]; } -(void)SKSpriteNodeDemo { SKTexture *Texture = [SKTexture textureWithImageNamed:@"desert_BG"]; SKSpriteNode *BackgroundSprite = [SKSpriteNode spriteNodeWithTexture:Texture]; BackgroundSprite.size = CGSizeMake(640, 320); BackgroundSprite.position = CGPointMake(0, 0); BackgroundSprite.anchorPoint = CGPointMake(0, 0); BackgroundSprite.name = @"BackgroundSprite"; [self addChild:BackgroundSprite]; SKSpriteNode *SimpleSprite = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(50, 50)]; SimpleSprite.position = CGPointMake(200, 150); SimpleSprite.zPosition = 1; SimpleSprite.name = @"SimpleSprite"; [self addChild:SimpleSprite]; SKSpriteNode *ImageSprite = [SKSpriteNode spriteNodeWithImageNamed:@"DerevoOpora"]; ImageSprite.position = CGPointMake(250, 50); ImageSprite.size = CGSizeMake(100, 15); ImageSprite.name = @"ImageSprite"; [self addChild:ImageSprite]; } -(void)SKShapeNodeDemo { SKShapeNode *Circle = [SKShapeNode shapeNodeWithCircleOfRadius:20]; Circle.position = CGPointMake(50, 200); Circle.lineWidth = 10; Circle.strokeColor = [SKColor blueColor]; Circle.fillColor = [SKColor redColor]; Circle.name = @"Circle"; [self addChild:Circle]; SKShapeNode *Quad = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)]; Quad.position = CGPointMake(100, 200); Quad.lineWidth = 4; Quad.strokeColor = [SKColor whiteColor]; Quad.fillColor = [SKColor blackColor]; Quad.name = @"Quad"; [self addChild:Quad]; SKShapeNode *Ellips = [SKShapeNode shapeNodeWithEllipseInRect:CGRectMake(0, 0, 50, 90)]; Ellips.position = CGPointMake(200, 200); Ellips.lineWidth = 2; Ellips.strokeColor = [SKColor greenColor]; Ellips.fillColor = [SKColor purpleColor]; Ellips.glowWidth = 5; Ellips.name = @"Ellips"; [self addChild:Ellips]; UIBezierPath *RoundedRectPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 50) cornerRadius:12]; SKShapeNode *RoundedRect = [ SKShapeNode shapeNodeWithPath:RoundedRectPath.CGPath centered:YES]; RoundedRect.position = CGPointMake(50, 100); RoundedRect.lineWidth = 2; RoundedRect.strokeColor = [SKColor blueColor]; RoundedRect.fillColor = [SKColor redColor]; RoundedRect.name = @"RoundedRect"; [self addChild:RoundedRect]; UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; [TrianglePath moveToPoint:CGPointMake(0, 0)]; [TrianglePath addLineToPoint:CGPointMake(-25, -50)]; [TrianglePath addLineToPoint:CGPointMake(25, -50)]; [TrianglePath addLineToPoint:CGPointMake(0, 0)]; SKShapeNode *Triangle = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath centered:YES]; Triangle.position = CGPointMake(200, 70); Triangle.lineWidth = 2; Triangle.strokeColor = [SKColor blackColor]; Triangle.fillColor = [SKColor blueColor]; Triangle.name = @"Triangle"; [self addChild:Triangle]; } @end 

スむフト
スむフト
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { SceneSetting() //SKSpriteNodeDemo() SKShapeNodeDemo() } func SceneSetting() { self.backgroundColor = SKColor.orangeColor() } func SKSpriteNodeDemo() { var Texture = SKTexture(imageNamed: "desert_BG") var BackgroundSprite = SKSpriteNode(texture: Texture) BackgroundSprite.size = CGSizeMake(640, 320) BackgroundSprite.position = CGPointMake(0, 0) BackgroundSprite.anchorPoint = CGPointMake(0, 0) BackgroundSprite.name = "BackgroundSprite" self.addChild(BackgroundSprite) var SimpleSprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSizeMake(50, 50)) SimpleSprite.position = CGPointMake(200, 150) SimpleSprite.zPosition = 1; SimpleSprite.name = "SimpleSprite" self.addChild(SimpleSprite) var ImageSprite = SKSpriteNode(imageNamed: "DerevoOpora") ImageSprite.position = CGPointMake(250, 50) ImageSprite.size = CGSizeMake(100, 15) ImageSprite.name = "ImageSprite" self.addChild(ImageSprite) } func SKShapeNodeDemo() { var Circle = SKShapeNode(circleOfRadius: 20) Circle.position = CGPointMake(50, 200) Circle.lineWidth = 10 Circle.strokeColor = SKColor.blueColor() Circle.fillColor = SKColor.redColor() Circle.name = "Circle" self.addChild(Circle) var Quad = SKShapeNode(rect: CGRectMake(0, 0, 50, 50)) Quad.position = CGPointMake(100, 200) Quad.lineWidth = 4 Quad.strokeColor = SKColor.whiteColor() Quad.fillColor = SKColor.blackColor() Quad.name = "Quad" self.addChild(Quad) var Ellips = SKShapeNode(ellipseInRect: CGRectMake(0, 0, 50, 90)) Ellips.position = CGPointMake(200, 200) Ellips.lineWidth = 2 Ellips.strokeColor = SKColor.greenColor() Ellips.fillColor = SKColor.purpleColor() Ellips.glowWidth = 5 Ellips.name = "Ellips" self.addChild(Ellips) var RoundedRectPath = UIBezierPath(roundedRect: CGRectMake(0, 0, 50, 50), cornerRadius: 12) var RoundedRect = SKShapeNode(path: RoundedRectPath.CGPath, centered:true) RoundedRect.position = CGPointMake(50, 100) RoundedRect.lineWidth = 2 RoundedRect.strokeColor = SKColor.blueColor() RoundedRect.fillColor = SKColor.redColor() RoundedRect.name = "RoundedRect" self.addChild(RoundedRect) var TrianglePath = UIBezierPath() TrianglePath.moveToPoint(CGPointMake(0, 0)) TrianglePath.addLineToPoint(CGPointMake(-25, -50)) TrianglePath.addLineToPoint(CGPointMake(25, -50)) TrianglePath.addLineToPoint(CGPointMake(0, 0)) var Triangle = SKShapeNode(path: TrianglePath.CGPath, centered: true) Triangle.position = CGPointMake(200, 70) Triangle.lineWidth = 2 Triangle.strokeColor = SKColor.blackColor() Triangle.fillColor = SKColor.blueColor() Triangle.name = "Triangle" self.addChild(Triangle) } } 



SKLabelNode




SKLabelNode-これは、シヌンにテキストを衚瀺できるスプラむトです。さらに、テキストは
、フォントサむズ、フォントの色、フォント名の パラメヌタヌで衚瀺できたす。
フォントの配眮を垂盎ず氎平の䞡方に調敎したす。ただし、今ではすべおを自分で芋るこずができたす。




Objective-c
目的c
 -(void)SKLabelNodeDemo { //   SKLabelNode   .      . SKLabelNode *First = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; First.position = CGPointMake(280, 200); //  . First.fontSize = 25; //   . First.fontColor = [SKColor whiteColor]; //   . First.color = [SKColor blueColor]; //   (    colorBlendFactor). First.colorBlendFactor = 0.5; //  colorBlendFactor (0.0 - 1.0) First.text = @"Habra Habr!"; //  . First.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter; //    . First.name = @"First"; //    [self addChild:First]; //      . //   SKLabelNode   .     . SKLabelNode *Second = [SKLabelNode labelNodeWithText:@"----"]; Second.fontName = @"Chalkboard SE Bold"; //   . Second.fontColor = [SKColor blackColor]; //   . Second.position = CGPointMake(280, 50); //  . Second.fontSize = 20; //   . Second.name = @"Second"; //    [self addChild:Second]; //      . } 



スむフト
スむフト
 func SKLabelNodeDemo() { //   First      SKLabelNode.      . var First = SKLabelNode(fontNamed: "Chalkduster") First.position = CGPointMake(280, 200) //  . First.fontSize = 25; //   . First.fontColor = SKColor.whiteColor() //   . First.color = SKColor.blueColor() //   (    colorBlendFactor). First.colorBlendFactor = 0.5 //  colorBlendFactor (0.0 - 1.0) First.text = "Habra Habr!" //  . First.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center //    . First.name = "First" //    self.addChild(First) //      . //   Second      SKLabelNode.     . var Second = SKLabelNode(text: "----") Second.fontName = "Chalkboard SE Bold" //   . Second.fontColor = SKColor.blackColor() //   . Second.position = CGPointMake(280, 50) //  . Second.fontSize = 20 //   . Second.name = "Second" //    self.addChild(Second) //      . } 

䞊の画像では、2぀のスプラむトが衚瀺されおいたす。䜜成方法を芋お始めたしょう。First

ずいう名前の最初のスプラむト。初期化されるず、フォントの名前をパラメヌタヌずしお枡したす。SKLabelNodeタむプのスプラむトは、ほがすべおの䞻芁なフォントをサポヌトしおいたす。この堎合、Chalkdusterずいう名前のフォントを枡したす。次に、すべおの基本プロパティを構成したす。
• fontSize — . .
• fontColor — .
• color — ( colorBlendFactor).
• colorBlendFactor — . color . (0.0 — 1.0).
• text — .
• horizontalAlignmentMode — . , .

これらのプロパティを蚭定した埌、シヌンにオブゞェクトを远加したす。䞊の画像で結果を確認できたす。

2番目のオブゞェクトの名前はSecondです。初期化されるず、衚瀺するテキストをパラメヌタヌずしお枡し、その埌、他のすべおのプロパティを構成したす。基本的なプロパティは以前のスプラむトずほずんど同じであるため、すでに知っおいるので、時間を無駄にせずに先に進みたす。

Objective-c
Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { [self SceneSetting]; //[self SKSpriteNodeDemo]; //[self SKShapeNodeDemo]; [self SKLabelNodeDemo]; } -(void)SceneSetting { self.backgroundColor = [SKColor orangeColor]; } -(void)SKSpriteNodeDemo { SKTexture *Texture = [SKTexture textureWithImageNamed:@"desert_BG"]; SKSpriteNode *BackgroundSprite = [SKSpriteNode spriteNodeWithTexture:Texture]; BackgroundSprite.size = CGSizeMake(640, 320); BackgroundSprite.position = CGPointMake(0, 0); BackgroundSprite.anchorPoint = CGPointMake(0, 0); BackgroundSprite.name = @"BackgroundSprite"; [self addChild:BackgroundSprite]; SKSpriteNode *SimpleSprite = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(50, 50)]; SimpleSprite.position = CGPointMake(200, 150); SimpleSprite.zPosition = 1; SimpleSprite.name = @"SimpleSprite"; [self addChild:SimpleSprite]; SKSpriteNode *ImageSprite = [SKSpriteNode spriteNodeWithImageNamed:@"DerevoOpora"]; ImageSprite.position = CGPointMake(250, 50); ImageSprite.size = CGSizeMake(100, 15); ImageSprite.name = @"ImageSprite"; [self addChild:ImageSprite]; } -(void)SKShapeNodeDemo { SKShapeNode *Circle = [SKShapeNode shapeNodeWithCircleOfRadius:20]; Circle.position = CGPointMake(50, 200); Circle.lineWidth = 10; Circle.strokeColor = [SKColor blueColor]; Circle.fillColor = [SKColor redColor]; Circle.name = @"Circle"; [self addChild:Circle]; SKShapeNode *Quad = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)]; Quad.position = CGPointMake(100, 200); Quad.lineWidth = 4; Quad.strokeColor = [SKColor whiteColor]; Quad.fillColor = [SKColor blackColor]; Quad.name = @"Quad"; [self addChild:Quad]; SKShapeNode *Ellips = [SKShapeNode shapeNodeWithEllipseInRect:CGRectMake(0, 0, 50, 90)]; Ellips.position = CGPointMake(200, 200); Ellips.lineWidth = 2; Ellips.strokeColor = [SKColor greenColor]; Ellips.fillColor = [SKColor purpleColor]; Ellips.glowWidth = 5; Ellips.name = @"Ellips"; [self addChild:Ellips]; UIBezierPath *RoundedRectPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 50) cornerRadius:12]; SKShapeNode *RoundedRect = [ SKShapeNode shapeNodeWithPath:RoundedRectPath.CGPath centered:YES]; RoundedRect.position = CGPointMake(50, 100); RoundedRect.lineWidth = 2; RoundedRect.strokeColor = [SKColor blueColor]; RoundedRect.fillColor = [SKColor redColor]; RoundedRect.name = @"RoundedRect"; [self addChild:RoundedRect]; UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; [TrianglePath moveToPoint:CGPointMake(0,0)]; [TrianglePath addLineToPoint:CGPointMake(-25, -50)]; [TrianglePath addLineToPoint:CGPointMake(25, -50)]; [TrianglePath addLineToPoint:CGPointMake(0, 0)]; SKShapeNode *Triangle = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath centered:YES]; Triangle.position = CGPointMake(200, 70); Triangle.lineWidth = 2; Triangle.strokeColor = [SKColor blackColor]; Triangle.fillColor = [SKColor blueColor]; Triangle.name = @"Triangle"; [self addChild:Triangle]; } -(void)SKLabelNodeDemo { SKLabelNode *First = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; First.position = CGPointMake(280, 200); First.fontSize = 25; First.fontColor = [SKColor whiteColor]; First.color = [SKColor blueColor]; First.colorBlendFactor = 0.5; First.text = @"Habra Habr!"; First.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter; [self addChild:First]; SKLabelNode *Second = [SKLabelNode labelNodeWithText:@"----"]; Second.fontName = @"Chalkboard SE Bold"; Second.fontColor = [SKColor blackColor]; Second.position = CGPointMake(280, 50); Second.fontSize = 20; [self addChild:Second]; } @end 

スむフト
スむフト
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { SceneSetting() //SKSpriteNodeDemo() //SKShapeNodeDemo() SKLabelNodeDemo() } func SceneSetting() { self.backgroundColor = SKColor.orangeColor() } func SKSpriteNodeDemo() { var Texture = SKTexture(imageNamed: "desert_BG") var BackgroundSprite = SKSpriteNode(texture: Texture) BackgroundSprite.size = CGSizeMake(640, 320) BackgroundSprite.position = CGPointMake(0, 0) BackgroundSprite.anchorPoint = CGPointMake(0, 0) BackgroundSprite.name = "BackgroundSprite" self.addChild(BackgroundSprite) var SimpleSprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSizeMake(50, 50)) SimpleSprite.position = CGPointMake(200, 150) SimpleSprite.zPosition = 1; SimpleSprite.name = "SimpleSprite" self.addChild(SimpleSprite) var ImageSprite = SKSpriteNode(imageNamed: "DerevoOpora") ImageSprite.position = CGPointMake(250, 50) ImageSprite.size = CGSizeMake(100, 15) ImageSprite.name = "ImageSprite" self.addChild(ImageSprite) } func SKShapeNodeDemo() { var Circle = SKShapeNode(circleOfRadius: 20) Circle.position = CGPointMake(50, 200) Circle.lineWidth = 10 Circle.strokeColor = SKColor.blueColor() Circle.fillColor = SKColor.redColor() Circle.name = "Circle" self.addChild(Circle) var Quad = SKShapeNode(rect: CGRectMake(0, 0, 50, 50)) Quad.position = CGPointMake(100, 200) Quad.lineWidth = 4 Quad.strokeColor = SKColor.whiteColor() Quad.fillColor = SKColor.blackColor() Quad.name = "Quad" self.addChild(Quad) var Ellips = SKShapeNode(ellipseInRect: CGRectMake(0, 0, 50, 90)) Ellips.position = CGPointMake(200, 200) Ellips.lineWidth = 2 Ellips.strokeColor = SKColor.greenColor() Ellips.fillColor = SKColor.purpleColor() Ellips.glowWidth = 5 Ellips.name = "Ellips" self.addChild(Ellips) var RoundedRectPath = UIBezierPath(roundedRect: CGRectMake(0, 0, 50, 50), cornerRadius: 12) var RoundedRect = SKShapeNode(path: RoundedRectPath.CGPath, centered:true) RoundedRect.position = CGPointMake(50, 100) RoundedRect.lineWidth = 2 RoundedRect.strokeColor = SKColor.blueColor() RoundedRect.fillColor = SKColor.redColor() RoundedRect.name = "RoundedRect" self.addChild(RoundedRect) var TrianglePath = UIBezierPath() TrianglePath.moveToPoint(CGPointMake(0, 0)) TrianglePath.addLineToPoint(CGPointMake(-25, -50)) TrianglePath.addLineToPoint(CGPointMake(25, -50)) TrianglePath.addLineToPoint(CGPointMake(0, 0)) var Triangle = SKShapeNode(path: TrianglePath.CGPath, centered: true) Triangle.position = CGPointMake(200, 70) Triangle.lineWidth = 2 Triangle.strokeColor = SKColor.blackColor() Triangle.fillColor = SKColor.blueColor() Triangle.name = "Triangle" self.addChild(Triangle) } func SKLabelNodeDemo() { var First = SKLabelNode(fontNamed: "Chalkduster") First.position = CGPointMake(280, 200) First.fontSize = 25; First.fontColor = SKColor.whiteColor() First.color = SKColor.blueColor() First.colorBlendFactor = 0.5 First.text = "Habra Habr!" First.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center self.addChild(First) var Second = SKLabelNode(text: "----") Second.fontName = "Chalkboard SE Bold" Second.fontColor = SKColor.blackColor() Second.position = CGPointMake(280, 50) Second.fontSize = 20 self.addChild(Second) } } 


ご芧のずおり、SKLabelNodeは非垞に䜿いやすく、非垞にシンプルですらありたす
3 . . , , , : (, , , ).
?



!




! , — . — . , ! , ! «» . SKPhysicsBody

SKPhysicsBody


SKPhysicsBody-これは基本的にオブゞェクトの本䜓です。それは私たちのオブゞェクトのすべおの基本的な物理的特性を担っおいる、それがそれらに物理的圢態を䞎えおいる、それが摩擊、匟性、抵抗、質量、速床、重力 などの特性を担っおいるのはそれです。

圌に぀いおもっず詳しく知りたしょう。もちろん、圌のプロパティ、メ゜ッド、たたは関数から始めたしょう。

物件
1) dynamic — No, .
2) usesPreciseCollisionDetection — NO. YES, , , , .
3) allowsRotation — NO. YES !
4) pinned — NO, YES , , .
5) resting — YES, .
6) friction — , . .
7) charge — . .
8) restitution — ( , )
( 0.1 — 1.0). 0.2.

9) linearDamping — .
( 0.1 — 1.0). 0.1.

10) angularDamping — .
( 0.1 — 1.0). 0.1.

11) density — . 0.1.
12) mass — .
13) area — .
14) affectedByGravity — YES, NO .
15) fieldBitMask — ,
16) categoryBitMask — , .
17) collisionBitMask — , .
18) contactTestBitMask — ,
19) joints — , . (Joint — , )
20) node — Node .
21) velocity — .
22) angularVelocity — .



1) bodyWithCircleOfRadius — r — .
2) bodyWithCircleOfRadius — r — center — , .
3) bodyWithRectangleOfSize — s — .
4) bodyWithRectangleOfSize — s — center — , .
5) bodyWithPolygonFromPath — path — .
6) bodyWithEdgeFromPoint — p1 — p2 — , .
7) bodyWithEdgeChainFromPath — path — , — .
8) bodyWithEdgeLoopFromPath — path — , .
9) bodyWithEdgeLoopFromRect — rect — , .
10) bodyWithTexture — texture — size — .
11) bodyWithTexture — texture — alphaThreshold — size — , alphaThreshold.
12) bodyWithBodies — bodies — .



1) applyForce — force — .
2) applyForce — force — point — . ( — )
3) applyTorque — torque — .
4) applyImpulse — impulse — .
5) applyImpulse — impulse — point — . ( — )
6) applyAngularImpulse — impulse — .
7) allContactedBodiesは - 身䜓ず接觊しおいる物理的な䜓の配列を返したす。

そのため、䞊蚘ではSKPhysicsBodyオブゞェクトのすべおのメ゜ッドたたは関数ずプロパティが衚瀺されたす。あなたが芋るこずができるように、圌はそれらのいく぀かを持っおいたす。
䞊蚘の点のいく぀かは、あなたには思えるかもしれないこずを私はすぐに蚀わなければなりたせん理解できないか理解するのは難しいです。䜕かを理解しなくおも心配しないでください。さらに、私たちは数回を数回怜蚎し、実隓したす

さお、続けたしょうが、始める前に䜕かしなければなりたせん
私たちののViewControllerを芋぀けお、私たちに远加しおみたしょうSKViewこのプロパティ

Objective-Cのの
 skView.showsPhysics = YES; 

スむフト
 skView.showsPhysics = true 


, . , !

, SceneSetting
, . .
Objective-c
  self.physicsWorld.gravity = CGVectorMake(0, -1); 

Swift
  self.physicsWorld.gravity = CGVectorMake(0, -1) 


身䜓の物理孊は3぀のカテゎリに分類できたす
。1動的-䜓の䜍眮を倉曎できる身䜓。
2静的-䜍眮を倉曎できないボディ。
3゚ッゞ-䞀皮の境界線。

ダむナミック
ダむナミックボディは、ステヌゞ䞊で䜕かを動かしたり、䞀緒に抌したりしたい堎合に最適です。シェル、空飛ぶオブゞェクト、すべおのアニメヌションキャラクタヌなどがありたす。それらは質量ず䜓積を持ち、重力の圱響を受け、基本的な物理的性質を垯びるこずがありたす。

静的
静的ボディ。それらはすべお動的なものず同じものを持っおいたすが、䞻な違いは移動できないこずですただし、他のオブゞェクトは䟝然ずしお衝突しお盞互䜜甚するこずができたす。たずえば、䞀郚のサポヌトや壁に䜿甚するのが最適です。それは倚くのスペヌスを占有したす。

EDGE
EDGEは本質的に物理的な身䜓ではなく、すべおの盞互䜜甚が起こる境界です。それらには質量も䜓積もなく、移動できたせん
EDGEは、オブゞェクトの内郚たたは芋えない境界に䞭空郚分を提䟛するために䜿甚されたす。



䞊の画像を芋おみたしょう。5぀のオブゞェクトが衚瀺されたす。異なるタむプのオブゞェクトを遞択しお、それらの違いを確認できるようにしたした。
さお、それらをもっず詳しく芋おみたしょう

Objective-c
Objective-c
 -(void)CreatePhysics { //  SKShapeNode   .         (CGRectMake). SKShapeNode *RectanglePhysics = [SKShapeNode shapeNodeWithRect:CGRectMake(-580/2, -10, 580, 20)]; RectanglePhysics.position = CGPointMake(280, 40); //  . RectanglePhysics.fillColor = [SKColor whiteColor]; //   . RectanglePhysics.name = @"Rectangle"; //  . RectanglePhysics.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:RectanglePhysics.frame.size]; //   . RectanglePhysics.physicsBody.dynamic = NO; //   . [self addChild:RectanglePhysics]; //      . //   SKShapeNode   .     . SKShapeNode *CirclePhysics = [SKShapeNode shapeNodeWithCircleOfRadius:40]; CirclePhysics.position = CGPointMake(100, 160); //  . CirclePhysics.strokeColor = [SKColor greenColor]; //   . CirclePhysics.lineWidth = 5; //   . CirclePhysics.name = @"Circle"; //  . CirclePhysics.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:40]; //   . CirclePhysics.physicsBody.dynamic = YES; //   . [self addChild:CirclePhysics]; //      . //    SKTexture   .      . SKTexture *Texture = [SKTexture textureWithImageNamed:@"DerevoOpora"]; //   SKSpriteNode   .       SKTexture. SKSpriteNode *TexturePhysics = [SKSpriteNode spriteNodeWithTexture:Texture]; TexturePhysics.position = CGPointMake(200, 180); //  . TexturePhysics.size = CGSizeMake(100, 30); //  . TexturePhysics.name = @"TexturePhysics"; //  . TexturePhysics.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:TexturePhysics.frame.size]; //   . TexturePhysics.physicsBody.dynamic = YES; // //   . [self addChild: TexturePhysics]; //      . UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; //      UIBezierPath. [TrianglePath moveToPoint:CGPointMake(0,0)]; //      . [TrianglePath addLineToPoint:CGPointMake(-50, -100)]; //     . [TrianglePath addLineToPoint:CGPointMake(50, -100)]; //     . [TrianglePath addLineToPoint:CGPointMake(0, 0)]; //     . //   SKShapeNode   .        . //    ,         CGPath. SKShapeNode *TrianglePhysics = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath ]; TrianglePhysics.position = CGPointMake(400, 190); //  . TrianglePhysics.lineWidth = 2; //   . TrianglePhysics.strokeColor = [SKColor blackColor]; //   . TrianglePhysics.fillColor = [SKColor blueColor]; //   . TrianglePhysics.name = @"Triangle"; //  . TrianglePhysics.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:TrianglePath.CGPath]; //   . TrianglePhysics.physicsBody.dynamic = YES; //   . [self addChild:TrianglePhysics]; //      . //  SKLabelNode   .     . SKLabelNode *LabelPhysics = [SKLabelNode labelNodeWithText:@"Xcode"]; LabelPhysics.position = CGPointMake(500, 200); //  . LabelPhysics.fontSize = 22; //   . LabelPhysics.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(-25, -25, 50, 50)]; //   . LabelPhysics.name = @"Label"; //   . [self addChild:LabelPhysics]; //      . } 


スむフト
スむフト
 func CreatePhysics() { //   RectanglePhysics      SKShapeNode. //         (CGRectMake). var RectanglePhysics = SKShapeNode(rect: CGRectMake(-580/2, -10, 580, 20)) RectanglePhysics.position = CGPointMake(280, 40) //  . RectanglePhysics.fillColor = SKColor.whiteColor() //   . RectanglePhysics.name = "Rectangle" //  . RectanglePhysics.physicsBody = SKPhysicsBody(rectangleOfSize: RectanglePhysics.frame.size) //   . RectanglePhysics.physicsBody.dynamic = false //   . self.addChild(RectanglePhysics) //      . //  CirclePhysics      SKShapeNode. //     . var CirclePhysics = SKShapeNode(circleOfRadius: 40) CirclePhysics.position = CGPointMake(100, 160) //  . CirclePhysics.strokeColor = SKColor.greenColor() //   . CirclePhysics.lineWidth = 5; //   . CirclePhysics.name = "Circle" //  . CirclePhysics.physicsBody = SKPhysicsBody(circleOfRadius: 40) //   . CirclePhysics.physicsBody.dynamic = true //   . self.addChild(CirclePhysics) //      . //   Texture      SKTexture.        let Texture = SKTexture(imageNamed: "DerevoOpora") //   TexturePhysics      SKSpriteNode. //       SKTexture   . var TexturePhysics = SKSpriteNode(texture: Texture) TexturePhysics.position = CGPointMake(200, 180) //  . TexturePhysics.size = CGSizeMake(100, 30) //  . TexturePhysics.name = "TexturePhysics" //  . TexturePhysics.physicsBody = SKPhysicsBody(rectangleOfSize: TexturePhysics.frame.size) //   . TexturePhysics.physicsBody.dynamic = true //   . self.addChild(TexturePhysics) //      . var TrianglePath = UIBezierPath() //      UIBezierPath. TrianglePath.moveToPoint(CGPointMake(0, 0)) //      . TrianglePath.addLineToPoint(CGPointMake(-50, -100)) //     . TrianglePath.addLineToPoint(CGPointMake(50, -100)) //     . TrianglePath.addLineToPoint(CGPointMake(0, 0)) //     . //   TrianglePhysics      SKShapeNode. //         //    ,          CGPath. var TrianglePhysics = SKShapeNode(path: TrianglePath.CGPath) TrianglePhysics.position = CGPointMake(400, 190) //  . TrianglePhysics.lineWidth = 2 //   . TrianglePhysics.strokeColor = SKColor.blackColor() //   . TrianglePhysics.fillColor = SKColor.blueColor() //   . TrianglePhysics.name = "Triangle" //  . TrianglePhysics.physicsBody = SKPhysicsBody(polygonFromPath: TrianglePath.CGPath) //   . TrianglePhysics.physicsBody.dynamic = true //   . self.addChild(TrianglePhysics) //      . //   LabelPhysics      SKLabelNode.     . var LabelPhysics = SKLabelNode(text: "Xcode") LabelPhysics.position = CGPointMake(500, 200) //  . LabelPhysics.fontSize = 22; //   . LabelPhysics.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(-25, -25, 50, 50)) //   . LabelPhysics.name = "Label" //  . self.addChild(LabelPhysics) //      . } 



RectanglePhysics

最初のオブゞェクトの名前は RectanglePhysicsです。その基本的なプロパティが䜕をするか既に知っおいるので、私はそれらにこだわるこずなく、新しいプロパティに盎接行きたせん。ご芧のずおり、最初はオブゞェクトの physicsBodyプロパティを参照し、タむプ SKPhysicsBodyのオブゞェクトを割り圓おたす。これは、スプラむトに肉䜓を䞎えるために必芁です。䞊で曞いた SKPhysicsBodyの

メ゜ッドたたは関数を泚意深く調べた堎合、プロパティずしお枡すオブゞェクトは、 bodyWithRectangleOfSizeメ゜ッドたたは rectangleOfSize関数を呌び出すこずで初期化されるこずがわかりたす。そしお、それが初期化されるず、スプラむトのサむズを転送したす。すでにその䞊に私たちの身䜓が構築されおいたす。

蚀及する䟡倀のある重芁なポむントが1぀ありたす。
スプラむト自䜓ではなく、その肉䜓でタッチや接觊が発生したす
この堎合、スプラむト自䜓よりも小さいボディサむズを指定するず、オブゞェクトが物理ボディに含たれおいない郚分に觊れるず別のスプラむトを貫通し、スプラむトサむズよりも倧きいボディサむズを指定するず、スプラむトシェル自䜓は接觊しおいないように芋えたす、および非衚瀺の境界線。以䞋の画像では、これらのケヌスの䟋を瀺したした


身䜓を蚭定した埌、別のプロパティを蚭定したす。それはdynamicです。
䞊で曞いたように、オブゞェクトのダむナミズムの原因ずなっおいたす。ここでは負の倀を割り圓おたす。これは、オブゞェクトが移動できなくなるこずを意味したす。これは、サポヌトサヌフェスずしお理想的です。


サヌクル物理孊
CirclePhysics . . : SKPhysicsBody bodyWithCircleOfRadius circleOfRadius . dynamic , , . , , !

. , .
, : , , ! , , !



TexturePhysics
TexturePhysics . , . , , dynamic , !

TrianglePhysics
, TrianglePhysics . , UIBezierPath . , SKPhysicsBody . polygonFromPath bodyWithPolygonFromPath . (-) ? UIBezierPath TrianglePath .
!



LabelPhysics
LabelPhysics . , SKPhysicsBody , bodyWithEdgeLoopFromRect edgeLoopFromRect . 圌らは䜕をしおいたすか , (CGRectMake) (EDGE). . , showsPhysics , . , ! EDGE, , . . , . , ; EDGE.



いく぀かの物理的特性の比范

そしお、友人、あなた、そしお私は私たちのオブゞェクトのために物理的ボディを䜜成する方法を孊びたした。そしお今、物理的特性を芋る時です。以䞋のビデオでは、いく぀かの物理的特性の比范を確認できたす。最初に芋たように、同じサむズで同じ高さの2぀のボヌルが萜ちたす。萜䞋するず、䞀方は跳ね返り、もう䞀方は跳ね返りたせん。同じサむズの2぀の正方圢も衚瀺されたす。それらは同じ高さから萜ちたすが、すでに傟斜した衚面にありたす。片方はスラむドしお転倒し、もう䞀方は逆にすぐに停止したす。これはすべお、いく぀かの物理的特性のデモンストレヌションです。コヌドにたっすぐ進んでください



それでは、コヌドを芋おみたしょう

Objective-c
Objective-c
 -(void)PhysicsProperties { float RotateAngle = 10 * (2 * M_PI)/360; SKShapeNode *Opora1 = [SKShapeNode shapeNodeWithRect:CGRectMake(-150/2, -10, 150, 20)]; Opora1.position = CGPointMake(100, 200); Opora1.strokeColor = [SKColor greenColor]; Opora1.fillColor = [SKColor greenColor]; Opora1.name = @"Opora1"; Opora1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora1.frame.size]; Opora1.physicsBody.dynamic = NO; Opora1.zRotation = -RotateAngle; [self addChild:Opora1]; SKShapeNode *Opora2 = [SKShapeNode shapeNodeWithRect:CGRectMake(-150/2, -10, 150, 20)]; Opora2.position = CGPointMake(468, 200); Opora2.strokeColor = [SKColor redColor]; Opora2.fillColor = [SKColor redColor]; Opora2.name = @"Opora2"; Opora2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora2.frame.size]; Opora2.physicsBody.dynamic = NO; Opora2.zRotation = RotateAngle; [self addChild:Opora2]; SKShapeNode *Opora3 = [SKShapeNode shapeNodeWithRect:CGRectMake(-568/2, -10, 568, 20)]; Opora3.position = CGPointMake(568/2, 10); Opora3.strokeColor = [SKColor yellowColor]; Opora3.fillColor = [SKColor yellowColor]; Opora3.name = @"Opora3"; Opora3.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora3.frame.size]; Opora3.physicsBody.dynamic = NO; [self addChild:Opora3]; SKShapeNode *Circle1 = [SKShapeNode shapeNodeWithCircleOfRadius:15]; Circle1.position = CGPointMake(250, 280); Circle1.strokeColor = [SKColor whiteColor]; Circle1.fillColor = [SKColor blackColor]; Circle1.name = @"Circle1"; Circle1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15]; Circle1.physicsBody.restitution = 0; [self addChild:Circle1]; SKShapeNode *Circle2 = [SKShapeNode shapeNodeWithCircleOfRadius:15]; Circle2.position = CGPointMake(310, 280); Circle2.strokeColor = [SKColor whiteColor]; Circle2.fillColor = [SKColor purpleColor]; Circle2.name = @"Circle2"; Circle2.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15]; Circle2.physicsBody.restitution = 0.7; [self addChild:Circle2]; SKShapeNode *Quad1 = [SKShapeNode shapeNodeWithRect:CGRectMake(-30/2, -30/2, 30, 30)]; Quad1.position = CGPointMake(50, 320); Quad1.strokeColor = [SKColor whiteColor]; Quad1.fillColor = [SKColor whiteColor]; Quad1.name = @"Quad1"; Quad1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Quad1.frame.size]; Quad1.physicsBody.friction = 1; [self addChild:Quad1]; SKShapeNode *Quad2 = [SKShapeNode shapeNodeWithRect:CGRectMake(-30/2, -30/2, 30, 30)]; Quad2.position = CGPointMake(518, 320); Quad2.strokeColor = [SKColor blackColor]; Quad2.fillColor = [SKColor blackColor]; Quad2.name = @"Quad2"; Quad2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Quad2.frame.size]; Quad2.physicsBody.friction = 0.1; [self addChild:Quad2]; } 

スむフト
スむフト
  func PhysicsProperties() { let RotateAngle = 10 * (2 * M_PI)/360 var Opora1 = SKShapeNode(rect: CGRectMake(-150/2, -10, 150, 20)) Opora1.position = CGPointMake(100, 200) Opora1.strokeColor = SKColor.greenColor() Opora1.fillColor = SKColor.greenColor() Opora1.name = "Opora1" Opora1.physicsBody = SKPhysicsBody(rectangleOfSize: Opora1.frame.size) Opora1.physicsBody.dynamic = false Opora1.zRotation = Float(-RotateAngle) self.addChild(Opora1) var Opora2 = SKShapeNode(rect: CGRectMake(-150/2, -10, 150, 20)) Opora2.position = CGPointMake(468, 200) Opora2.strokeColor = SKColor.redColor() Opora2.fillColor = SKColor.redColor() Opora2.name = "Opora2" Opora2.physicsBody = SKPhysicsBody(rectangleOfSize: Opora2.frame.size) Opora2.physicsBody.dynamic = false Opora2.zRotation = Float(RotateAngle) self.addChild(Opora2) var Opora3 = SKShapeNode(rect:CGRectMake (-568/2, -10, 568, 20)) Opora3.position = CGPointMake(568/2, 10) Opora3.strokeColor = SKColor.yellowColor() Opora3.fillColor = SKColor.yellowColor() Opora3.name = "Opora3" Opora3.physicsBody = SKPhysicsBody(rectangleOfSize: Opora3.frame.size) Opora3.physicsBody.dynamic = false self.addChild(Opora3) var Circle1 = SKShapeNode(circleOfRadius: 15) Circle1.position = CGPointMake(250, 280) Circle1.strokeColor = SKColor.whiteColor() Circle1.fillColor = SKColor.blackColor() Circle1.name = "Circle1" Circle1.physicsBody = SKPhysicsBody(circleOfRadius: 15) Circle1.physicsBody.restitution = 0 self.addChild(Circle1) var Circle2 = SKShapeNode(circleOfRadius: 15) Circle2.position = CGPointMake(310, 280) Circle2.strokeColor = SKColor.whiteColor() Circle2.fillColor = SKColor.purpleColor() Circle2.name = "Circle2" Circle2.physicsBody = SKPhysicsBody(circleOfRadius: 15) Circle2.physicsBody.restitution = 0.7 self.addChild(Circle2) var Quad1 = SKShapeNode(rect: CGRectMake (-30/2, -30/2, 30, 30)) Quad1.position = CGPointMake(50, 320) Quad1.strokeColor = SKColor.whiteColor() Quad1.fillColor = SKColor.whiteColor() Quad1.name = "Quad1" Quad1.physicsBody = SKPhysicsBody(rectangleOfSize: Quad1.frame.size) Quad1.physicsBody.friction = 1 self.addChild(Quad1) var Quad2 = SKShapeNode(rect: CGRectMake (-30/2, -30/2, 30, 30)) Quad2.position = CGPointMake(518, 320) Quad2.strokeColor = SKColor.blackColor() Quad2.fillColor = SKColor.blackColor() Quad2.name = "Quad2" Quad2.physicsBody = SKPhysicsBody(rectangleOfSize: Quad2.frame.size) Quad2.physicsBody.friction = 0.1 self.addChild(Quad2) } 


初めに、私は型の2぀のオブゞェクトを䜜成SKShapeNode名前で、Opora1ずOpora2を。ビデオでは、これらはそれぞれ緑ず赀の傟斜したオブゞェクトです。䞊で曞いたzRotationプロパティを陀いお、それらの䜜成に異垞なものはありたせんが、今のずころ䜿甚しおいたせん。芚えおいるずおり
zRotation-オむラヌの角でノヌドの回転を決定したす。

zRotationプロパティは、ラゞアン単䜍で倀を取りたすしたがっお、オブゞェクトを特定の角床で回転させるには、たずこの角床をラゞアンに倉換する必芁がありたす。これは非垞に簡単に行われたす

Objective-c
RotateAngleずいうfloat型の倉数を䜜成したす
 float RotateAngle = 10 * (2 * M_PI)/360; 

10, . 60 , :

 float RotateAngle = 60 * (2 * M_PI)/360; 

zRotation :
 Opora1.zRotation = -RotateAngle; 


Swift
let RotateAngle
 let RotateAngle = 10 * (2 * M_PI)/360 

Objective-c , float
 Opora1.zRotation = Float(-RotateAngle) 

ご芧のずおり、オブゞェクトを回転させるのに耇雑なこずはありたせん

次に、䞀番䞋が黄色のOpora3ずいう名前の別のオブゞェクトを䜜成したすが、このオブゞェクトを䜜成するのにも異垞はないため、先に進みたす。そしお、さらに2぀のオブゞェクトがありたす。名前はCircle1ずCircle2の円です。それらの構造では、それらは互いに非垞に䌌おいたすが、物理的特性に違いがありたす。それらの物理的な圢匏はたったく同じですが、プロパティは異なりたす。思い出すように

名前の反発を持぀プロパティは以䞋を定矩したす。
埩元 - 衝突で䜓が倱う゚ネルギヌの量衝突で䜓が跳ねる量
を決定したす0.1〜1.0の倀を取りたす。デフォルトは0.2です。

したがっお、Circle1ずいう名前のオブゞェクトでは倀を「0」に蚭定し、Circle2ずいう名前の別のオブゞェクトでは倀「1」に蚭定したす。このプロパティの倀を倉曎するず、他のオブゞェクトずの衝突におけるオブゞェクトの動䜜に圱響したす。ビデオで芋るこずができるように、2぀のボヌルの1぀が萜䞋するず跳ね返り、もう1぀のボヌルは動かない状態になりたす。これはすべお、このプロパティのアクションの結果です。

別の䟋では、Quad1およびQuad2ずいう名前の2぀の他のオブゞェクトを芳察できたす。それらは圢が正方圢であり、摩擊ずいう名前の物理的性質を陀いおすべおで同じです。
æ‘©æ“Š - ボディの衚面の粗さを決定したす。身䜓ず接觊する摩擊力の蚈算に䜿甚されたす。

1぀のオブゞェクトではその倀は「1」、もう1぀のオブゞェクトでは「0.1」であり、その結果、1぀の正方圢は衚面䞊でほずんどスリップせず、もう1぀は衚面党䜓をスリップしお萜䞋したす。Objective-c

プロゞェクトの完党なコヌド

Objective-c
 #import "GameScene.h" @implementation GameScene -(void)didMoveToView:(SKView *)view { [self SceneSetting]; //[self SKSpriteNodeDemo]; //[self SKShapeNodeDemo]; //[self SKLabelNodeDemo]; //[self CreatePhysics]; [self PhysicsProperties]; } -(void)SceneSetting { self.backgroundColor = [SKColor orangeColor]; self.physicsWorld.gravity = CGVectorMake(0, -1); } -(void)PhysicsProperties { float RotateAngle = 10 * (2 * M_PI)/360; SKShapeNode *Opora1 = [SKShapeNode shapeNodeWithRect:CGRectMake(-150/2, -10, 150, 20)]; Opora1.position = CGPointMake(100, 200); Opora1.strokeColor = [SKColor greenColor]; Opora1.fillColor = [SKColor greenColor]; Opora1.name = @"Opora1"; Opora1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora1.frame.size]; Opora1.physicsBody.dynamic = NO; Opora1.zRotation = -RotateAngle; [self addChild:Opora1]; SKShapeNode *Opora2 = [SKShapeNode shapeNodeWithRect:CGRectMake(-150/2, -10, 150, 20)]; Opora2.position = CGPointMake(468, 200); Opora2.strokeColor = [SKColor redColor]; Opora2.fillColor = [SKColor redColor]; Opora2.name = @"Opora2"; Opora2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora2.frame.size]; Opora2.physicsBody.dynamic = NO; Opora2.zRotation = RotateAngle; [self addChild:Opora2]; SKShapeNode *Opora3 = [SKShapeNode shapeNodeWithRect:CGRectMake(-568/2, -10, 568, 20)]; Opora3.position = CGPointMake(568/2, 10); Opora3.strokeColor = [SKColor yellowColor]; Opora3.fillColor = [SKColor yellowColor]; Opora3.name = @"Opora3"; Opora3.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Opora3.frame.size]; Opora3.physicsBody.dynamic = NO; [self addChild:Opora3]; SKShapeNode *Circle1 = [SKShapeNode shapeNodeWithCircleOfRadius:15]; Circle1.position = CGPointMake(250, 280); Circle1.strokeColor = [SKColor whiteColor]; Circle1.fillColor = [SKColor blackColor]; Circle1.name = @"Circle1"; Circle1.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15]; Circle1.physicsBody.restitution = 0; [self addChild:Circle1]; SKShapeNode *Circle2 = [SKShapeNode shapeNodeWithCircleOfRadius:15]; Circle2.position = CGPointMake(310, 280); Circle2.strokeColor = [SKColor whiteColor]; Circle2.fillColor = [SKColor purpleColor]; Circle2.name = @"Circle2"; Circle2.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:15]; Circle2.physicsBody.restitution = 0.7; [self addChild:Circle2]; SKShapeNode *Quad1 = [SKShapeNode shapeNodeWithRect:CGRectMake(-30/2, -30/2, 30, 30)]; Quad1.position = CGPointMake(50, 320); Quad1.strokeColor = [SKColor whiteColor]; Quad1.fillColor = [SKColor whiteColor]; Quad1.name = @"Quad1"; Quad1.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Quad1.frame.size]; Quad1.physicsBody.friction = 1; [self addChild:Quad1]; SKShapeNode *Quad2 = [SKShapeNode shapeNodeWithRect:CGRectMake(-30/2, -30/2, 30, 30)]; Quad2.position = CGPointMake(518, 320); Quad2.strokeColor = [SKColor blackColor]; Quad2.fillColor = [SKColor blackColor]; Quad2.name = @"Quad2"; Quad2.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:Quad2.frame.size]; Quad2.physicsBody.friction = 0.1; [self addChild:Quad2]; } -(void)CreatePhysics { SKShapeNode *RectanglePhysics = [SKShapeNode shapeNodeWithRect:CGRectMake(-580/2, -10, 580, 20)]; RectanglePhysics.position = CGPointMake(280, 40); RectanglePhysics.fillColor = [SKColor whiteColor]; RectanglePhysics.name = @"Rectangle"; RectanglePhysics.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:RectanglePhysics.frame.size]; RectanglePhysics.physicsBody.dynamic = NO; [self addChild:RectanglePhysics]; SKShapeNode *CirclePhysics = [SKShapeNode shapeNodeWithCircleOfRadius:40]; CirclePhysics.position = CGPointMake(100, 160); CirclePhysics.strokeColor = [SKColor greenColor]; CirclePhysics.lineWidth = 5; CirclePhysics.name = @"Circle"; CirclePhysics.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:40]; CirclePhysics.physicsBody.dynamic = YES; [self addChild:CirclePhysics]; SKTexture *Texture = [SKTexture textureWithImageNamed:@"DerevoOpora"]; SKSpriteNode *TexturePhysics = [SKSpriteNode spriteNodeWithTexture:Texture]; TexturePhysics.position = CGPointMake(200, 180); TexturePhysics.size = CGSizeMake(100, 30); TexturePhysics.name = @"TexturePhysics"; TexturePhysics.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:TexturePhysics.frame.size]; TexturePhysics.physicsBody.dynamic = YES; [self addChild: TexturePhysics]; UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; [TrianglePath moveToPoint:CGPointMake(0,0)]; [TrianglePath addLineToPoint:CGPointMake(-50, -100)]; [TrianglePath addLineToPoint:CGPointMake(50, -100)]; [TrianglePath addLineToPoint:CGPointMake(0, 0)]; SKShapeNode *TrianglePhysics = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath ]; TrianglePhysics.position = CGPointMake(400, 190); TrianglePhysics.lineWidth = 2; TrianglePhysics.strokeColor = [SKColor blackColor]; TrianglePhysics.fillColor = [SKColor blueColor]; TrianglePhysics.name = @"Triangle"; TrianglePhysics.physicsBody = [SKPhysicsBody bodyWithPolygonFromPath:TrianglePath.CGPath]; TrianglePhysics.physicsBody.dynamic = YES; [self addChild:TrianglePhysics]; SKLabelNode *LabelPhysics = [SKLabelNode labelNodeWithText:@"Xcode"]; LabelPhysics.position = CGPointMake(500, 200); LabelPhysics.fontSize = 22; LabelPhysics.physicsBody = [SKPhysicsBody bodyWithEdgeLoopFromRect:CGRectMake(-25, -25, 50, 50)]; LabelPhysics.name = @"Label"; [self addChild:LabelPhysics]; } -(void)SKSpriteNodeDemo { SKTexture *Texture = [SKTexture textureWithImageNamed:@"desert_BG"]; SKSpriteNode *BackgroundSprite = [SKSpriteNode spriteNodeWithTexture:Texture]; BackgroundSprite.size = CGSizeMake(640, 320); BackgroundSprite.position = CGPointMake(0, 0); BackgroundSprite.anchorPoint = CGPointMake(0, 0); BackgroundSprite.name = @"BackgroundSprite"; [self addChild:BackgroundSprite]; SKSpriteNode *SimpleSprite = [SKSpriteNode spriteNodeWithColor:[UIColor blueColor] size:CGSizeMake(50, 50)]; SimpleSprite.position = CGPointMake(200, 150); SimpleSprite.zPosition = 1; SimpleSprite.name = @"SimpleSprite"; [self addChild:SimpleSprite]; SKSpriteNode *ImageSprite = [SKSpriteNode spriteNodeWithImageNamed:@"DerevoOpora"]; ImageSprite.position = CGPointMake(250, 50); ImageSprite.size = CGSizeMake(100, 15); ImageSprite.name = @"ImageSprite"; [self addChild:ImageSprite]; } -(void)SKShapeNodeDemo { SKShapeNode *Circle = [SKShapeNode shapeNodeWithCircleOfRadius:20]; Circle.position = CGPointMake(50, 200); Circle.lineWidth = 10; Circle.strokeColor = [SKColor blueColor]; Circle.fillColor = [SKColor redColor]; Circle.name = @"Circle"; [self addChild:Circle]; SKShapeNode *Quad = [SKShapeNode shapeNodeWithRect:CGRectMake(0, 0, 50, 50)]; Quad.position = CGPointMake(100, 200); Quad.lineWidth = 4; Quad.strokeColor = [SKColor whiteColor]; Quad.fillColor = [SKColor blackColor]; Quad.name = @"Quad"; [self addChild:Quad]; SKShapeNode *Ellips = [SKShapeNode shapeNodeWithEllipseInRect:CGRectMake(0, 0, 50, 90)]; Ellips.position = CGPointMake(200, 200); Ellips.lineWidth = 2; Ellips.strokeColor = [SKColor greenColor]; Ellips.fillColor = [SKColor purpleColor]; Ellips.glowWidth = 5; Ellips.name = @"Ellips"; [self addChild:Ellips]; UIBezierPath *RoundedRectPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 50, 50) cornerRadius:12]; SKShapeNode *RoundedRect = [ SKShapeNode shapeNodeWithPath:RoundedRectPath.CGPath centered:YES]; RoundedRect.position = CGPointMake(50, 100); RoundedRect.lineWidth = 2; RoundedRect.strokeColor = [SKColor blueColor]; RoundedRect.fillColor = [SKColor redColor]; RoundedRect.name = @"RoundedRect"; [self addChild:RoundedRect]; UIBezierPath *TrianglePath = [UIBezierPath bezierPath]; [TrianglePath moveToPoint:CGPointMake(0,0)]; [TrianglePath addLineToPoint:CGPointMake(-25, -50)]; [TrianglePath addLineToPoint:CGPointMake(25, -50)]; [TrianglePath addLineToPoint:CGPointMake(0, 0)]; SKShapeNode *Triangle = [SKShapeNode shapeNodeWithPath:TrianglePath.CGPath centered:YES]; Triangle.position = CGPointMake(200, 70); Triangle.lineWidth = 2; Triangle.strokeColor = [SKColor blackColor]; Triangle.fillColor = [SKColor blueColor]; Triangle.name = @"Triangle"; [self addChild:Triangle]; } -(void)SKLabelNodeDemo { SKLabelNode *First = [SKLabelNode labelNodeWithFontNamed:@"Chalkduster"]; First.position = CGPointMake(280, 200); First.fontSize = 25; First.fontColor = [SKColor whiteColor]; First.color = [SKColor blueColor]; First.colorBlendFactor = 0.5; First.text = @"Habra Habr!"; First.horizontalAlignmentMode = SKLabelHorizontalAlignmentModeCenter; [self addChild:First]; SKLabelNode *Second = [SKLabelNode labelNodeWithText:@"----"]; Second.fontName = @"Chalkboard SE Bold"; Second.fontColor = [SKColor blackColor]; Second.position = CGPointMake(280, 50); Second.fontSize = 20; [self addChild:Second]; } @end 

スむフト
スむフト
 import SpriteKit class GameScene: SKScene { override func didMoveToView(view: SKView) { SceneSetting() //SKSpriteNodeDemo() //SKShapeNodeDemo() //SKLabelNodeDemo() //CreatePhysics() PhysicsProperties() } func SceneSetting() { self.backgroundColor = SKColor.orangeColor() self.physicsWorld.gravity = CGVectorMake(0, -1); } func PhysicsProperties() { let RotateAngle = 10 * (2 * M_PI)/360 var Opora1 = SKShapeNode(rect: CGRectMake(-150/2, -10, 150, 20)) Opora1.position = CGPointMake(100, 200) Opora1.strokeColor = SKColor.greenColor() Opora1.fillColor = SKColor.greenColor() Opora1.name = "Opora1" Opora1.physicsBody = SKPhysicsBody(rectangleOfSize: Opora1.frame.size) Opora1.physicsBody.dynamic = false Opora1.zRotation = Float(-RotateAngle) self.addChild(Opora1) var Opora2 = SKShapeNode(rect: CGRectMake(-150/2, -10, 150, 20)) Opora2.position = CGPointMake(468, 200) Opora2.strokeColor = SKColor.redColor() Opora2.fillColor = SKColor.redColor() Opora2.name = "Opora2" Opora2.physicsBody = SKPhysicsBody(rectangleOfSize: Opora2.frame.size) Opora2.physicsBody.dynamic = false Opora2.zRotation = Float(RotateAngle) self.addChild(Opora2) var Opora3 = SKShapeNode(rect:CGRectMake (-568/2, -10, 568, 20)) Opora3.position = CGPointMake(568/2, 10) Opora3.strokeColor = SKColor.yellowColor() Opora3.fillColor = SKColor.yellowColor() Opora3.name = "Opora3" Opora3.physicsBody = SKPhysicsBody(rectangleOfSize: Opora3.frame.size) Opora3.physicsBody.dynamic = false self.addChild(Opora3) var Circle1 = SKShapeNode(circleOfRadius: 15) Circle1.position = CGPointMake(250, 280) Circle1.strokeColor = SKColor.whiteColor() Circle1.fillColor = SKColor.blackColor() Circle1.name = "Circle1" Circle1.physicsBody = SKPhysicsBody(circleOfRadius: 15) Circle1.physicsBody.restitution = 0 self.addChild(Circle1) var Circle2 = SKShapeNode(circleOfRadius: 15) Circle2.position = CGPointMake(310, 280) Circle2.strokeColor = SKColor.whiteColor() Circle2.fillColor = SKColor.purpleColor() Circle2.name = "Circle2" Circle2.physicsBody = SKPhysicsBody(circleOfRadius: 15) Circle2.physicsBody.restitution = 0.7 self.addChild(Circle2) var Quad1 = SKShapeNode(rect: CGRectMake (-30/2, -30/2, 30, 30)) Quad1.position = CGPointMake(50, 320) Quad1.strokeColor = SKColor.whiteColor() Quad1.fillColor = SKColor.whiteColor() Quad1.name = "Quad1" Quad1.physicsBody = SKPhysicsBody(rectangleOfSize: Quad1.frame.size) Quad1.physicsBody.friction = 1 self.addChild(Quad1) var Quad2 = SKShapeNode(rect: CGRectMake (-30/2, -30/2, 30, 30)) Quad2.position = CGPointMake(518, 320) Quad2.strokeColor = SKColor.blackColor() Quad2.fillColor = SKColor.blackColor() Quad2.name = "Quad2" Quad2.physicsBody = SKPhysicsBody(rectangleOfSize: Quad2.frame.size) Quad2.physicsBody.friction = 0.1 self.addChild(Quad2) } func CreatePhysics() { var RectanglePhysics = SKShapeNode(rect: CGRectMake(-580/2, -10, 580, 20)) RectanglePhysics.position = CGPointMake(280, 40) RectanglePhysics.fillColor = SKColor.whiteColor() RectanglePhysics.name = "Rectangle" RectanglePhysics.physicsBody = SKPhysicsBody(rectangleOfSize: RectanglePhysics.frame.size) RectanglePhysics.physicsBody.dynamic = false self.addChild(RectanglePhysics) var CirclePhysics = SKShapeNode(circleOfRadius: 40) CirclePhysics.position = CGPointMake(100, 160) CirclePhysics.strokeColor = SKColor.greenColor() CirclePhysics.lineWidth = 5; CirclePhysics.name = "Circle" CirclePhysics.physicsBody = SKPhysicsBody(circleOfRadius: 40) CirclePhysics.physicsBody.dynamic = true self.addChild(CirclePhysics) let Texture = SKTexture(imageNamed: "DerevoOpora") var TexturePhysics = SKSpriteNode(texture: Texture) TexturePhysics.position = CGPointMake(200, 180) TexturePhysics.size = CGSizeMake(100, 30) TexturePhysics.name = "TexturePhysics" TexturePhysics.physicsBody = SKPhysicsBody(rectangleOfSize: TexturePhysics.frame.size) TexturePhysics.physicsBody.dynamic = true self.addChild(TexturePhysics) var TrianglePath = UIBezierPath() TrianglePath.moveToPoint(CGPointMake(0, 0)) TrianglePath.addLineToPoint(CGPointMake(-50, -100)) TrianglePath.addLineToPoint(CGPointMake(50, -100)) TrianglePath.addLineToPoint(CGPointMake(0, 0)) var TrianglePhysics = SKShapeNode(path: TrianglePath.CGPath) TrianglePhysics.position = CGPointMake(400, 190) TrianglePhysics.lineWidth = 2 TrianglePhysics.strokeColor = SKColor.blackColor() TrianglePhysics.fillColor = SKColor.blueColor() TrianglePhysics.name = "Triangle" TrianglePhysics.physicsBody = SKPhysicsBody(polygonFromPath: TrianglePath.CGPath) TrianglePhysics.physicsBody.dynamic = true self.addChild(TrianglePhysics) var LabelPhysics = SKLabelNode(text: "Xcode") LabelPhysics.position = CGPointMake(500, 200) LabelPhysics.fontSize = 22; LabelPhysics.physicsBody = SKPhysicsBody(edgeLoopFromRect: CGRectMake(-25, -25, 50, 50)) LabelPhysics.name = "Label" self.addChild(LabelPhysics) } func SKSpriteNodeDemo() { var Texture = SKTexture(imageNamed: "desert_BG") var BackgroundSprite = SKSpriteNode(texture: Texture) BackgroundSprite.size = CGSizeMake(640, 320) BackgroundSprite.position = CGPointMake(0, 0) BackgroundSprite.anchorPoint = CGPointMake(0, 0) BackgroundSprite.name = "BackgroundSprite" self.addChild(BackgroundSprite) var SimpleSprite = SKSpriteNode(color: UIColor.blueColor(), size: CGSizeMake(50, 50)) SimpleSprite.position = CGPointMake(200, 150) SimpleSprite.zPosition = 1; SimpleSprite.name = "SimpleSprite" self.addChild(SimpleSprite) var ImageSprite = SKSpriteNode(imageNamed: "DerevoOpora") ImageSprite.position = CGPointMake(250, 50) ImageSprite.size = CGSizeMake(100, 15) ImageSprite.name = "ImageSprite" self.addChild(ImageSprite) } func SKShapeNodeDemo() { var Circle = SKShapeNode(circleOfRadius: 20) Circle.position = CGPointMake(50, 200) Circle.lineWidth = 10 Circle.strokeColor = SKColor.blueColor() Circle.fillColor = SKColor.redColor() Circle.name = "Circle" self.addChild(Circle) var Quad = SKShapeNode(rect: CGRectMake(0, 0, 50, 50)) Quad.position = CGPointMake(100, 200) Quad.lineWidth = 4 Quad.strokeColor = SKColor.whiteColor() Quad.fillColor = SKColor.blackColor() Quad.name = "Quad" self.addChild(Quad) var Ellips = SKShapeNode(ellipseInRect: CGRectMake(0, 0, 50, 90)) Ellips.position = CGPointMake(200, 200) Ellips.lineWidth = 2 Ellips.strokeColor = SKColor.greenColor() Ellips.fillColor = SKColor.purpleColor() Ellips.glowWidth = 5 Ellips.name = "Ellips" self.addChild(Ellips) var RoundedRectPath = UIBezierPath(roundedRect: CGRectMake(0, 0, 50, 50), cornerRadius: 12) var RoundedRect = SKShapeNode(path: RoundedRectPath.CGPath, centered:true) RoundedRect.position = CGPointMake(50, 100) RoundedRect.lineWidth = 2 RoundedRect.strokeColor = SKColor.blueColor() RoundedRect.fillColor = SKColor.redColor() RoundedRect.name = "RoundedRect" self.addChild(RoundedRect) var TrianglePath = UIBezierPath() TrianglePath.moveToPoint(CGPointMake(0, 0)) TrianglePath.addLineToPoint(CGPointMake(-25, -50)) TrianglePath.addLineToPoint(CGPointMake(25, -50)) TrianglePath.addLineToPoint(CGPointMake(0, 0)) var Triangle = SKShapeNode(path: TrianglePath.CGPath, centered: true) Triangle.position = CGPointMake(200, 70) Triangle.lineWidth = 2 Triangle.strokeColor = SKColor.blackColor() Triangle.fillColor = SKColor.blueColor() Triangle.name = "Triangle" self.addChild(Triangle) } func SKLabelNodeDemo() { var First = SKLabelNode(fontNamed: "Chalkduster") First.position = CGPointMake(280, 200) First.fontSize = 25; First.fontColor = SKColor.whiteColor() First.color = SKColor.blueColor() First.colorBlendFactor = 0.5 First.text = "Habra Habr!" First.horizontalAlignmentMode = SKLabelHorizontalAlignmentMode.Center self.addChild(First) var Second = SKLabelNode(text: "----") Second.fontName = "Chalkboard SE Bold" Second.fontColor = SKColor.blackColor() Second.position = CGPointMake(280, 50) Second.fontSize = 20 self.addChild(Second) } } 


, . : , . , , . SpriteKit , . , .


さお、友人、ここで私は停止し、私が䞊で曞いたすべおを理解できるようにしたいず思いたす。お気づきかもしれたせんが、SpriteKitは非垞に匷力な゚ンゞンです。アップルのスペシャリストがベストを尜くしたした。もちろん、cocos2dに存圚するような機胜はただありたせんが、SpriteKitは圌よりもずっず若く、圌はただ先を行っおいるず思いたす

この蚘事を曞いおいる間、私は簡単なパズルゲヌムを䜜成しお、SpriteKitの機胜のいく぀かを瀺したした。
残念ながら、私が制埡できない䜕らかの理由で、珟時点では圌女のステヌタスを無料に倉曎するこずはできたせん。しかし、新しいパヌトを曞くこずで、このゲヌムの完党なコヌドをGitHubで公開するこずをお玄束したす 。



画像が少ない


ゲヌムは 次のように呌ばれたすSoul ShiftNext Generation


アプリケヌションの䜜成を孊んでいる人のために、Objective-cおよびSwift蚀語の非垞に優れたビデオチュヌトリアルがありたす。それらはAlexずいう名前の男によっお䜜成されたす。圌はhabrahabrezekiにいたす。各ビデオで、圌は蚀語の䞻芁な偎面を非垞に泚意深く分析し、これを明確に瀺しおいたす。これらのレッスンは、初心者ず既にiOS向けに無料でプログラミングできる人の䞡方にずっお非垞に圹立ちたす。

Objective-c

スむフト



PS フレンズあなたは私の文法䞊の誀りのために私を厳密に刀断しないず思いたす。これは私が䞀生懞呜勉匷する私の第二蚀語ですから。

PPS結論ずしお、ナヌザヌAbyssMoonに感謝したいず思いたす。

Source: https://habr.com/ru/post/J225517/


All Articles