SingleViewController에 SpriteKit를 추가하여 터치 이벤트와 물리 연산을 실시하였다
그러나 그렇게 되면 스프릿키트의 메커니즘은 블랙박스가 되고 게임 템플릿을 사용하지 않은 기존 앱에 편입될 수 없다.
이번에는 스프릿키트를 이해하기 위해 게임 템플릿을 사용하지 않고 1부터 스프릿키트를 편입하는 방법을 시도해보려고 한다.
본 보도는 최종적으로 다음과 같은 간단한 응용 프로그램을 제작할 것이다.
기능은 화면 안에 문자열을 표시하고 화면 안에서 터치하면 물리 연산의 대상이 나타난다.
→ 완성판 코드
프로젝트 작성
이번에 SigleView Application에서 프로젝트를 제작합니다.
※ ViewController를 직접 설정하면 됩니다. 빈 항목부터 시작할 수 있습니다.
SpriteKit 포함
SpriteKit는 ViewController->View에서 SpriteKit에서 사용하는 View 클래스로 SKView 클래스를 설정할 수 있습니다.
이 SKView에 게임의 한 화면에 해당하는 SKScene을 배치하면 화면에 표시할 수 있다.
게임 내에서 화면을 전환할 때 SKView에서 여러 개의 SKScene을 전환합니다.
스토리보드의 View Class를 "SKView"로 설정
먼저 SKView, SKScene을 가져오십시오.
Xcode 스토리보드 설정에 따라 View의 사용자 정의 레벨을 SKView로 설정합니다.
이렇게 하면 ViewController의 View를 SKView의 인스턴스로 사용할 수 있습니다.
ViewController에 SKView용 코드 추가
ViewController.swift
/* 省略 */
import UIKit
import SpriteKit // 追加
/* 省略 */
override func viewWillAppear(animated: Bool) {
let skView = self.view as SKView
// 画面サイズと同じ大きさのscene作成
let scene = GameScene(size: skView.bounds.size) // ストーリーボードでviewのクラスをSKViewに設定しているので、SKViewのインスタンスとして取得できる
skView.presentScene(scene) // SKView上にsceneを設定
}
override func viewDidLoad() {
super.viewDidLoad()
let skView = self.view as SKView
skView.showsFPS = true // FPS表示
skView.showsNodeCount = true //画面内要素数表示
}
SKScene을 계승한 클래스를 만들겠습니다.
위 코드에는 게임스킨이라는 학급이 있는데 이는 SKScene의 독특한 학급을 계승한 것이다.
GameScene.swift 파일을 만들고 다음 코드를 추가합니다.
GameScene.swift
import SpriteKit
class GameScene : SKScene {
}
이렇게 하면 SpriteKit를 사용할 준비가 완료됩니다.구축 결과
이 구성을 통해 FPS 및 노드 수가 화면에만 표시되는지 확인할 수 있습니다.
이번에는 하나의 화면이기 때문에 게임씬만 있고 여러 화면을 준비하려면 반을 따로 만든다.
그럼 이 게임에 요소를 추가하겠습니다.
태그 표시
기본 텍스트 레이블을 먼저 표시합니다.
class GameScene : SKScene {
var initiated: Bool = false;
/* sceneがSKView上に表示される度に呼ばれる関数 */
override func didMoveToView(view: SKView) {
if ( !initiated ) { //初期化時のみ実行
self.initContent()
self.initiated = true
}
}
func initContent() {
self.backgroundColor = SKColor.blueColor() // 背景色設定
var label = self.newHelloNode() // テキストノードの作成
self.addChild(label) // sceneにテキストノードを追加
}
func newHelloNode(Void) -> SKLabelNode {
var helloNode = SKLabelNode(text: "Hello, World!")
helloNode.fontColor = UIColor(red: 1.0, green:1.0, blue: 1.0, alpha: 1)
helloNode.fontSize = 60
helloNode.position = CGPointMake(CGRectGetMidX(self.frame), CGRectGetMidY(self.frame))
return helloNode
}
}
Scene이 SKView에 표시될 때마다 didMoveToview라고 합니다.원소를 처음 추가하고 싶어서 표시를 관리하고 있습니다.
원래 초기화하는 함수가 있어야 하는데, 찾은 샘플은 기본적으로 이렇다.
구축 결과
배경색을 설정하고 태그가 표시되는지 확인할 수 있습니다.
객체 정렬 및 터치 이벤트 가져오기
화면을 터치하고 터치하는 곳에 게임 중의 대상을 설치한다.
객체 정렬
GameScene.swift에 다음 함수를 추가합니다.
GameScene.swift
func addShape(location: CGPoint) {
var size = self.frame.width/100.0
let shape = SKShapeNode(circleOfRadius: size)
shape.fillColor = UIColor.whiteColor() // 塗りつぶし設定
shape.position = location //表示位置設定
self.addChild(shape) //画面へのオブジェクト追加
}
location을 디스플레이 위치로 받아들여 원 대상의 함수를 배치합니다.형태(그래픽) 객체가 생성된 경우
SKShapeNode
입니다.매개 변수의 전달 방식은 사각형, 원형 또는 형상을 바꿀 수 있다.사이즈는 화면 사이즈에 따라 적당히 계산한 것이다.이것을 실행하면 화면에 하얀 원이 표시됩니다.
터치 이벤트 가져오기
SKScene 클래스는 터치 이벤트가 발생할 때 호출되는 함수를 정의합니다.
터치 이벤트가 여러 개 있는데 여기서 터치로 시작할 때 불린다
touchesBegan
.GameScene.swift
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
let touch = touches.allObjects[0] as UITouch // タッチオブジェクトの取得
let location = touch.locationInNode(self) // タッチ位置の取得
// 図形の追加
addShape(location)
}
처음 두 행에서 CGPoint 객체로 사용할 터치 위치를 가져옵니다.그냥 위에서 만든 addShape 함수에 이걸 맡기는 거예요.
물리적 연산 추가
그럼 이렇게 하면 재미없으니까 물리 연산을 추가하자.
물리 연산을 추가하는 것 자체는 매우 간단하다. 형상 대상의 속성만 수정하면 된다.
먼저 원 객체
GameScene.swift
func addShape(location: CGPoint) {
/* 省略 */
// 物理演算の追加
shape.physicsBody = SKPhysicsBody(circleOfRadius: size)
shape.physicsBody?.dynamic = true // このオブジェクト自体が物理演算によって動くように指定
self.addChild(shape)
}
모양 객체의 physicsBody 속성에만 SKPhysicsBody 객체를 설정합니다.또한 매개 변수로 판정 범위를 지정한다.여기에 도형과 같은 도형을 설정했다.
또한, SKPhysicsBody.dynamic 속성 설정 대상 자체가 물리 연산을 따라 이동할지 여부입니다.가짜 창에서 주위의 대상과 충돌하면 대상 자체가 화면에 고정된다.
마리오는 다이내믹=진짜, 블록은 다이내믹=가짜로 기억된다.
참고로 라벨도dynamic=가짜 설정을 사용합니다.
GameScene.swift
func newHelloNode(Void) -> SKLabelNode {
/* 省略 */
// 物理演算の追加
helloNode.physicsBody = SKPhysicsBody(rectangleOfSize: helloNode.frame.size)
helloNode.physicsBody?.dynamic = false
return helloNode
}
물리 연산의 설정은 이것으로 끝냅니다.하지만 알다시피 이렇게 되면 공이 화면 밖으로 쏟아진다.
공을 화면에 남기기 위해 화면 주위에 가장자리를 추가하세요.
가장자리는 폭이 없는 객체이며 분할선으로 사용됩니다.
GameScene.swift
override func didMoveToView(view: SKView) {
if ( !initiated ) { //初期化時のみ実行
self.initContent()
/* 追加 */
self.physicsBody = SKPhysicsBody(edgeLoopFromRect: self.frame)
/* /追加 */
self.initiated = true
}
}
메서드는 edegeLoopFrom Rect 옵션을 지금까지의 물리적 연산 매개변수로 제출하기만 하면 됩니다.여기에 한 화면에 가장자리를 설정하고 싶어요,self.프레임을 사귀고 있습니다.이렇게 하면 공이 화면의 테두리 위에 멈추게 될 것이다.구축 및 확인.
구축 결과
터치하면 하얀 공이 그려지고 그게 화면에 쌓이겠지!
총결산
지금까지 SingleView Application에서 제작된 SKView였습니다.
원래 X코드에 게임 프로젝트 템플릿이 있는데 그걸로 하면 될 것 같아요.
한편, 게임 템플릿은 여분의 것으로 만들어지기 때문에 간단한 것을 만들거나 앱 일부에 스프릿키트를 사용하려면 스스로 조립한 것 같다.
참고 자료
SpriteKit Programming Guid
Reference
이 문제에 관하여(SingleViewController에 SpriteKit를 추가하여 터치 이벤트와 물리 연산을 실시하였다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/soymsk/items/17ea8c6dc7349a81873b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(SingleViewController에 SpriteKit를 추가하여 터치 이벤트와 물리 연산을 실시하였다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/soymsk/items/17ea8c6dc7349a81873b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)