いつもお世話になっております。swift4でゲーム開発中のものです。
spritekitを使って2つの物体の衝突判定をしたいのですが、うまく認識されません。
下記のコードにfunc createEnemy()の関数を作って2つのノード「ピペットノード(sprite1)」と「ビーカーノード(sprite2)」を用意しています。それぞれ実機のシミュレーションで物体の表示は出来て、ピペットノードが落下してビーカーノードにぶつかって無事に衝突するまではうまくいくのですが、衝突したときに起動するはずのdidBeginがうまく作動してくれません。(didbigin内にあるprintメッセージが表示されません。)何か足りない部分があるのでしょうか。色々試してみましたが長時間進まない状態になってしまい質問させて頂きました。何卒よろしくおねがいします。
import Foundation import SpriteKit import CoreMotion class playScene: SKScene,SKPhysicsContactDelegate { ** func createEnemy(){ //ピペットノードの設定 let texture = SKTexture(imageNamed:"pipet") let sprite1 = SKSpriteNode(texture:texture) sprite1.position = CGPoint(x:130,y:880) sprite1.size=CGSize(width:texture.size().width*0.5,height:texture.size().height*0.5) sprite1.physicsBody = SKPhysicsBody(texture:texture,size:sprite1.size) sprite1.physicsBody?.isDynamic = true self.addChild(sprite1) //ビーカーノードの設定 let texture2 = SKTexture(imageNamed: "bika") let sprite2 = SKSpriteNode(texture:texture2) sprite2.position = CGPoint(x:130,y:150) sprite2.size=CGSize(width:texture2.size().width*0.5,height:texture2.size().height*0.5) sprite2.physicsBody = SKPhysicsBody(texture:texture2,size:sprite2.size) sprite2.physicsBody?.isDynamic = false self.addChild(sprite2) //衝突処理 sprite1.physicsBody?.categoryBitMask=0b0001 sprite2.physicsBody?.categoryBitMask=0b0010 sprite1.physicsBody?.collisionBitMask=0b0010 sprite2.physicsBody?.collisionBitMask = 0b0001 sprite1.physicsBody?.contactTestBitMask=0b0010 sprite2.physicsBody?.contactTestBitMask=0b0001 //デリゲート先に自分を設定する self.physicsWorld.contactDelegate=self print("衝突しないのか…") } func didBegin(_contact: SKPhysicsContact) { print("衝突開始しました!") } ** func endChangeTimer() { var owariCount = 0 let timerMini = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (Timer) in owariCount+=1 if owariCount>2 { self.changeScene() } } } override func didMove(to view: SKView) { //加速度センサーの計測開始 motionMgr.startAccelerometerUpdates() motionMgr.accelerometerUpdateInterval=0.05//何秒おきにデータを計測するかの指示 // var jyohou:Double! = self.motionMgr.accelerometerData?.acceleration.x //敵を発生させて落下させるメソッド:1秒に1回発動 let timerTeki = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (Timer) in self.createEnemy() } self.setupScoreLabel()//右上スコア表示発動 //自分のバンドの設定 myBand.name="myBand" self.addChild(myBand) myBand.size=CGSize(width:60,height:30) myBand.position=CGPoint(x:300,y:300) //↓自分の位置を刻々と変化させる let timer9 = Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) { (Timer) in var xi=self.motionMgr.accelerometerData!.acceleration.x var yi=self.motionMgr.accelerometerData!.acceleration.y var xp=self.myBand.position.x // print(self.motionMgr.accelerometerData!.acceleration.x) self.myBand.position=CGPoint(x:Double(xp)+xi*50,y:Double(self.myBand.position.y)+yi*50) } //パーティクルを発生させるメソッド //ポイントはparticleの名前の最後に!ビックリマークを入れること。!なぜこれが必要なのか?アンラッピングなど調べる。ass0624 let particle = SKEmitterNode(fileNamed:"MyParticle.sks") self.addChild(particle!) // particle!.position = CGPoint(x:-100,y:-300) particle!.position = CGPoint(x:myBand.position.x,y:myBand.position.y) let timerParticle = Timer.scheduledTimer(withTimeInterval: 0.02, repeats: true) { (Timer) in particle!.position = CGPoint(x:self.myBand.position.x,y:self.myBand.position.y) } } }
あなたの回答
tips
プレビュー