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

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

ただいまの
回答率

88.04%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 290

score 1

前提・実現したいこと

プログラミング初心者です。
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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

私もプログラミングはじめて間もない為勉強までにみさせてもらいました。
以下のような形で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/23 18:30

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

    キャンセル

  • 2021/01/23 22:27

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

    キャンセル

  • 2021/01/24 01:00

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

    キャンセル

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

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る