質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1711閲覧

モグラたたきゲームで3種類のモグラをランダムに表示したい

nimoe

総合スコア1

SpriteKit

SpriteKitは、iOSやOS Xで使用できるApple社製の2Dゲーム開発フレームワークです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2021/01/21 12:25

前提・実現したいこと

プログラミング初心者です。
swiftでSpriteKitを使用してモグラたたきのゲームを作っています。
3種類のモグラを用意し、穴から出てくるモグラをランダムに表示したいです。
timerのメソッドを利用してランダムに表示することは自体はできたのですが、
2度目以降に表示されるモグラがタップしても反応しなくなりました。
どのようにしたら反応するようにできるのでしょうか。
どなたかご教示いただきたく、よろしくお願いいたします。

発生している問題・エラーメッセージ

エラーメッセージはありません。

import UIKit
import SpriteKit
import GameplayKit
import AVFoundation

class GameScene: SKScene,SKPhysicsContactDelegate {

///モグラの位置 var enemyPoint = [[150,250],[250,600],[200,800],[500,400],[550,150],[650,700],[550,950],[300,1100]] ///モグラを入れる配列 var enemy01Array:[SKSpriteNode] = [] var enemy02Array:[SKSpriteNode] = [] var enemy03Array:[SKSpriteNode] = [] //タイマー var enemyTimer = Timer() override func didMove(to view: SKView) { //もぐらの穴 for i in 0...7{ let hole = SKSpriteNode(imageNamed:"hole.png") hole.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) hole.xScale = 0.8 hole.yScale = 0.8 self.addChild(hole) } //タイマーの設定 enemyTimer = Timer.scheduledTimer( timeInterval: 3.5, target:self, selector:#selector(GameScene.randomLoop), userInfo:nil,repeats:true) } //モグラをランダムに表示 func randomLoop(){ for i in 0...7{ let random = Int(arc4random_uniform(20)) let enemy01 = SKSpriteNode(imageNamed: "enemy01.png") enemy01.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) let enemy02 = SKSpriteNode(imageNamed: "enemy02.png") enemy02.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) let enemy03 = SKSpriteNode(imageNamed: "enemy03.png") enemy03.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) enemy01Array.append(enemy01) enemy02Array.append(enemy02) enemy03Array.append(enemy03) if(random>0 && random<13){ self.addChild(enemy01) }else if(random>=13 && random<18){ self.addChild(enemy02) }else{ self.addChild(enemy03) } let action1 = SKAction.wait(forDuration: 0.8,withRange:2.0) let action2 = SKAction.hide() let action3 = SKAction.wait(forDuration: 0.5,withRange:2.0) let action4 = SKAction.unhide() let actionS = SKAction.sequence([action1,action2,action3,action4]) enemy01.run(actionS) enemy02.run(actionS) enemy03.run(actionS) } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch:AnyObject = touches.first{ let location = touch.location(in:self) let touchNode = self.atPoint(location) for i in 0...7{ if touchNode == enemy01Array[i]{ let enemy01 = SKSpriteNode(imageNamed:"enemy01") enemy01.position = touchNode.position self.addChild(enemy01) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.2) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.2) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy01.run(actionS) touchNode.position.y = -100 }else if touchNode == enemy02Array[i]{ let enemy02 = SKSpriteNode(imageNamed:"enemy02") enemy02.position = touchNode.position self.addChild(enemy02) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.3) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.3) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy02.run(actionS) touchNode.position.y = -100 }else if touchNode == enemy03Array[i]{ let enemy03 = SKSpriteNode(imageNamed:"enemy03") enemy03.xScale = 0.6 enemy03.yScale = 0.6 enemy03.position = touchNode.position self.addChild(enemy03) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.3) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.3) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy03.run(actionS) touchNode.position.y = -100 } } } } override func update(_ currentTime: TimeInterval) { // Called before each frame is rendered }

}

swift

enemy01Array.appendの位置を何度か変えてみましたが改善されませんでした。

補足情報(FW/ツールのバージョンなど)

swift3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

私もプログラミングはじめて間もない為勉強までにみさせてもらいました。
以下のような形で2回目もnameで判定してみたところタップできている気がします。
あと少し気になったところも追加してみました。
うまくいかなければ読み飛ばしてください。

import UIKit import SpriteKit import GameplayKit import AVFoundation class GameScene: SKScene,SKPhysicsContactDelegate { ///モグラの位置 var enemyPoint = [[150,250],[250,600],[200,800],[500,400],[550,150],[650,700],[550,950],[300,1100]] ///モグラを入れる配列 var enemy01Array:[SKSpriteNode] = [] var enemy02Array:[SKSpriteNode] = [] var enemy03Array:[SKSpriteNode] = [] //タイマー var enemyTimer = Timer() override func didMove(to view: SKView) { //もぐらの穴 for i in 0...7{ let hole = SKSpriteNode(imageNamed:"hole.png") hole.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) hole.xScale = 0.8 hole.yScale = 0.8 self.addChild(hole) } //タイマーの設定 enemyTimer = Timer.scheduledTimer( timeInterval: 3.5, target:self, selector:#selector(GameScene.randomLoop), userInfo:nil,repeats:true) } //モグラをランダムに表示 @objc func randomLoop(){ for i in 0...7{ let random = Int(arc4random_uniform(20)) let enemy01 = SKSpriteNode(imageNamed: "enemy01.png") enemy01.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) enemy01.zPosition = 1//追加(もぐらの穴の裏表示されていた為) let enemy02 = SKSpriteNode(imageNamed: "enemy02.png") enemy02.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) enemy02.zPosition = 1//追加(もぐらの穴の裏表示されていた為) let enemy03 = SKSpriteNode(imageNamed: "enemy03.png") enemy03.position = CGPoint(x:enemyPoint[i][0],y:enemyPoint[i][1]) enemy02.zPosition = 1//追加(もぐらの穴の裏表示されていた為) enemy01Array.append(enemy01) enemy02Array.append(enemy02) enemy03Array.append(enemy03) enemy01.name = "enemy01"//追加 enemy02.name = "enemy02"//追加 enemy03.name = "enemy03"//追加 if(random>0 && random<13){ self.addChild(enemy01) }else if(random>=13 && random<18){ self.addChild(enemy02) }else{ self.addChild(enemy03) } let action1 = SKAction.wait(forDuration: 0.8,withRange:2.0) let action2 = SKAction.hide() let action3 = SKAction.wait(forDuration: 0.5,withRange:2.0) let action4 = SKAction.unhide() let actionS = SKAction.sequence([action1,action2,action3,action4]) enemy01.run(actionS) enemy02.run(actionS) enemy03.run(actionS) //Nodeが追加され続けてしまっていたタイマー追加までに消える DispatchQueue.main.asyncAfter(deadline: .now() + 3.0){//追加 let Node1 = self.childNode(withName: "enemy01")//追加 let Node2 = self.childNode(withName: "enemy02")//追加 let Node3 = self.childNode(withName: "enemy03")//追加 Node1?.removeFromParent()//追加 Node2?.removeFromParent()//追加 Node3?.removeFromParent()//追加 }//追加 } } override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch:AnyObject = touches.first{ let location = touch.location(in:self) let touchNode = self.atPoint(location) //for i in 0...7{ //if touchNode == enemy01Array[i]{ if let name = touchNode.name {//変更 if name == "enemy01" {//変更 let enemy01 = SKSpriteNode(imageNamed:"enemy01") enemy01.position = touchNode.position self.addChild(enemy01) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.2) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.2) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy01.run(actionS) touchNode.position.y = -100 }else if let name = touchNode.name {//変更 if name == "enemy02" {//変更 //touchNode == enemy02Array[i]{ let enemy02 = SKSpriteNode(imageNamed:"enemy02") enemy02.position = touchNode.position self.addChild(enemy02) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.3) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.3) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy02.run(actionS) touchNode.position.y = -100 }else if let name = touchNode.name {//変更 if name == "enemy03" {//変更 //if touchNode == enemy03Array[i]{ let enemy03 = SKSpriteNode(imageNamed:"enemy03") enemy03.xScale = 0.6 enemy03.yScale = 0.6 enemy03.position = touchNode.position self.addChild(enemy03) //モグラを1回転するアクション let action1 = SKAction.rotate(byAngle: 6.28, duration: 0.3) let action2 = SKAction.moveTo(y: touchNode.position.y + 150,duration: 0.3) let actionG = SKAction.group([action1,action2]) let action3 = SKAction.removeFromParent() let actionS = SKAction.sequence([actionG,action3]) enemy03.run(actionS) touchNode.position.y = -100 } } } } } } //} override func update(_ currentTime: TimeInterval) { // Called before each frame is rendered } }

投稿2021/01/22 16:49

ThunderV

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nimoe

2021/01/23 09:30

タップできることが確認できました!細かくコメントまで記載いただき大変助かります!ありがとうございます!! ちなみに、もしご存知でしたらお伺いしたいのですが、 現状のタイマーのメソッドですとモグラが一斉に全ての穴から出てきてしまうのですが、出てくるモグラの数をランダムに表示することができたりはしますでしょうか?
ThunderV

2021/01/23 13:27

タップ出来てよかったです。 もぐらのサンプルみた時も2箇所?の場所から表示されていましたが良く理解できませんでした。 ランダム表示については 同じ場所には同時に2つ以上もぐらが入らない、何箇所から同時に表示させるか等条件も あるのでしょうがパッと私は回答出来そうにない為、再度条件を変えて投稿したほうが良いと思います。
nimoe

2021/01/23 16:00

ご返答ありがとうございます! おかげさまで問題点が解決しましたので、ランダムの件が必要かはまた別で検討したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問