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

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

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

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

Xcode

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

Swift

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

Q&A

0回答

742閲覧

モグラたたきゲームで一瞬チラつくモグラが表示されないようにしたい

nimoe

総合スコア1

SpriteKit

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/05/06 11:47

編集2021/05/31 12:30

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]) } }

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

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

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

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

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

tomato879241

2021/05/06 13:55

あなただったらそのようなフォーマットされていない他人のコードを読みますか?
t_obara

2021/05/06 15:58

モグラの種類3と場所の数をランダムで取得するだけかと思いますが、具体的に何が問題があり、どのような現象になるのでしょうか。
nimoe

2021/05/07 04:19

大変失礼致しました。全体的に内容を変更しましたのでご確認いただけますと幸いです。よろしくお願いいたします。
tomato879241

2021/05/08 05:27

popActionを3秒ごとに呼べばいいのではないでしょうか?
nimoe

2021/05/08 06:02

TakashiAbe様 すみません、私のわかる範囲で内容調整いたしました。
nimoe

2021/05/08 06:06

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() }) -----------------------------------------
nimoe

2021/05/08 06:14

tomato879241様 すみません、タイマー設定とあわせてモグラのアクションの待ち時間を調整すると気にならなくなってきました。再度確認させていただきます。
nimoe

2021/05/31 12:36

tomato879241様 度々すみません。 popAction()をtimerで3秒ごとに繰り返すことでモグラのちらつきは気にならなくなりましたが、最初に全ての穴からモグラが一斉に表示されてしまいます。こちらを全員ではなく数匹をランダムに表示したいのですが調整をご教示いただくことは可能でしょうか。
tomato879241

2021/06/01 01:15

「様」付けはやめてください。 そもそもそれはゲームの構造に問題があるのではないでしょうか?自分だったらモグラを50匹表示したいのなら、それだけの数のSKSpriteNodeのコピーをfor-loopで作り、それぞれのコピーに「userInfo」の属性を使って「どの穴」、「いつ」という値を保存しますが。
nimoe

2021/06/28 05:57

tomato879241さん ご連絡いただいた内容を参考に試行錯誤した結果、解決しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問