【Swift】SpriteKitの使い方。シェイプノードを使って多角形や円を描画する。(Swift 2.2、XCode 7.3)

2020年6月16日

SKShapeNodeとは

本記事ではSpriteKit Sceneファイルの編集画面(シーンエディタ)で設定できるSKShapeNode(以下、シェイプノード)について説明する。

Shape Node

 

シェイプノードとは、多角形や円などの図形をシーンに描画するノードである。

ベタ塗りの図形を描画することが多いので、主に画像を表示するSKSpriteNodeより高速かと思いきや、パフォーマンスはSKSpriteNodeのほうが高いようなことが公式リファレンスに記載されている。
⇒公式リファレンス「SKShapeNode

the SKSpriteNode class offers higher performance than this class, so use shape nodes sparingly.

 

シェイプノードを使ってみる

実際にシーンに図形を描画してみよう。以降の手順を行う前のXcodeプロジェクトをGitHubに置いたので、試してみる方はご利用下さい。⇒「テスト用プロジェクト

事前準備ではタップすると重力を受けて落下する鳥ノードをSpriteKit Sceneファイル(以下、SKSファイル)に配置しておいた。

 

下図赤枠のSKSファイルを選択してシーンエディタを開く。黄緑枠のオブジェクトライブラリボタンを押して部品一覧を表示し、ドラッグ&ドロップで「Shape Node(Square)」をシーンに配置する(紫矢印)。

黄枠のアトリビュートインスペクタボタンを押して設定画面を表示し、Stroke Colorに赤色、Fill Colorに青色を設定する。

SKShapeNodeをシーンに配置する。

 

以下は実際のプレイ動画

設定項目を説明する

アトリビュートインスペクタの設定項目を1つずつ説明する。

 

Name

ノードの名前を設定する。ソースコードからこのノードにアクセスするときの識別子になる。また、他ノードでParentを指定するときに使われる。

 

Parent

親ノードを設定する。デフォルトではシーン名が設定されている。

子ノードは親ノードと同じ動きをする。例えば、親ノードが回転すると子ノードも一緒に回転する。

 

Position

ノードの座標を設定する。シーンに配置されているノードをドラッグ&ドロップで運ぶと、この設定値も自動で更新される。

 

Z Position

ノードのZ軸の位置を指定する。SKSpriteNodeと意味は同じ。⇒「Z Positionとは

 

Rotation

ノードの回転角度を設定する。アンカーポイントを中心に、指定した角度で回転したノードが表示される。

 

Scale

配置したときの四角形のX方向とY方向大きさをそれぞれ1として、表示する図形の大きさをの倍率で設定する。マイナスは設定できない。

 

Stroke Color

線の色を設定する。

 

Fill Color

図形を塗りつぶす色を設定する。

 

Line Width

線の太さを設定する。

 

Glow Width

アンチエイリアスで描かれている半透明の線の太さを設定する。アンチエイリアスがOFFになっている場合は描画されない。

 

Alpha

図形の透過度を設定する。0は完全に見えなくなり、0.5は半透明、1.0以上は透過されずに見える。

 

Antialiased

チェックを入れると線にアンチエイリアスが適用される。

アンチエイリアスとは、境界線のギザギザ感を目立たなくするために境界線に沿って描く中間色のことをいう。これによって、曲線が滑らかに見える。

アンチエイリアス

 

Stroke Texture

線を画像にする場合に設定する。下図は鳥の画像を設定した場合。

線に画像を使う

 

Fill Texture

図形の塗りつぶしを画像にする場合に設定する。下図は背景画像を設定した場合。

Fill Textureに背景画像を設定

 

円を描画する

SKSファイルで配置するシェイプノードは長方形しか描画することができない。なので、長方形以外の多角形や円形を描画したい場合はソースコードで実装する。

例えば、タップした位置に半径60ポイントの円を描画するにはTestScene.swiftのtouchesBeganメソッドを以下のように変更する。

 

以下は実際のプレイ動画。鳥以外の場所をタップすると円が描画される。

 

物理ボディを設定する

シェイプノードもSKSpriteNodeと同様に物理ボディを設定して衝突させたり、重力の影響を受けさせたりできる。ただし、SKSファイルでは設定できない。

TestScene.swiftのtouchesBeganメソッドに物理ボディの設定を追加した。

 

以下は実際のプレイ動画

 

多角形を描画する

タップ位置を頂点とした多角形を描画するにはTestScene.swiftを以下のコードに変更する。鳥ノードをタップした段階で、物理ボディが設定された多角形を描画している。

 

以下は実際のプレイ動画