Hi Im just learning swift and am in need of some help. When I run my app it crashes. I get and error on
player1 = Player(name: "\(playerNames[0])", hp: 110, attackPwr: 10)
it says:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
I tried placing it in an if
statement i.e.
if playerNames.count == 2 {
player1 = Player(name: "\(playerNames[0])", hp: 110, attackPwr: 10)
}
My app then loaded but then I got the same error when I pressed player1AttackBtn
on
that line.
@IBAction func player1AttackBtn(sender: AnyObject)
any help would be greatly appreciated! Thanks in advance!!!
Parent Class
import Foundation
class Character {
private var _hp: Int = 100
private var _attackPwr: Int = 10
var attackPwr: Int {
get {
return _attackPwr
}
}
var hp: Int {
get {
return _hp
}
}
var isAlive: Bool {
get {
if hp <= 0 {
return false
} else {
return true
}
}
}
init(startingHp: Int, attackPwr: Int) {
self._hp = startingHp
self._attackPwr = attackPwr
}
func attemptAttack(attackPwr: Int) -> Bool {
self._hp -= attackPwr
return true
}
}
Player Class
import Foundation
class Player: Character {
private var _name = "Player"
var name: String {
get {
return _name
}
}
convenience init(name: String, hp: Int, attackPwr: Int) {
self.init(startingHp: hp, attackPwr: attackPwr)
_name = name
}
}
View Controller
import UIKit
import AVFoundation
//var bgMusicAudio = AVAudioPlayer!
var player1: Player!
var player2: Player!
class ViewController: UIViewController {
var playerNames = [String]()
@IBOutlet weak var playerOne: UIImageView!
@IBOutlet weak var playerTwo: UIImageView!
@IBOutlet weak var nameLbl: UITextField!
@IBOutlet weak var textBtn: UIButton!
@IBOutlet weak var printLbl: UILabel!
@IBOutlet weak var fightBtn: UIButton!
@IBOutlet weak var player1Attack: UIButton!
@IBOutlet weak var player2Attack: UIButton!
@IBOutlet weak var attackLbl1: UILabel!
@IBOutlet weak var attackLbl2: UILabel!
@IBOutlet weak var player1HP: UILabel!
@IBOutlet weak var player2HP: UILabel!
var bgMusic = AVAudioPlayer!()
override func viewDidLoad() {
super.viewDidLoad()
player1 = Player(name: "\(playerNames[0])", hp: 110, attackPwr: 10)
player2 = Player(name: "\(playerNames[1])", hp: 110, attackPwr: 10)
player1HP.text = "\(player1.hp)"
player2HP.text = "\(player2.hp)"
let bgMusicPath = NSBundle.mainBundle().pathForResource("8BitTrack", ofType: "wav")
let bgMusicURL = NSURL(fileURLWithPath: bgMusicPath!)
do {
try bgMusic = AVAudioPlayer(contentsOfURL: bgMusicURL)
bgMusic.prepareToPlay()
} catch let err as NSError {
print(err.debugDescription)
}
bgMusic.numberOfLoops = -1
bgMusic.play()
printLbl.text = "Player one, what is your name?"
}
@IBAction func player1AttackBtn(sender: AnyObject) {
if player2.attemptAttack(player1.attackPwr) {
printLbl.text = "Attacked \(player2) for \(player1.attackPwr) HP"
player2HP.text = "\(player2.hp)"
} else {
printLbl.text = "Attack was unsuccessful!"
}
if !player2.isAlive {
player2HP.text = ""
printLbl.text = "\(player1.name) killed \(player2.name)."
playerTwo.hidden = true
}
}
@IBAction func player2AttackBtn(sender: AnyObject) {
}
@IBAction func doneBtn(sender: AnyObject) {
if let name = nameLbl.text {
playerNames.append(name)
nameLbl.text = ""
printLbl.text = "Player two, what is your name?"
if playerNames.count == 2 {
nameLbl.hidden = true
textBtn.hidden = true
printLbl.text = "Welcome \(playerNames[0]) and \(playerNames[1])"
fightBtn.hidden = false
}
}
}
@IBAction func fightBtnPressed(sender: AnyObject) {
player1Attack.hidden = false
player2Attack.hidden = false
attackLbl1.hidden = false
attackLbl2.hidden = false
fightBtn.hidden = true
printLbl.text = "Press attack to attack!"
player1HP.hidden = false
player2HP.hidden = false
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Well, you call it in viewDidLoad
but you append name to the playerNames
in @IBAction func doneBtn(sender: AnyObject)
. When you call it for the first time (and only time because app crashes) array is empty.