Problème touchEnded

Bonjour à tous,

J’ai un petit problème avec la fonction touchEnded :

J’aimerais trouver un moyen d’ajouter un petit minuteur de quelques secondes dans ma fonction pour laisser le temps à ma variable de se stabiliser

Je m’explique :

J’essaie de compter le nombre de doigts présents sur l’écran avec une variable « doigts »(Int)
Sauf que lorsque j’enlève plusieurs doigt de l’écran, la fonction prend en compte la première valeur qu’elle récupère (étant donné que je ne peux pas enlever mes doigts en même temps à la milliseconde près) et continue en me décomptant tout les doigt.

J’aimerais rajouter ce petit timer (1 seconde) pour me donner la dernière valeur (doigts restant sur l’écran) après quelle les ait tous décomptés

Merci d’avance pour votre aide :pray:
Pierre.

Juste pour être certain de comprendre la question :
Tu veux savoir à la fin d’un touch, combien de doigts avaient été utilisés pendant ce touch. Et tu voudrais le savoir après que le dernier doigt ait été levé.

Si j’ai bien compris, alors voici une solution qui pourrait peut être fonctionner :
J’utiliserais 2 variables pour ceci : currentFingerCount et maxFingerCount

  1. Utilise touchBegan pour incrémenter ta variable currentFingerCount et augmenter maxFingerCount au moment où ils sont ajoutés.
  2. Utilise touchEnded, pour décrémenter ta variable currentFingerCount au moment où ils sont enlevés.
  3. Quand ta variable revient à 0 dans le touchesEnded alors tu sais que c’est le moment de déclencher ton appel de fonction, tu peux lire ta variable maxFingerCount pour savoir quel a été le nombre max au cours du geste.
  4. Pense à réinitialiser tes 2 variables une fois que ton geste a été entièrement traité pour préparer les futurs gestes.

Bonjour @mbritto ,

Merci de ton aide,

Enfaite ce que j’essaie de faire, c’est de porter un petit jeu qui s’appelle le jeu du doigt, sur iPhone :
(Je te met les règles ci dessous pour que tu comprenne le fonctionnement de mon app)

Je me sert déjà de la variable currentFingerCount dans le touchBegan et le touchEnded,
Ma fonction vérifie si currentFingerCount == ramdomNumber si « Oui » c’est gagné « sinon » c’est perdu.

Ce qui se passe c’est que je commence avec 4 doigts sur l’écran, le numéro aléatoire est (par exemple « 2 »), j’enlève tous les doigts de l’écran, et a ce moment la au lieu de me dire qu’il me reste 0 doigts, il me dit :

  • 4 currentFingerCount
  • 3 currentFingerCount
  • 2 currentFingerCount (Il s’arrete à cette ligne au lieu de prendre en compte le « 0 »)
  • 1 currentFingerCount
  • 0 currentFingerCount

Donc forcément currentFingerCount == ramdomNumber et la partie est gagné à chaque fois…

C’est pour ça que j’avais pensé à un petit timer d’une seconde pour lui laisser le temps de changer la valeur de ma variable currentFingerCount et la lire ensuite

Merci encore de ton aide :pray:

Les règles du jeu du doigt :

Placez le verre rempli au mileu de la table pour que tout le monde puisse le voir.

Chaque joueur pose ensuite son doigt sur le verre.

Un décompte de 3 secondes est fait par un des participants et à « 0 », le 1er joueur doit dire un chiffre entre 0 et le nombre de participants (ex « 6 » pour 6 participants). Au même moment, chaque joueur doit soit laisser son doigt sur le verre, soit le retirer. Cela vaut aussi pour celui qui énonce le chiffre.

Une fois cette étape franchie, 2 cas de figures sont possibles :

Le joueur 1 a réussi à deviner le nombre de doigts restant sur le verre

Le joueur 1 est autorisé à quitter le jeu car il a trouvé le bon nombre de doigt restants. C’est donc au joueur 2 de pronostiquer à son tour. S’il réussi, ce sera au joueur 3 et ainsi de suite.

  • Le joueur 1 n’a pas réussi à deviner le nombre de doigts restants sur le verre

C’est au joueur 2 de deviner.

Fin de partie : le dernier joueur restant perd la partie et doit boire le verre

Non, cela ne fonctionnera pas. Hooli_VR est un débutant travaillant uniquement avec SwiftUI. Et fort étrangement, il n’y a pas de touchesBean avec SwiftUI, ni de moyen simple de déterminer le début d’une action tactile. Je suis en train de plancher là-dessus et je suis assez étonné de voir à quel point SwiftUI complique certaines choses touchant au système…

Par exemple, il n’y a pas de onBegan avec la gesture DragGesture !

J’ai une idée pour ton problème, Hooli_VR, mais je dois encore faire des tests pour savoir si ça fonctionne.

1 « J'aime »

Bonjour @Draken @mbritto

J’ai pu résoudre mon problème en utilisant la fonction Timer :

func timerWaitFingers() {
        
        timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(fireTimer), userInfo: nil, repeats: true)
        }
       @objc func fireTimer() {
           print("Wait \(runCount)")
           runCount += 1

           if runCount == 2 {
               timer?.invalidate()
            finJeu()
            runCount = 0
        }
    }

Pour l’instant le code fonctionne très bien, le seul « petit » souci que j’ai c’est que peu importe ce que je rajoute sur ma vue (label…) ça n’est pas affiché dans l’app, comme si ça passait derrière la vue :man_shrugging:

J’ai l’impression que c’est lié à ce petit morceau de code car quand je le supprime, mon code ne fonctionne plus mais mes labels apparaissent :

override func loadView() {
        view = gameView()
    self.view.backgroundColor = .black
    }




override init(frame: CGRect) {
            super.init(frame: frame)
            isMultipleTouchEnabled = true
        }
1 « J'aime »

J’ai récupéré ce code pour mon app :

https://developer.apple.com/documentation/uikit/touches_presses_and_gestures/handling_touches_in_your_view/implementing_a_multi-touch_app#3004385

À priori dans leur code, le label apparait bien

Donc tu as renoncé à SwiftUI pour ton jeu, pour utiliser UIKit ?

1 « J'aime »

Oui, pour pouvoir utiliser les fonctions touchBegan (etc…)
pour l’instant tout est fonctionnel, je fais des petites modifications à droite, à gauche…
Je vais m’attaquer à la partie graphique mais j’ai ce petit problème