SpriteKit 3 시도, 충돌 시도.
4저번 화구가 부딪혔을 때 화염을 뿌려 사라지도록 한다.
GameScene.swift
//SKPhysicsContactDelegateを追加
class GameScene: SKScene, SKPhysicsContactDelegate {
override func didMoveToView(view: SKView) {
//衝突イベントの為必ず必要
self.physicsWorld.contactDelegate = self
/* 無重力にする */
self.physicsWorld.gravity = CGVectorMake(0,0);
/* Setup your scene here */
let myLabel = SKLabelNode(fontNamed:"Chalkduster")
myLabel.text = "Hello, World!";
myLabel.fontSize = 65;
myLabel.position = CGPoint(x:CGRectGetMidX(self.frame), y:CGRectGetMidY(self.frame));
self.addChild(myLabel)
let sprite = SKSpriteNode(color: UIColor.orangeColor(), size: CGSizeMake(300, 300))
sprite.position = CGPoint(x:700, y:CGRectGetMidY(self.frame))
sprite.lightingBitMask = 1
//衝突イベントには必須
sprite.physicsBody = SKPhysicsBody(rectangleOfSize: sprite.size)
sprite.physicsBody?.categoryBitMask = 0x1 << 0
sprite.physicsBody?.contactTestBitMask = 0x1 << 1
sprite.physicsBody?.dynamic = false
self.addChild(sprite)
}
벽화 블록을 설정하다.physics Body 설정해 드릴게요.처음엔 physics Body에 사이즈를 맞추는 걸 깜빡했더니 오랜만에 만져서 고민이에요.사이즈 설정이 왜 필요해요?좀 편한 것도 있는 것 같아요.
override func touchesBegan(touches: NSSet, withEvent event: UIEvent) {
/* Called when a touch begins */
for touch: AnyObject in touches {
let location = touch.locationInNode(self)
let firePath = NSBundle.mainBundle().pathForResource("MyParticle", ofType: "sks")
var fire = SKEmitterNode()
fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode
fire.particleSize = CGSize(width: 70, height: 70)
fire.position = location
//衝突イベントに必須
fire.physicsBody = SKPhysicsBody(rectangleOfSize: fire.particleSize)
fire.physicsBody?.contactTestBitMask = 0x1 << 0
fire.physicsBody?.categoryBitMask = 0x1 << 1
var line = CGPathCreateMutable()
CGPathMoveToPoint(line, nil, location.x, location.y)
CGPathAddLineToPoint(line, nil, location.x + 1000, location.y)
let follow = SKAction.moveByX(-1000, y: -350, duration: 3.5)
let follow2 = SKAction.moveByX(1500, y: 0, duration: 3.5)
fire.particleAction = follow
fire.runAction(follow2)
self.addChild(fire)
}
화염의 렌즈는 벽 캐릭터와 마찬가지로 physics Body를 설정한다. //衝突時のイベント
func didBeginContact(contact: SKPhysicsContact) {
let firePath = NSBundle.mainBundle().pathForResource("Spark", ofType: "sks")
var fire = SKEmitterNode()
fire = NSKeyedUnarchiver.unarchiveObjectWithFile(firePath!) as SKEmitterNode
fire.position.x = contact.contactPoint.x
fire.position.y = contact.contactPoint.y + 30
fire.numParticlesToEmit = 80
self.addChild(fire)
//このメソッドを上書きすると衝突したイベントの衝突後の処理を書かねばならない
if(contact.bodyA.categoryBitMask > contact.bodyB.categoryBitMask){
contact.bodyA.node?.removeFromParent()
} else {
contact.bodyB.node?.removeFromParent()
}
}
충돌할 때 불꽃이 튀는 공연이 있다.이를 수행하고자 SKPhysics Contact Delegate 프로토콜을 구현했습니다.부딪힌 후에는 화염을 꺼야 한다.그나저나 벽 캐릭터의 네모난 설정
sprite.physicsBody?.dynamic = false
라는 부분을 리뷰한 뒤 벽이 렌즈와 부딪히는 기세로 움직인다.이참에 불에 무게를 더하면 타격 기세를 뽐낼 수 있다.
fire.physicsBody?.mass = 20
Reference
이 문제에 관하여(SpriteKit 3 시도, 충돌 시도.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rnsm504/items/eb269d4c31d7e239c727텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)