swift初心者です。もぐらたたきゲームを作ってます。
複数種類のモグラを毎度ランダムに穴から表示させているのですが、
以下のエラーが見受けられ、修正したいです。
【エラー内容】
表示されたモグラ(A)が消える際に別のモグラ(B)が一瞬チラついて表示される
チラつくモグラが表示されないようにしたい
【言語バージョン】
swift5
対応方法をご教授いただきたく、よろしくお願いいたします。
import SpriteKit class GameScene: SKScene { // モグラの位置([x,y]のセットで4個所)を作る CGPointへ変更 let mogPoint = [CGPoint(x:150,y:250),CGPoint(x:250,y:600), CGPoint(x:200,y:800),CGPoint(x:500,y: 400) ] // モグラを入れる配列を用意する(タッチしたかを調べるため) var mogArray:[SKSpriteNode] = [] //var myTimer = Timer() override func didMove(to view: SKView) { // モグラの準備をする モグラ穴を作る //mogPoint穴の位置の要素 4回繰り返す for i in mogPoint { let hole = SKSpriteNode(imageNamed: "hole.png") hole.position = i // モグラ穴の位置を指定する self.addChild(hole) // モグラを表示する } // 穴の数だけモグラを作る for i in mogPoint { let random = Int(arc4random_uniform(3)) switch random { case 0: let mog = SKSpriteNode(imageNamed: "enemy01.png") mog.position = i // モグラの位置を指定する mog.zPosition = 1 mog.name = "enemy01" self.addChild(mog)// モグラを表示する mogArray.append(mog) // モグラを配列に追加する default: let mog1 = SKSpriteNode(imageNamed: "enemy02.png") mog1.position = i // モグラの位置を指定する mog1.zPosition = 1 mog1.name = "enemy02" self.addChild(mog1)// モグラを表示する mogArray.append(mog1) } } popAction() } // 【モグラが穴から出たり入ったりするアクションをつける】 func popAction(){ for i in mogArray { i.run(action(pos:i.position), completion: {() -> Void in if let index = self.mogArray.firstIndex(of:i ) { self.changemogura(at:index) } }) } } //配列もぐらを変更する。 at:Intはもぐらの配列のインデックス func changemogura(at:Int){ let random = Int(arc4random_uniform(3)) // print("ランダムの数",random) switch random { case 0: let mog = SKSpriteNode(imageNamed: "enemy01.png") mog.position = mogPoint[at] // モグラの位置を指定する mog.zPosition = 1 mog.name = "enemy01" self.addChild(mog)// モグラを表示する mogArray[at] = mog //配列を入れ替える default: let mog1 = SKSpriteNode(imageNamed: "enemy02.png") mog1.position = mogPoint[at] // モグラの位置を指定する mog1.zPosition = 1 mog1.name = "enemy02" self.addChild(mog1)// モグラを表示する mogArray[at] = mog1 //配列を入れ替える } mogArray[at].run(action(pos:mogArray[at].position), completion: {() -> Void in if let removeindex = self.mogArray.firstIndex(of:self.mogArray[at] ) { self.changemogura(at:removeindex) } }) } //もぐらアクション func action(pos:CGPoint)->SKAction { let action1 = SKAction.moveTo(y: -1000, duration: 0.0) let action2 = SKAction.wait(forDuration: 2.0, withRange: 4.0) let action3 = SKAction.moveTo(y: pos.y, duration: 0.0) let action4 = SKAction.wait(forDuration: 1.0, withRange: 2.0) let remove = SKAction.removeFromParent() let actionS = SKAction.sequence([action1, action2, action3, action4, remove]) return SKAction.sequence([actionS]) } }
あなただったらそのようなフォーマットされていない他人のコードを読みますか?
モグラの種類3と場所の数をランダムで取得するだけかと思いますが、具体的に何が問題があり、どのような現象になるのでしょうか。
大変失礼致しました。全体的に内容を変更しましたのでご確認いただけますと幸いです。よろしくお願いいたします。
https://teratail.com/help/question-tips#questionTips3-5-1
特に↑をしっかり読んでもう少し質問文の内容が伝わる方にした方が良いと思いますよ。tomato879241さんがせっかく指摘してくれているのですから。
popActionを3秒ごとに呼べばいいのではないでしょうか?
TakashiAbe様
すみません、私のわかる範囲で内容調整いたしました。
tomato879241様
ご確認ありがとうございます。
>popActionを3秒ごとに呼べばいいのではないでしょうか?
以下変数を追加し
var timer = Timer()
var count = 0
popAction()のところを以下に置き換える方法で合ってますでしょうか。
実行してみましたが、まだチラつくようでした。
-----------------------------------------
timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true, block: { (timer) in
self.count += 3
//self.count値をコンソールへ出力
self.popAction()
})
-----------------------------------------
tomato879241様
すみません、タイマー設定とあわせてモグラのアクションの待ち時間を調整すると気にならなくなってきました。再度確認させていただきます。
tomato879241様
度々すみません。
popAction()をtimerで3秒ごとに繰り返すことでモグラのちらつきは気にならなくなりましたが、最初に全ての穴からモグラが一斉に表示されてしまいます。こちらを全員ではなく数匹をランダムに表示したいのですが調整をご教示いただくことは可能でしょうか。
「様」付けはやめてください。
そもそもそれはゲームの構造に問題があるのではないでしょうか?自分だったらモグラを50匹表示したいのなら、それだけの数のSKSpriteNodeのコピーをfor-loopで作り、それぞれのコピーに「userInfo」の属性を使って「どの穴」、「いつ」という値を保存しますが。
tomato879241さん
ご連絡いただいた内容を参考に試行錯誤した結果、解決しました。
ありがとうございました。
あなたの回答
tips
プレビュー