I denne opplæringen lager du et blackjack-spill i SpriteKit ved hjelp av Swift 3. Du lærer om å implementere berøring, skape visuelle animasjoner og mange andre begreper som kommer til nytte når du bygger et SpriteKit-spill.
Åpne Xcode og velg Opprett et nytt Xcode-prosjekt eller velg Nytt> Prosjekt ... fra Fil Meny. Forsikre iOS er valgt og velg Spill mal.
Deretter velger du hva du ønsker for Produktnavn, Organisasjonsnavn, og Organisasjonsidentifikator. Sørge for at Språk er satt til Fort, Spillteknologi er satt til SpriteKit, og enheter er satt til iPad.
Angi et sted for å lagre prosjektfilene og klikk Skape.
Last ned GitHub repo for dette prosjektet. Inne i det ser du en klasser mappe. Åpne denne mappen og dra alle filene til mappen som har navnet til det du for eksempel oppgav prosjektet ditt, blackjack. Forsikre Kopier elementer om nødvendig er sjekket så vel som hovedmålet i listen over mål.
Også i opplæringen er GitHub repo en mappe som heter opplæringsbilder. Inne i prosjektnavigatoren, åpne Assets.xcassets og dra alle bildene i sidefeltet. Xcode lager automatisk teksturatlaser fra disse bildene.
I prosjektnavigatoren er det to filer du kan slette (Gamescene.sks og Actions.sks).Slett disse to filene og velg Flytt til søppel. Disse filene brukes av Xcodes innebygde sceneditor, som kan brukes til å visuelt legge ut prosjektene dine. Vi vil skape alt via kode, men så er disse filene ikke nødvendig.
Åpen GameViewController.swift, Slett innholdet, og erstatt det med følgende.
importere UIKit import SpriteKit klasse GameViewController: UIViewController override func viewDidLoad () super.viewDidLoad () la scene = GameScene (størrelse: CGSize (bredde: 768, høyde: 1024)) la skView = self.view as! SKView skView.showsFPS = false skView.showsNodeCount = falskt skView.ignoresSiblingOrder = false scene.scaleMode = .aspektFill skView.presentScene (scene) overstyr var prefersStatusBarHidden: Bool return true
De GameViewController
Klassen arver fra UIViewController
og vil ha en SKView
som sin utsikt. Inne i viewDidLoad
metode, vi nedkastet utsikt
eiendom til en SKView
eksempel ved bruk av som!
skriv cast operatør, og konfigurer visningen.
Hvis du skulle kjøre dette prosjektet når du opprettet det friskt, kan det hende du merker tekst nederst til høyre på skjermen. Det er det som showsFPS
og showsNodeCount
egenskaper er for, viser rammer per sekund spillet kjører på og antall SKNodes
synlig i scenen. Vi trenger ikke denne informasjonen, så vi setter dem til falsk
.
De ignoreSiblingOrder
Egenskapen brukes til å bestemme tegningsordren til SKNode
s i spillet. Vi satte dette til falsk
her fordi vi trenger vår SKNodes
å tegne i den rekkefølgen de legges til scenen.
Til slutt setter vi skalaen til .aspectFill
, som vil føre til at sceneinnholdet skaleres for å fylle hele skjermen. Vi anvender deretter presentScene (_ :)
metode på skView
som presenterer eller "viser" scenen.
Deretter slett alt i GameScene.swift og erstatt det med følgende.
importere SpriteKit import GameplayKit klasse GameScene: SKScene override func didMove (for å se: SKView) overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?)
Du kan nå teste prosjektet, og du bør bli presentert med en blank svart skjerm. I neste trinn vil vi begynne å legge til innhold på vår scene.
Skriv inn følgende kode ved starten av GameScene
klasse rett under hvor GameScene
arver fra SKScene
.
Klasse GameScene: SKScene let moneyContainer = SKSpriteNode (farge: .clear, size: CGSize (bredde: 250, høyde: 150)) la dealBtn = SKSpriteNode (imageNamed: "deal_btn") la hitBtn = SKSpriteNode (imageNamed: "hit_btn") la standBtn = SKSpriteNode (imageNamed: "stand_btn") la money10 = Money (moneyValue: .ten) la money25 = Money (moneyValue: .twentyFive) la money50 = Money (moneyValue: .fifty) la instructionText = SKLabelNode din innsats ")
Vi lager en rekke SKSpriteNode
s her. SKSpriteNode
s brukes til å lage en farget node, eller mer vanlig fra en SKTexture
, som ofte er et bilde. Vi bruker bekvemmelighetsinitiatoren init (farge: størrelse :)
å lage en klar fargetode moneyContainer
. De moneyContainer
vil bli brukt til å holde pengene spilleren satser, og på slutten av hver runde vil vi animere denne bevegelsen mot den som vant spillet. Plassering av alle pengene i denne enkelt node gjør det enkelt å animere alle pengene på en gang.
Deretter lager vi konstantene dealBtn
, hitBtn
, og standBtn
. Som navnene antyder, vil disse bli brukt i spill for å håndtere, treffe og stå henholdsvis. Vi bruker brukervennligheten init (imageNamed :)
, som tar som en parameter navnet på bildet uten en forlengelse.
Vi lager da de tre konstantene money10
, money25
, og money50
, som er av typen Penger
. Penger
er en tilpasset klasse som strekker seg SKSpriteNode
og avhengig av typen moneyValue
bestått som en parameter skaper en av tre forskjellige pengetyper. De moneyValue
parameteren er av typen MoneyValue
, som er en enum
. Ta en titt på Penger
klasse i prosjektet GitHub repo for å se hvordan alt dette fungerer.
Til slutt oppretter vi en SKLabelNode
ved hjelp av bekvemmelighetsinitiatoren init (tekst :)
som tar som en parameter teksten som skal vises på etiketten.
setupTable
Legg til følgende under didMove (i :)
funksjon.
func setupTable () la tabellen = SKSpriteNode (imageNamed: "table") addChild (tabell) table.position = CGPoint (x: size.width / 2, y: size.height / 2) table.zPosition = -1 addChild moneyContainer) moneyContainer.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.position = CGPoint (x: size.width / 2 - 125, y: size.height / 2) instructionText.fontColor = UIColor.black addChild ) instructionText.position = CGPoint (x: size.width / 2, y: 400)
Her initialiserer vi en konstant bord
og legg det til scenen ved hjelp av addChild (_ :)
som tar som en parameter noden for å legge til scenen. Vi satte bord
's stilling
innenfor scenen og sette sin zPosition
til -1
. De zPosition
Egenskapen styrer rekkefølgen der knutepunktene trekkes. Det laveste tallet tegnes først, med høyere tall tegnes i rekkefølge. Fordi vi trenger bord
Under alt annet, satte vi det zPosition
til -1
. Dette sikrer at det trekkes før noen andre noder.
Vi legger også til moneyContainer
og instructionText
til scenen. Vi satte skriftfarge
av instructionText
til svart (standard er hvit).
Oppdater didMove (i :)
til følgende.
overstyr func didMove (for å vise: SKView) setupTable ()
De didMove (i :)
Metoden kalles umiddelbart etter at scenen er presentert av visningen. Vanligvis er dette stedet du vil gjøre oppsettet for din scene og opprette dine eiendeler. Hvis du tester nå, bør du se det bord
og instructionText
har blitt lagt til scenen. De moneyContainer
er det også, men du kan ikke se det fordi vi opprettet det med en klar farge.
setupMoney
Legg til følgende under setupTable
metode.
func setupMoney () addChild (money10) money10.position = CGPoint (x: 75, y: 40) addChild (money25) money25.position = CGPoint (x: 130, y: 40) addChild (money50) money50.position = CGPoint (x: 185, y: 40)
Her legger vi ganske enkelt penger til og legger sin posisjon. Invoke denne metoden innenfor didMove (i :)
.
overstyr func didMove (for å vise: SKView) setupTable () setupMoney ()
setupButtons
Legg til følgende under setupMoney
Metode du opprettet i trinnet ovenfor.
funk setupButtons () dealBtn.name = "dealBtn" addChild (dealBtn) dealBtn.position = CGPoint (x: 300, y: 40) hitBtn.name = "hitBtn" addChild (hitBtn) hitBtn.position = CGPoint (x: 450 , y: 40) hitBtn.isHidden = true standBtn.name = "standBtn" addChild (standBtn) standBtn.position = CGPoint (x: 600, y: 40) standBtn.isHidden = true
Som vi gjorde med penger i det forrige trinnet, legger vi til knappene og setter deres posisjoner. Her bruker vi Navn
eiendom slik at vi vil kunne identifisere hver knapp gjennom kode. Vi satte også hitBtn
og standBtn
å være skjult, eller usynlig, ved å sette inn IsHidden
eiendom til ekte
.
Påkall nå denne metoden innen didMove (i :)
.
overstyr func didMove (for å vise: SKView) setupTable () setupMoney () setupButtons ()
Hvis du kjører appen nå, bør du se at penger og knapper er lagt til scenen.
touchesBegan
Vi må implementere touchesBegan (_: med :)
Metode for å kunne fortelle når noen objekter i scenen er blitt rørt. Denne metoden kalles når en eller flere fingre har rørt ned på skjermen. Legg til følgende i touchesBegan
.
overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money") la penger = berørtNode som! Pengerinnsats (betAmount: money.getValue ())
De multiTouchEnabled
Egenskapen til scenens visning er satt til falsk
som standard, som betyr at visningen bare mottar det første trykket på en multitouch-sekvens. Med denne egenskapen deaktivert, kan du hente kontakten ved å bruke først
Beregnet egenskap for berøringene sett siden det bare er ett objekt i settet.
Vi kan få touchLocation
innenfor scenen av plassering
egenskapen til berøring. Vi kan da finne ut hvilken knute som var berørt ved å påkalle atPoint (_ :)
og passerer i touchLocation
.
Vi sjekker om touchedNode
Navn på eiendom er lik "penger", og hvis det er vi vet at de har rørt på en av de tre pengene-instansene. Vi initialiserer en penger
konstant ved å downcasting touchedNode
til Penger
, og så kaller vi vedde
metode som påkaller getValue ()
metode på penger
konstant.
vedde
Skriv inn følgende under setupButtons
Funksjonen du opprettet i trinnet ovenfor.
func bet (betAmount: MoneyValue) hvis (betAmount.rawValue> player1.bank.getBalance ()) print ("Prøver å satse mer enn har"); return else pot.addMoney (mengde: betAmount.rawValue) la tempMoney = Money (moneyValue: betAmount) tempMoney.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.addChild (tempMoney) tempMoney.position = CGPoint : CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.width - tempMoney.size.width))): yGFloat (arc4random_uniform (UInt32 (moneyContainer.size.height - tempMoney.size.height))) dealBtn.isHidden = false ;
Vi sørger først for at spilleren ikke prøver å satse mer penger enn de har, og hvis de er, returnerer vi bare fra funksjonen. Ellers legger vi til betAmount
til gryte
, skape en konstant tempMoney
, sett sin forankringspunkt
til (0,0)
, og legg det til moneyContainer
. Vi setter da sin stilling
og skjul dealBtn
ved å sette sin IsHidden
eiendom til falsk.
SKSpriteNode
s har en forankringspunkt
Egenskapen som standard (0.5,0.5)
. Koordinatsystemet plasserer (0,0)
nederst til venstre og (1,1)
øverst til høyre. Du ville endre denne egenskapen fra standard hvis du roterte SKSpriteNode
og ønsket at den skulle rotere rundt et annet punkt. For eksempel, hvis du endret forankringspunkt
eiendom til (0,0)
og så SKSpriteNode
ville rotere fra nederste venstre hjørne. Du vil ofte endre denne egenskapen for å hjelpe med posisjonering, slik vi har her.
Vi må opprette en forekomst av Gryte
og Spiller
klasser for denne koden til å fungere. Legg til følgende sammen med de andre konstantene og variablene.
la potten = Pot () la player1 = Spiller (hånd: Hånd (), Bank: Bank ())
Hvis du tester nå, kan du trykke på noe av pengene og legge det til moneyContainer
.
avtale
Legg til følgende sammen med resten av dine konstanter og variabler.
la forhandler = forhandler (hånd: hånd ()) var allCards = [kort] () la dealerCardsY = 930 // Y plassering av dealer kort la playerCardsY = 200 // Y plassering av spillerkort var currentPlayerType: GenericPlayer = Spiller Hånd (), bank: Bank ()) la dekk = Dekke ()
De allCards
array vil bli brukt til å holde alle kortene i spillet. Dette gjør det enkelt å løse gjennom dem og fjerne dem fra scenen alt på en gang. De dealerCardsY
og playerCardsY
konstanter er posisjonene til kortene på y-aksen. Dette vil hjelpe oss når du plasserer nye kort. De currentPlayerType
brukes til å angi hvem som skal håndtere neste. Det vil enten være lik forhandler
eller PLAYER1
.
Innsiden didMove (i :)
, legg til følgende.
overstyr func didMove (for å vise: SKView) setupTable () setupMoney () setupButtons () currentPlayerType = player1
I den forrige koden ble vi initialisert currentPlayerType
til en navngitt forekomst av Spiller
klasse. Her satte vi det på PLAYER1
.
Vi må skape et nytt kortkort før vi gjennomfører avtalemetoden. Skriv inn følgende innen setupTable
.
func setupTable () la tabellen = SKSpriteNode (imageNamed: "table") addChild (tabell) table.position = CGPoint (x: size.width / 2, y: size.height / 2) table.zPosition = -1 addChild moneyContainer) moneyContainer.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.position = CGPoint (x: size.width / 2 - 125, y: size.height / 2) instructionText.fontColor = UIColor.black addChild ) instructionText.position = CGPoint (x: size.width / 2, y: 400) deck.new ()
Nå kan vi implementere avtalefunksjonen. Legg til følgende under vedde
metode.
func deal () instructionText.text = "" money10.isHidden = true; money25.isHidden = true; money50.isHidden = true; dealBtn.isHidden = true; standBtn.isHidden = false hitBtn.isHidden = false let tempCard = Kort (dress: "card_front", verdi: 0) tempCard.position = CGPoint (x: 630, y: 980) addChild (tempCard) tempCard.zPosition = 100 la newCard = deck.getTopCard () var whichPosition = playerCardsY var whichHand = player1.hand if (self.currentPlayerType er spiller) whichHand = player1.hand whichPosition = playerCardsY; else whichHand = dealer.hand whichPosition = dealerCardsY; whichHand.addCard (kort: newCard) la xPos = 50 + (whichHand.getLength () * 35) la moveCard = SKAction.move (til: CGPoint (x: xPos, y: whichPosition), varighet: 1,0) tempCard.run (moveCard, fullføring: [unowned self] i self.player1.setCanBet (canBet: true) hvis (self.currentPlayerType er Dealer && self.dealer.hand.getLength () == 1) self.dealer.setFirstCard : newCard) self.allCards.append (tempCard) tempCard.zPosition = 0 annet tempCard.removeFromParent () self.allCards.append (newCard) self.addChild (newCard) newCard.position = CGPoint (x: xPos, y: whichPosition) newCard.zPosition = 100 hvis (self.dealer.hand.getLength () < 2) if(self.currentPlayerType is Player) self.currentPlayerType = self.dealer else self.currentPlayerType = self.player1 self.deal() else if (self.dealer.hand.getLength() == 2 && self.player1.hand.getLength() == 2) if(self.player1.hand.getValue() == 21 || self.dealer.hand.getValue() == 21) self.doGameOver(hasBlackJack: true) else self.standBtn.isHidden = false; self.hitBtn.isHidden = false; if(self.dealer.hand.getLength() >= 3 && self.dealer.hand.getValue () < 17) self.deal(); else if(self.player1.isYeilding() && self.dealer.hand.getValue() >= Selv) self.hitBtn.isHidden = true; self.doGameOver (hasBlackJack: false); )
Denne metoden er ganske stor, men nødvendig for å implementere handlingslogikken. La oss ta det trinnvis. Vi initialiserer en tempCard
konstant til en forekomst av Kort
, sett sin posisjon, og legg den til scenen. Vi trenger dette kortet tegnet på en zPosition
større enn 0
, fordi forhandlerens første kort må være på 0
. Vi setter dette til et vilkårlig nummer-100
Vil gjøre. Vi lager også en newCard
konstant ved å påkalle Dekk
's getTopCard ()
metode.
Deretter initialiserer vi to variabler, whichPosition
og whichHand
, og kjør gjennom en logikk for å bestemme sluttverdiene. Vi legger da til newCard
til riktig hånd (enten spillerens eller forhandlerens). De XPOS
Konstant bestemmer den endelige x-posisjonen til kortet når den er ferdig animert.
De SKAction
klassen har en rekke klassemetoder du kan ringe for å endre en nodes egenskaper som posisjon, skala og rotasjon. Her kaller vi bevege seg (i: :) varighet
metode som vil flytte knuten fra en posisjon til en annen. Men for å faktisk utføre SKAction
, du må påkalle løpe(_:)
metode for en node og passere i SKAction
som en parameter. Her påpeker vi imidlertid kjøre (_: ferdigstillelse :)
metode, som vil føre til at koden innen ferdigstillelse lukkes etter at handlingen fullfører gjennomføringen.
Etter at handlingen har gått til slutt, lar vi spilleren satse ved å påkalle setCanBet (canBet :)
på PLAYER1
forekomst. Vi sjekker da om currentPlayerType
er en forekomst av forhandler
, og kontroller at forhandler
Bare har ett kort ved å påkalle hand.getLength ()
. Hvis dette er tilfelle, setter vi inn forhandler
Første kort, som vi trenger på slutten av spillet.
Fordi det forhandler
Første kort er alltid med forsiden ned til slutten av spillet, vi trenger en referanse til det første kortet, så vi kan vise det senere. Vi legger til dette kortet til allCards
array slik at vi kan fjerne det senere, og deretter sette det zPosition
eiendom til 0
som vi trenger dette kortet under alle de andre kortene. (Husk at de andre kortene har z-posisjon 100
.)
Hvis currentPlayerType
er ikke en forekomst av forhandler
, og håndens lengde er ikke lik 1
, da fjerner vi tempCard
og sett newCard
i samme posisjon, sørg for å angi dens zPosition
til 100
.
I henhold til blackjacks regler får både dealer og spiller to kort for å starte spillet med. Her sjekker vi hva currentPlayerType
er og skifter det til motsatt. Fordi forhandleren har mindre enn to kort, påberoper vi oss avtale
funksjonen igjen. Ellers sjekker vi om begge deler forhandler
og PLAYER1
har to kort, og hvis dette er tilfelle, sjekker vi for å se om de har kort med en totalverdi på 21-en vinnende hånd. Hvis enten har 21 da er spillet over, fordi en av dem har fått blackjack. Hvis ingen har 21 så viser vi standBtn
og hitBtn
og spillet fortsetter.
Reglene for blackjack sier at forhandler
må stå på 17 eller større. De neste kodelinjene kontrollerer om forhandler
Handens verdi er mindre enn 17 og hvis så påkaller avtale
metode. Hvis det er 17 eller større enn spillet er over. Til slutt, hvis PLAYER1
Handens verdi er større enn 21 så er spillet over fordi de har busted.
Dette var mye logikk for å gå gjennom! Hvis noe er uklart, bare les det igjen og ta deg tid til å forstå det.
Deretter må vi implementere spillet er slutt
metode.
Vi må kunne fortelle når brukeren har trykket på avtaleknappen. Legg til følgende kode i touchesBegan (_: med :)
metode.
overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money") la penger = berørtNode som! Money bet (betAmount: money.getValue ()) hvis (touchedNode.name == "dealBtn") deal ()
doGameOver
Deretter skriver du inn følgende under avtale
Metode du opprettet i trinnet ovenfor.
func doGameOver (hasBlackJack: Bool) hitBtn.isHidden = true standBtn.isHidden = true la tempCardX = allCards [1] .position.x la tempCardY = allCards [1] .position.y la tempCard = dealer.getFirstCard () addChild tempCard) allCards.append (tempCard) tempCard.position = CGPoint (x: tempCardX, y: tempCardY) tempCard.zPosition = 0 var vinner: GenericPlayer = player1 if (hasBlackJack) if (player1.hand.getValue ()> dealer. hand.getValue ()) // Legg til spillere Bank her (pott verdi * 1.5) instructionText.text = "Du har BlackJack!"; moveMoneyContainer (posisjon: playerCardsY) else // Trekk fra spillere bank her instructionText.text = "Forhandleren fikk BlackJack!"; moveMoneyContainer (posisjon: dealerCardsY) return hvis (player1.hand.getValue ()> 21) instructionText.text = "You Busted!" // Trekk fra spillere bankvinner = forhandler annet hvis (dealer.hand.getValue ()> 21) // Legg til spillere bank instructionText.text = "Dealer Busts. You Win!" vinner = player1 else if (dealer.hand.getValue ()> player1.hand.getValue ()) // Trekke fra spillere bank instructionText.text = "You Lose!" vinner = forhandler annet hvis (dealer.hand.getValue () == player1.hand.getValue ()) // Trekke fra spillere bank instructionText.text = "Tie - Dealer Wins!" vinner = forhandler annet hvis (dealer.hand.getValue () < player1.hand.getValue()) //Add to players bank instructionText.text="You Win!"; winner = player1 if(winner is Player) moveMoneyContainer(position: playerCardsY) else moveMoneyContainer(position: dealerCardsY)
Vi får x og y posisjonen til det første kortet i allCards
array, som er dealerens første kort. Da instanser vi en konstant tempCard
ved å påkalle getFirstCard
på forhandleren. Husk at vi angir dette Kort
tidligere i avtalemetoden? Her legger vi den til scenen, setter sin posisjon ved hjelp av tempCardX
og tempCardY
konstanter, og sett dens zPosition
til 0
så det er under de andre kortene.
Vi trenger å vite hvem som vant spillet, så vi initialiserer en variabel vinner
sette den lik til PLAYER1
, selv om dette kan endres avhengig av om forhandler
faktisk vunnet spillet.
Vi kjører gjennom en logikk for å avgjøre hvem som vant spillet. Hvis hasBlackjack
parameteren var sann da vi regner ut hvem som vant og returnerte fra funksjonen. Ellers fortsetter vi gjennom logikken for å finne ut hvem som vant spillet. Jeg skal ikke gå trinnvis gjennom denne logikken, da det burde være klart å forstå. Uansett hvem vant, anvender vi moveMoneyContainer (posisjon :)
, som tar som en parameter posisjonen til å flytte pengerbeholderen til. Dette vil være y-posisjonen til enten forhandler
s eller PLAYER1
s kort.
moveMoneyContainer
Skriv inn følgende kode under doGameOver
metode.
func moveMoneyContainer (posisjon: Int) la moveMoneyContainer = SKAction.moveTo (y: CGFloat (posisjon), varighet: 3.0) moneyContainer.run (moveMoneyContainer, fullføring: [unowned self] i self.resetMoneyContainer ());
De moveMoneyContainer (posisjon :)
Metoden beveger moneyContainer
til den som vant spillet, enten spilleren eller forhandleren. Når SKAction
fullfører, påberoper vi oss resetMoneyContainer
.
resetMoneyContainer
De resetMoneyContainer
Metoden fjerner alle pengene ved å påkalle removeAllChildren ()
metode, tilbakestiller moneyContainer
til sin opprinnelige posisjon, og påberoper newGame
.
func resetMoneyContainer () moneyContainer.removeAllChildren () moneyContainer.position.y = size.height / 2 newGame ()
newGame
Legg til følgende under resetMoneyContainer
Metode du implementerte i trinnet ovenfor.
func newGame () currentPlayerType = player1 deck.new () instructionText.text = "PLACE DIN BET"; money10.isHidden = false; money25.isHidden = false; money50.isHidden = false; dealBtn.isHidden = false player1.hand.reset () dealer.hand.reset () player1.setYielding (yield: false) for kort i alleKort card.removeFromParent () allCards.removeAll ()
Her tilbakestilles alle nødvendige variabler og fjerner alle kortene fra scenen ved å løpe gjennom allCards
array og påkalle removeFromParent ()
på hvert element.
hitBtn
og standBtn
Alt som er igjen for å fullføre vårt spill er å implementere berøringene på hitBtn
og standBtn
. Skriv inn følgende i feltet touchesBegan (_: med :)
metode.
overstyr func touchesBegan (_ berører: Set, med hendelsen: UIEvent?) vakt låt berøre = berører.for det første return la touchLocation = touch.location (i: selv) la touchedNode = self.atPoint (touchLocation) hvis (touchedNode.name == "money") la penger = berørtNode som! Betalingsmåte (betAmount: money.getValue ()) hvis (touchedNode.name == "dealBtn") deal () hvis (touchedNode.name == "hitBtn") hit () hvis (touchedNode.name = = "standBtn") stand ()
Og nå skal vi implementere metodene som kalles i hendelseshandleren. Skriv inn følgende to metoder under newGame
metode.
func hit () player1.getCanBet ()) currentPlayerType = player1 deal () player1.setCanBet (canBet: false) func stand () player1.setYielding (yields: true) standBtn.isHidden = true hitBtn. isHidden = true if (dealer.hand.getValue () < 17) currentPlayerType = dealer deal(); else doGameOver(hasBlackJack: false)
Innen truffet
metode, sørger vi for at spilleren kan satse, og hvis det er tilfelle, setter vi inn currentPlayerType
til PLAYER1
, og deretter påkalle avtale
metode og stopp spilleren ved å satse videre.
Innenfor standemetoden påberoper vi oss setYielding
på PLAYER1
, passerer inn ekte
. Vi sjekker da om forhandler
Handens verdi er mindre enn 17, og hvis det er tilfellet, kaller vi avtale, og hvis forhandler
hånden er 17 eller større betyr det at spillet er over.
Du kan nå teste det fullførte spillet.
Dette var en lang opplæring med en god logikk tucked away i avtale metoden. Vi implementerte ikke ved hjelp av Gryte
og legge til og trekke penger fra spillerens bank. Hvorfor ikke prøve å gjøre det som en øvelse for å fullføre appen?
Du har nå et blackjack-spill å være stolt av. Takk for at du leser, og jeg håper du fant denne opplæringen nyttig. Mens du er her, sjekk ut noen av våre andre kurs og opplæringsprogrammer om appprogrammering med Swift og SpriteKit!