###前提・実現したいこと
初投稿失礼します。
現在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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。