私は非常に簡単な迅速なゲームに取り組んでいます。ゲームの主なレイアウトは、16個のセル(ドア)を持つUICollectionViewです。セル(ドア)の1つは、セル上のゲームです。あなたは、セル上のゲーム以外のすべてのドアをタップ(開く)する必要があります。セル上のゲームがタップされると、セルはすべてランダム化され、あなたは人生を失います。あなたがセル上のゲーム以外のドアをすべて開くと、あなたは勝ちます。タップでUICollectionViewCellを無効にし、セルをランダム化
私のコードは以下の通りです。
どんな機能がありますか?初期ロードで
- 、ドアが 15 DoorIdentifierと1 GameOverIdentifierの配列を適切にランダム化します。これは私がどのように細胞上のゲームを検出している です。
どうしますか?
私はドアゲームオーバー をタップし、次に、(それらを無効にする)いくつかの通常のドアをタップすると、それは周りのドア(それが必要として)をシャッフルしたが、その後 他のランダムドアが無効になって、ルックを有効にしました(1.0アルファ)。意図していません。
普通のドアをタップして(無効にする)、Game Overドアをタップすると、すべてのドアが1.0アルファになり、一部では の対話が有効になります。さらに、Game Overドアを押した後に、 のドアがたった1つのドアで0.2アルファを維持することがあります。
私に必要なもの 通常のドアがタップされると、そのセルは常に無効になります。ドアの上にあるゲームがタップされた場合、既にタップされていたセルは無視されます。「ゲームプレイから外れる」必要があります。
import UIKit
class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
@IBOutlet weak var mainCollectionView: UICollectionView!
var gameOverDoorArray = ["GameOverIdentifier"]
var normalDoors = ["DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier", "DoorIdentifier"]
var reuseIdentifiers = [String]()
var livesLeftCounter = 3
@IBAction func randomizeButton(sender: UIButton) {
randomizeReuseIdentifiers()
}
override func viewDidLoad() {
super.viewDidLoad()
mainCollectionView.dataSource = self
mainCollectionView.delegate = self
mainCollectionView.backgroundColor = UIColor.clearColor()
reuseIdentifiers = gameOverDoorArray + normalDoors
randomizeReuseIdentifiers()
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return reuseIdentifiers.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let identifier = reuseIdentifiers[indexPath.item]
let cell: DoorCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(identifier, forIndexPath: indexPath) as! DoorCollectionViewCell
cell.backgroundColor = UIColor(patternImage: UIImage(named: "doorClosedImage")!)
return cell
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
let currentCell = mainCollectionView.cellForItemAtIndexPath(indexPath) as UICollectionViewCell!
// Game Over door was pressed!
if reuseIdentifiers[indexPath.item] == "GameOverIdentifier" {
gameOverDetection()
randomizeReuseIdentifiers()
mainCollectionView.reloadData()
}
// Normal door was pressed!
else if reuseIdentifiers[indexPath.item] == "DoorIdentifier"{
if currentCell.userInteractionEnabled && (normalDoors.count > 0){
currentCell.alpha = 0.2
print("reuse ID's array - \(reuseIdentifiers)")
// when all the above is done, the button gets disabled.
currentCell.userInteractionEnabled = false
// Remove last item in normalDoors Array.
normalDoors.removeLast()
}
print("Array count of allTheDoors - \(reuseIdentifiers.count).")
}
}
func randomizeReuseIdentifiers() {
var randomized = [String]()
for _ in reuseIdentifiers {
let random = reuseIdentifiers.removeAtIndex(Int(arc4random_uniform(UInt32(reuseIdentifiers.count))))
randomized.append(random)
}
reuseIdentifiers = randomized
}
func gameOverDetection() {
livesLeftCounter -= 1
if livesLeftCounter < 0 {
print("GAME OVER!")
}
print(livesLeftCounter)
}
}
私はあなたのゲームのすべての詳細を理解していませんが、私はコードを見て、これらの問題につながるいくつかの欠陥を発見しました。このドアが有効かどうかに関する情報を格納するセル自体を使用することに注意してください。それはうまくいきません。いくつかのプロパティ(配列、多分)を作成し、セルにではなく、この情報を格納する必要があります。また、 'cellForItemAtIndexPath'の内部では、この配列の情報に基づいてセルの状態を更新する必要があります。 –
また、再利用識別子の配列を保持することによって、ゲームオーバー情報をセルに格納することは奇妙に見えます。あなたはそれのために1つの番号が必要です。 –