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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

1回答

2307閲覧

SpriteKit: アイテムを一定時間に出現させるには?

rockbooker

総合スコア8

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2016/07/26 22:04

###前提・実現したいこと
初投稿失礼します。
現在SwiftとSpriteKitを使った2Dゲームを作成しております。
そこで一定時間が経過したらハートをフィールドに出現させる方法を考えています。
よくApp Storeなどの放置ゲームなどで実装されているようなものです。
またプレイヤーが再度ゲームを開いたら経過時間に応じたハートがすでに出現しているという状況にしたいと思っております。
必死に考えたのですが、どうしても、どうしても解決できなかったので質問させていただきました。
見にくいコードかとは思いますが、どうかよろしくお願いいたします。
ソースでなくても考え方だけでもどうかお願い致します。

###該当のソースコード

swift

1 2// ハート配置関数の初期化 3let settingHearts = setHeart() 4 5if numberOfHearts != HeartsMax { 6 self.heartTimer = NSTimer.scheduledTimerWithTimeInterval(20, target: self, 7 selector: #selector(GameScene.settingHearts), userInfo: nil, repeats: true) 8} 9 10 11// 省略 12 13 /// まだ存在していない場所にハートを出現させる 14 func setHeart() -> (Void) -> Void { 15 let heartMax = 20 // フィールドに存在できるハートの上限 16 var currentHeartCnt = self.hearts.count 17 18 let texture = SKTexture(imageNamed: "Heart") 19 20 // 上限に達したらそのままリターン 21 if currentHeartCnt == heartMax { return { _ in return Void() } } 22 23 // フィールドに出現するハートの位置を指定 24 func makingHeartPosition() -> [CGPoint] { 25 // 画面を元に座標を求めるための倍率を格納 26 let XPos = [0.3, 0.4, 0.5, 0.6, 0.7] 27 let YPos = [0.45, 0.55, 0.65, 0.75] 28 29 var heartPositions: [CGPoint] = [] 30 for y in YPos { 31 for x in XPos { 32 let p = CGPoint(x: self.size.width * CGFloat(x), y: self.size.height * CGFloat(y)) 33 heartPositions.append(p) 34 } 35 } 36 37 return heartPositions 38 } 39 40 let heartPositions = makingHeartPosition() 41 42 func closure() { 43 let heart = SKSpriteNode(texture: texture) 44 45 var index: Int = 20 46 // メモに含まれている添字をロードした場合はやり直す 47 while true { 48 index = (Int)(arc4random_uniform(20)) 49 if self.heartMemo.contains(index) { 50 continue 51 } else { 52 break 53 } 54 } 55 // 引き当てた添字はメモ 56 self.heartMemo.append(index) 57 58 heart.position = heartPositions[index] 59 heart.zPosition = -5 60 heart.name = "heart\(index)" 61 heart.physicsBody = SKPhysicsBody(texture: texture, size: texture.size()) 62 heart.physicsBody?.dynamic = false 63 heart.physicsBody?.resting = true 64 heart.physicsBody?.allowsRotation = true 65 heart.physicsBody?.contactTestBitMask = 1 66 heart.physicsBody?.restitution = 1.0 67 heart.physicsBody?.friction = 1.0 68 69 70 let scaleUp = SKAction.scaleTo(1.5, duration: 1.0) 71 let scaleDw = SKAction.scaleTo(1.0, duration: 1.0) 72 let scaleUpDown = SKAction.sequence([scaleUp, scaleDw]) 73 heart.runAction(SKAction.repeatActionForever(scaleUpDown)) 74 75 hearts.append(heart) 76 self.addChild(heart) 77 78 79 } 80 81 return closure 82 83 } 84

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

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

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

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

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

guest

回答1

0

自己解決

解決しました。お騒がせしました!!!!

swift

1 2// 末尾のBool値でフィールドに出現しているか否かを判断する 3var hearts = [Int : (SKSpriteNode, CGPoint, Bool)]() 4 5 6// 省略 7 8 /// ハートの初期化処理 9 func setFirstHeart() { 10 11 12 // フィールドに出現するハートの位置を指定 13 func makingHeartPosition() -> [CGPoint] { 14 // 画面を元に座標を求めるための倍率を格納 15 let XPos = [0.3, 0.4, 0.5, 0.6, 0.7] 16 let YPos = [0.45, 0.55, 0.65, 0.75] 17 18 var heartPositions: [CGPoint] = [] 19 for y in YPos { 20 for x in XPos { 21 let p = CGPoint(x: self.size.width * CGFloat(x), y: self.size.height * CGFloat(y)) 22 heartPositions.append(p) 23 } 24 } 25 26 return heartPositions 27 } 28 29 // 20個のハートのそれぞれの位置が格納された配列 30 let heartPositions = makingHeartPosition() 31 let texture = SKTexture(imageNamed: "Heart") 32 33 for i in 0...19 { 34 let heart = makeHeart(texture) 35 heart.position = heartPositions[i] 36 heart.name = "heart\(i)" 37 hearts[i] = (heart, heart.position, true) 38 self.addChild(heart) 39 40 } 41 } 42 43 // 一つのハートを生成する処理 44 func makeHeart(texture: SKTexture) -> SKSpriteNode { 45 let heart = SKSpriteNode(texture: texture) 46 heart.physicsBody = SKPhysicsBody(texture: texture, size: texture.size()) 47 heart.physicsBody?.dynamic = false 48 heart.physicsBody?.resting = true 49 heart.physicsBody?.allowsRotation = true 50 heart.physicsBody?.contactTestBitMask = 1 51 heart.physicsBody?.restitution = 1.0 52 heart.physicsBody?.friction = 1.0 53 54 let scaleUp = SKAction.scaleTo(1.5, duration: 1.0) 55 let scaleDw = SKAction.scaleTo(1.0, duration: 1.0) 56 let scaleUpDown = SKAction.sequence([scaleUp, scaleDw]) 57 heart.runAction(SKAction.repeatActionForever(scaleUpDown)) 58 59 60 return heart 61 } 62 63 64 /// ハートを消す処理 65 func removeHeart() { 66 67 68 } 69 70 71 /// ハートを出現させる処理 72 func appearHeart() { 73 let texture = SKTexture(imageNamed: "Heart") 74 75 for i in 0...19 { 76 if hearts[i]!.2 == false { 77 hearts[i]!.0 = makeHeart(texture) 78 hearts[i]!.0.position = hearts[i]!.1 79 hearts[i]!.0.name = "heart\(i)" 80 // 再度登録 81 hearts[i]!.2 = true 82 self.addChild(hearts[i]!.0) 83 return 84 } 85 } 86 } 87}

投稿2016/07/27 00:48

rockbooker

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問