Dans ce didacticiel, vous allez créer un jeu de blackjack dans SpriteKit à l’aide de Swift 3. Vous apprendrez à mettre en œuvre le toucher, la création d’animations visuelles et de nombreux autres concepts qui vous seront utiles lors de la création d’un jeu SpriteKit..
Ouvrez Xcode et choisissez Créer un nouveau projet Xcode ou choisir Nouveau> Projet… du Fichier menu. Assure-toi iOS est sélectionné et choisissez le Jeu modèle.
Ensuite, choisissez ce que vous souhaitez pour le Nom du produit, nom de l'organisation, et Identifiant d'organisation. Sois sûr que La langue est réglé sur Rapide, Technologie de jeu est réglé sur SpriteKit, et Dispositifs est réglé sur iPad.
Spécifiez un emplacement pour enregistrer les fichiers du projet et cliquez sur Créer.
Téléchargez le repo GitHub pour ce projet. À l'intérieur, vous verrez un Des classes dossier. Ouvrez ce dossier et faites glisser tous les fichiers sur le dossier qui porte le nom de celui que vous avez nommé votre projet, par exemple, black jack. Assure-toi Copier les éléments si nécessaire est cochée ainsi que la cible principale dans la liste des cibles.
Le référentiel du tutoriel GitHub contient également un dossier nommé images de tutoriel. Dans le navigateur de projet, ouvrez Assets.xcassets et faites glisser toutes les images dans la barre latérale. Xcode créera automatiquement des atlas de texture à partir de ces images.
Dans le navigateur de projet, vous pouvez supprimer deux fichiers (Gamescene.sks et Actions.sks).Supprimez ces deux fichiers et sélectionnez Mettre à la corbeille. Ces fichiers sont utilisés par l'éditeur de scène intégré à Xcode, qui peut être utilisé pour présenter visuellement vos projets. Nous allons tout créer avec du code, donc ces fichiers ne sont pas nécessaires.
Ouvrir GameViewController.swift, effacez son contenu et remplacez-le par le suivant.
import UIKit import SpriteKit class GameViewController: UIViewController remplace func viewDidLoad () super.viewDidLoad () let scene = GameScene (taille: CGSize (width: 768, height: 1024)) let skView = self.view as! SKView skView.showsFPS = false skView.showsNodeCount = false skView.ignoresSiblingOrder = false scene.scaleMode = .aspectFill skView.presentScene (scène) écrasement de la valeur var prefersStatusBarHidden: Bool return true
le GameViewController
la classe hérite de UIViewController
et aura un SKView
comme sa vue. À l'intérieur de viewDidLoad
méthode, nous avons descendu le vue
propriété à un SKView
exemple, en utilisant le comme!
tapez l'opérateur cast et configurez la vue.
Si vous exécutez ce projet lors de sa création, vous remarquerez peut-être un texte en bas à droite de l'écran. C'est ce que le spectaclesFPS
et showsNodeCount
propriétés sont pour, montrant le nombre d'images par seconde du jeu et le nombre de SKNodes
visible dans la scène. Nous n’avons pas besoin de cette information, nous les avons donc configurés pour faux
.
le ignoreSiblingOrder
propriété est utilisée pour déterminer l'ordre de tirage du SKNode
s dans le jeu. Nous réglons ceci à faux
ici parce que nous avons besoin de notre SKNodes
dessiner dans l'ordre dans lequel ils sont ajoutés à la scène.
Enfin, nous définissons le mode échelle sur .aspectFill
, ce qui entraînera l’échelle du contenu de la scène sur tout l’écran. Nous invoquons ensuite le presentScene (_ :)
méthode sur le skView
qui présente ou "montre" la scène.
Ensuite, supprimez tout ce qui se trouve dans GameScene.swift et remplacez-le par le suivant.
import SpriteKit import GameplayKit class GameScene: SKScene annule la fonction didMove (pour afficher: SKView) annule la fonction touchBegan (_ touches: Définir, avec événement: UIEvent?)
Vous pouvez maintenant tester le projet et vous devriez avoir un écran noir. Dans la prochaine étape, nous commencerons à ajouter du contenu à notre scène..
Entrez le code suivant au début de la GameScene
classe juste en dessous de GameScene
hérite de SKScene
.
class GameScene: SKScene let moneyContainer = SKSpriteNode (couleur: .clear, taille: CGSize (largeur: 250, hauteur: 150)) let dealBtn = SKSpriteNode (imageNamed: "deal_btn") let hitBtn = SKSpriteNode (imageNamed: "hit_btn") let standBtn = SKSpriteNode (imageNamed: "stand_btn") let money10 = Money (moneyValue: .ten) let money25 = Money (valueValue: .twentyFive) let money50 = Money (valueValue: .ten) let money25 = Money (valueValue: .twentyFive) let money50 = Money (valueValue: .ten) let instructionText = SKLabelNode (text: "Place votre pari ")
Nous créons un certain nombre de SKSpriteNode
s ici. SKSpriteNode
s sont utilisés pour créer un noeud coloré, ou plus communément à partir d’un SKTexture
, qui est le plus souvent une image. Nous utilisons l'initialiseur de commodité init (couleur: taille :)
créer un noeud de couleur claire moneyContainer
. le moneyContainer
sera utilisé pour conserver l'argent que le joueur parie, et à la fin de chaque tour, nous animerons ce déplacement vers le vainqueur. Placer tout l'argent dans ce seul nœud facilite l'animation de tout l'argent en même temps.
Ensuite, nous créons les constantes dealBtn
, hitBtn
, et standBtn
. Comme les noms le suggèrent, ils seront utilisés dans le jeu pour traiter, frapper et rester, respectivement. Nous utilisons l'initialiseur de commodité init (imageNamed :)
, qui prend en paramètre le nom de l'image sans extension.
Nous créons ensuite les trois constantes argent10
, argent25
, et argent50
, qui sont du type Argent
. Argent
est une classe personnalisée qui s'étend SKSpriteNode
et selon le type de moneyValue
passé en tant que paramètre crée l'un des trois types d'argent différents. le moneyValue
le paramètre est de type MoneyValue
, qui est un enum
. Regardez le Argent
classe dans le projet GitHub repo pour voir comment tout cela fonctionne.
Enfin, nous créons un SKLabelNode
en utilisant l'initialiseur de commodité init (texte :)
qui prend en paramètre le texte à afficher dans l'étiquette.
setupTable
Ajouter ce qui suit sous le didMove (to :)
une fonction.
func setupTable () let table = SKSpriteNode (imageNamed: "table") addChild (table) 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 (instructionText) ) instructionText.position = CGPoint (x: size.width / 2, y: 400)
Ici on initialise une constante table
et l'ajouter à la scène en utilisant addChild (_ :)
qui prend en paramètre le noeud à ajouter à la scène. Nous avons mis le table
de position
dans la scène et mettre son zPosition
à -1
. le zPosition
property contrôle l'ordre dans lequel les nœuds sont dessinés. Le numéro le plus bas est tiré en premier, les plus élevés étant tirés dans l'ordre. Parce que nous avons besoin de table
en dessous de tout le reste, nous mettons sa zPosition
à -1
. Cela garantit qu'il est dessiné avant tout autre nœud.
Nous ajoutons aussi le moneyContainer
et instructionText
à la scène. Nous avons mis le couleur de la police
du instructionText
to black (le défaut est blanc).
Mettre à jour didMove (to :)
au suivant.
redéfinit func didMove (pour afficher: SKView) setupTable ()
le didMove (to :)
La méthode est appelée immédiatement après la présentation de la scène par la vue. En règle générale, c’est à cet endroit que vous effectuerez la configuration de votre scène et créerez vos éléments. Si vous testez maintenant, vous devriez voir que table
et instructionText
a été ajouté à la scène. le moneyContainer
est là aussi, mais vous ne pouvez pas le voir parce que nous l'avons créé avec une couleur claire.
setupMoney
Ajouter ce qui suit sous le setupTable
méthode.
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)
Ici, nous ajoutons simplement les instances d’argent et définissons leur position. Invoquer cette méthode dans didMove (to :)
.
remplacer func didMove (pour afficher: SKView) setupTable () setupMoney ()
boutons de configuration
Ajouter ce qui suit sous le setupMoney
méthode que vous avez créée à l'étape ci-dessus.
func 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
Comme nous l'avons fait avec les fonds à l'étape précédente, nous ajoutons les boutons et définissons leurs positions. Ici nous utilisons le prénom
propriété afin que nous puissions identifier chaque bouton par le code. Nous avons également mis le hitBtn
et standBtn
être caché, ou invisible, en réglant la est caché
propriété à vrai
.
Maintenant, invoquez cette méthode dans didMove (to :)
.
remplace func didMove (pour afficher: SKView) setupTable () setupMoney () setupButtons ()
Si vous exécutez l'application maintenant, vous devriez voir les instances d'argent et les boutons ont été ajoutés à la scène.
toucheBegan
Nous devons mettre en œuvre le toucheBegan (_: avec :)
méthode permettant de savoir quand un objet de la scène a été touché. Cette méthode est appelée lorsqu'un ou plusieurs doigts ont touché l'écran. Ajouter ce qui suit dans toucheBegan
.
remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money") laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ())
le multiTouchEnabled
propriété de la vue de la scène est définie sur faux
Par défaut, cela signifie que la vue reçoit uniquement le premier contact d'une séquence multitouch. Avec cette propriété désactivée, vous pouvez récupérer le contact en utilisant le premier
propriété calculée de l'ensemble des touches puisqu'il n'y a qu'un seul objet dans l'ensemble.
Nous pouvons obtenir le touchLocation
dans la scène par le emplacement
propriété du toucher. Nous pouvons alors déterminer quel noeud a été touché en appelant au point(_:)
et en passant dans le touchLocation
.
Nous vérifions si le touchedNode
La propriété name est égale à "argent", et si c’est nous savons qu’ils ont abordé l’une des trois instances d’argent. Nous initialisons une argent
constante en rabaissant la touchedNode
à Argent
, et ensuite on appelle le pari
méthode invoquant le getValue ()
méthode sur le argent
constant.
pari
Entrez ce qui suit sous le boutons de configuration
fonction que vous avez créée à l'étape ci-dessus.
func bet (betAmount: MoneyValue) if (betAmount.rawValue> player1.bank.getBalance ()) print ("Essayer de parier plus qu'avoir"); return else pot.addMoney (amount: betAmount.rawValue) let tempMoney = money (moneyValue: betAmount) tempMoney.anchorPoint = CGPoint (x: 0, y: 0) moneyContainer.addChild (tempMoney) tempMoney.position = CGPoint (x : CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.width - tempMoney.size.width))), y: CGFloat (arc4random_uniform (UInt32 (moneyContainer.size.height - tempMoney.size.height))) dealBtn. ;
Nous nous assurons d’abord que le joueur n’essaye pas de parier plus d’argent qu’il en a, et s’ils le font, nous revenons simplement de la fonction. Sinon, nous ajoutons le montant
au pot
, créer une constante tempMoney
, mettre sa point d'ancrage
à (0,0)
, et l'ajouter à la moneyContainer
. Nous avons ensuite mis sa position
et cache le dealBtn
en mettant sa est caché
propriété à false.
SKSpriteNode
s ont un point d'ancrage
propriété par défaut (0.5,0.5)
. Le système de coordonnées place (0,0)
en bas à gauche et (1,1)
en haut à droite. Vous souhaitez modifier cette propriété par défaut si vous faites pivoter le SKSpriteNode
et je voulais que ça tourne autour d'un point différent. Par exemple, si vous avez changé le point d'ancrage
propriété à (0,0)
puis le SKSpriteNode
tournerait de son coin inférieur gauche. Vous allez souvent changer cette propriété pour aider au positionnement, comme nous l'avons ici.
Nous devons créer une instance de la Pot
et Joueur
classes pour que ce code fonctionne. Ajoutez ce qui suit avec les autres constantes et variables.
let pot = Pot () let player1 = Player (main: main (), banque: banque ())
Si vous testez maintenant, vous pouvez appuyer sur n’importe quelle somme et l’ajouter à la liste. moneyContainer
.
traiter
Ajoutez ce qui suit avec le reste de vos constantes et variables.
let dealer = Dealer (main: main) var allCards = [Carte] () let dealerCardsY = 930 // position Y des cartes donneur laissez playerCardsY = 200 // position Y des cartes joueur var currentPlayerType: GenericPlayer = Player (main: Main (), banque: Bank ()) let deck = Deck ()
le toutes les cartes
tableau sera utilisé pour contenir toutes les cartes dans le jeu. Cela facilitera leur lecture en boucle et les supprimera de la scène en une seule fois. le dealerCardsY
et playerCardsY
les constantes sont les positions des cartes sur l’axe des y. Cela nous aidera lors du placement de nouvelles cartes. le currentPlayerType
est utilisé pour indiquer à qui traiter. Il sera soit égal à Marchand
ou joueur1
.
À l'intérieur didMove (to :)
, ajouter ce qui suit.
remplace func didMove (pour afficher: SKView) setupTable () setupMoney () setupButtons () currentPlayerType = player1
Dans le code précédent, nous avons initialisé currentPlayerType
à une instance non nommée du Joueur
classe. Ici nous l'avons mis à joueur1
.
Nous devons créer un nouveau jeu de cartes avant de mettre en œuvre la méthode de transaction. Entrez les informations suivantes dans setupTable
.
func setupTable () let table = SKSpriteNode (imageNamed: "table") addChild (table) 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 (instructionText) ) instructionText.position = CGPoint (x: size.width / 2, y: 400) deck.new ()
Nous pouvons maintenant implémenter la fonction deal. Ajouter ce qui suit sous le pari
méthode.
func deal () instructionText.text = "" money10.isHidden = true; money25.isHidden = true; money50.isHidden = true; dealBtn.isHidden = true; standBtn.isHidden = false hitBtn.isHidden = false let tempCard = Card (convient: "card_front", valeur: 0) tempCard.position = CGPoint (x: 630, y: 980) addChild (tempCard) tempCard.zPosition = 100 let newCard = deck.getTopCard () var quiPosition = playerCardsY var quiHand = player1.hand si (self.currentPlayerType est Player) whichHand = player1.hand whichPosition = playerCardsY; else whichHand = dealer.hand whichPosition = dealerCardsY; whichHand.addCard (card: newCard) let xPos = 50 + (whichHand.getLength () * 35) let moveCard = SKAction.move (to: CGPoint (x: xPos, y: quellePosition), durée: 1.0) tempCard.run (moveCard, complétion: [sans propriétaire]] dans self.player1.setCanBet (canBet: true) si (self.currentPlayerType est Dealer && self.dealer.hand.getLength () == 1) self.dealer.setFirstCard (card : newCard) self.allCards.append (tempCard) tempCard.zPosition = 0 else tempCard.removeFromParent () self.allCards.append (newCard) self.addChild (newCard) newCard.position = CGPoint (x: xPos, y: quellePosition) newCard.zPosition = 100 if (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() >= 17) self.standBtn.isHidden = true self.hitBtn.isHidden = true self.doGameOver (hasBlackJack: false) if (self.player1.hand.getValue ()> 21) self.standBtn.isHidden = true; self.hitBtn.isHidden = true; self.doGameOver (hasBlackJack: false); )
Cette méthode est assez volumineuse, mais nécessaire pour mettre en œuvre la logique de traitement. Allons-y pas à pas. Nous initialisons un tempCard
constante à une instance de Carte
, définissez sa position et ajoutez-la à la scène. Nous avons besoin de cette carte tirée à un zPosition
plus grand que 0
, parce que la première carte du revendeur doit être à 0
. Nous mettons cela à un nombre arbitraire-100
ça ira. Nous créons également un nouvelle carte
constante en invoquant le plate-forme
de getTopCard ()
méthode.
Ensuite, nous initialisons deux variables, quelle position
et quelle main
, et ensuite exécuter une certaine logique pour déterminer leurs valeurs finales. Nous ajoutons ensuite le nouvelle carte
à la main appropriée (du joueur ou du donneur). le xPos
constante détermine la position finale x de la carte une fois l'animation terminée.
le SKAction
class a un certain nombre de méthodes de classe que vous pouvez appeler pour modifier les propriétés d'un nœud, telles que la position, l'échelle et la rotation. Ici nous appelons le move (to: duration :)
méthode, qui déplacera le nœud d’une position à une autre. Cependant, pour réellement exécuter le SKAction
, vous devez invoquer le courir(_:)
méthode d'un noeud et passez dans le SKAction
en paramètre. Ici, cependant, nous invoquons le run (_: complétion :)
méthode, qui entraînera l'exécution du code dans la fermeture d'achèvement après l'exécution de l'action.
Une fois l’action terminée, nous permettons au joueur de parier en invoquant setCanBet (canBet :)
sur le joueur1
exemple. Nous vérifions ensuite si le currentPlayerType
est un exemple de Marchand
, et vérifier que le Marchand
a seulement une carte en invoquant hand.getLength ()
. Si tel est le cas, nous définissons la Marchand
La première carte dont nous aurons besoin à la fin du jeu.
Parce que le Marchand
La première carte est toujours face cachée jusqu'à la fin de la partie. Nous avons besoin d'une référence à la première carte pour pouvoir la montrer plus tard. Nous ajoutons cette carte au toutes les cartes
tableau afin que nous puissions le supprimer plus tard, puis définissez sa zPosition
propriété à 0
comme nous avons besoin de cette carte ci-dessous toutes les autres cartes. (Rappelez-vous que les autres cartes ont la position z 100
.)
Si la currentPlayerType
n'est pas un exemple de Marchand
, et la longueur de la main n'est pas égale à 1
, puis on enlève le tempCard
et mettre le nouvelle carte
dans la même position, en veillant à régler son zPosition
à 100
.
Selon les règles du blackjack, le croupier et le joueur reçoivent deux cartes pour commencer le jeu. Ici, nous vérifions ce que le currentPlayerType
est et le changer à l'opposé. Comme le croupier a moins de deux cartes, nous invoquons le traiter
fonctionner à nouveau. Sinon, nous vérifions si les deux Marchand
et joueur1
avoir deux cartes, et si tel est le cas, nous vérifions si l'une ou l'autre a des cartes d'une valeur totale de 21-une main gagnante. Si l'un a 21 alors le jeu est terminé parce que l'un d'entre eux a obtenu un black jack. Si ni a 21 alors nous montrons la standBtn
et hitBtn
et le jeu continue.
Les règles du black jack prévoient que le Marchand
doit se tenir à 17 ou plus grand. Les prochaines lignes de code vérifient si le Marchand
La valeur de la main de est inférieure à 17 et si ainsi invoque le traiter
méthode. Si c'est 17 ou plus, le jeu est terminé. Enfin, si joueur1
La valeur de la main de est supérieure à 21 alors le jeu est terminé parce qu'ils ont éclaté.
C'était beaucoup de logique à traverser! Si quelque chose n'est pas clair, relisez-le et prenez votre temps pour le comprendre..
Ensuite, nous devons mettre en œuvre le jeu terminé
méthode.
Nous devons pouvoir savoir quand l'utilisateur a appuyé sur le bouton Deal. Ajoutez le code suivant au toucheBegan (_: avec :)
méthode.
remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money") laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ()) if (touchedNode.name == "dealBtn") deal ()
doGameOver
Ensuite, entrez ce qui suit sous le traiter
méthode que vous avez créée à l'étape ci-dessus.
func doGameOver (hasBlackJack: Bool) hitBtn. tempCard) allCards.append (tempCard) tempCard.position = CGPoint (x: tempCardX, y: tempCardY) tempCard.zPosition = 0 gagnant gagnant: GenericPlayer = player1 if (hasBlackJack) if (player1.hand.getValue ()>. hand.getValue ()) // Ajouter aux joueurs Bank Ici (valeur du pot * 1.5) instructionText.text = "Vous avez un BlackJack!"; moveMoneyContainer (position: playerCardsY) else // Soustrayez de la banque de joueurs ici instructionText.text = "Le revendeur a obtenu BlackJack!"; moveMoneyContainer (position: dealerCardsY) return if (player1.hand.getValue ()> 21) instructionText.text = "You Busted!" // Soustraire de la banque de joueurs gagnant = concessionnaire else if (dealer.hand.getValue ()> 21) // Ajouter à la banque de joueurs instructionText.text = "Les bustes des concessionnaires. Vous gagnez!" winner = player1 else if (dealer.hand.getValue ()> player1.hand.getValue ()) // soustrait de la banque des joueurs instructionText.text = "You Lose!" winner = dealer else if (dealer.hand.getValue () == player1.hand.getValue ()) // Soustraire de la banque du joueur instructionText.text = "Cravate - Le revendeur gagne!" gagnant = dealer else if (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)
Nous obtenons la position x et y de la première carte dans le toutes les cartes
tableau, qui est la première carte du revendeur. Puis on instancie une constante tempCard
en invoquant getFirstCard
sur le revendeur. N'oubliez pas que nous définissons ceci Carte
plus tôt dans la méthode des transactions? Ici, nous l’ajoutons à la scène, définissons sa position à l’aide des touches tempCardX
et tempCardY
constantes et définissez sa zPosition
à 0
il est donc sous les autres cartes.
Nous avons besoin de savoir qui a gagné le jeu, donc nous initialisons une variable gagnant
le mettre égal à joueur1
, si cela peut changer en fonction de si le Marchand
effectivement gagné le jeu.
Nous suivons ensuite une certaine logique pour déterminer qui a gagné le match. Si hasBlackjack
paramètre était vrai alors nous déterminons qui a gagné et revient de la fonction. Sinon, nous poursuivons dans la logique pour déterminer qui a remporté le match. Je ne vais pas aller pas à pas dans cette logique, qui doit être claire à comprendre. Peu importe qui a gagné, nous invoquons moveMoneyContainer (position :)
, qui prend comme paramètre la position pour déplacer le conteneur d’argent vers. Ce sera la position y de la Marchand
ou joueur1
Les cartes de.
moveMoneyContainer
Entrez le code suivant sous le doGameOver
méthode.
func moveMoneyContainer (position: Int) let moveMoneyContainer = SKAction.moveTo (y: CGFloat (position), durée: 3.0) moneyContainer.run (moveMoneyContainer, complétion: [auto non propriétaire] dans self.resetMoneyContainer ());
le moveMoneyContainer (position :)
la méthode déplace le moneyContainer
à celui qui a gagné le jeu, que ce soit le joueur ou le croupier. Quand le SKAction
complète, nous invoquons resetMoneyContainer
.
resetMoneyContainer
le resetMoneyContainer
méthode supprime tous les fonds en invoquant le removeAllChildren ()
méthode, réinitialise le moneyContainer
à sa position d'origine, et invoque nouveau jeu
.
func resetMoneyContainer () moneyContainer.removeAllChildren () moneyContainer.position.y = size.height / 2 newGame ()
nouveau jeu
Ajouter ce qui suit sous le resetMoneyContainer
méthode que vous avez mis en œuvre dans l'étape ci-dessus.
func newGame () currentPlayerType = player1 deck.new () instructionText.text = "PLACE YOUR BET"; money10.isHidden = false; money25.isHidden = false; money50.isHidden = false; dealBtn.isHidden = false player1.hand.reset () dealer.hand.reset () player1.setYielding (rendement: false) pour la carte allCards card.removeFromParent () allCards.removeAll ()
Ici, nous réinitialisons toutes les variables nécessaires et retirons toutes les cartes de la scène en passant en boucle. toutes les cartes
tableau et invoquer removeFromParent ()
sur chaque élément.
hitBtn
et standBtn
Pour terminer notre jeu, il ne reste plus qu'à mettre en œuvre les touches sur le hitBtn
et standBtn
. Entrez les informations suivantes dans le toucheBegan (_: avec :)
méthode.
remplacer les touches fonctionnellesBien (_ touches: Définir, with event: UIEvent?) gardien laissez touch = touch.first else return laissez touchLocation = touch.location (dans: self) laissez touchedNode = self.atPoint (touchLocation) if (touchedNode.name == "money") laisser de l'argent = touchedNode as! Pari d'argent (betAmount: money.getValue ()) if (touchedNode.name == "dealBtn") deal () if (touchedNode.name == "hitBtn") hit () if (touchedNode.name = = "standBtn") stand ()
Et maintenant, nous allons implémenter les méthodes appelées dans le gestionnaire d'événements. Entrez les deux méthodes suivantes sous le nouveau jeu
méthode.
func hit () if (player1.getCanBet ()) currentPlayerType = player1 deal () player1.setCanBet (canBet: false) func stand () player1.setYielding (rendement: true) standBtn.isHidden = true hitBtn. isHidden = true si (dealer.hand.getValue () < 17) currentPlayerType = dealer deal(); else doGameOver(hasBlackJack: false)
Dans le frappé
méthode, nous nous assurons que ce joueur peut parier, et si tel est le cas, nous définissons la currentPlayerType
à joueur1
, puis invoquer le traiter
méthode et arrêter le joueur pariant plus loin.
Dans la méthode du stand, nous invoquons setYielding
sur joueur1
, en passant vrai
. Nous vérifions ensuite si le Marchand
La valeur de la main de est inférieure à 17, et si tel est le cas, nous appelons accord, et si le Marchand
la main de 17 ou plus cela signifie que le jeu est terminé.
Vous pouvez maintenant tester le jeu terminé.
Ce fut un long tutoriel avec une bonne logique dissimulée dans la méthode des transactions. Nous n'avons pas implémenté l'utilisation du Pot
et additionner et soustraire de l'argent de la banque du joueur. Pourquoi n'essaies-tu pas de faire ça comme exercice pour finir l'application??
Vous avez maintenant un jeu de blackjack dont vous pouvez être fier. Merci de votre lecture et j'espère que vous avez trouvé ce tutoriel utile. Pendant que vous êtes ici, consultez certains de nos autres cours et tutoriels sur la programmation d'applications avec Swift et SpriteKit.!