Multiples utilisations de l'accelerometre

vico92vico92 Membre
mai 2009 modifié dans API UIKit #1
Bonjour,

J'utilise l'accelerometre pour déplacer une View au chargement de l'appli et une autre View
après un touchBegan. (Il est donc implementé dans les 2 fichiers de classe des Views.)

Comment faire pour utiliser l'accelerometre à  différents moments, avec différents réglages sans créer un telescopage qui plante les animations au runtime ?

Merci d'avance,

Vico,
Roi de la Pomme de Terre rêvant de devenir Maà®tre Chocolatier ^^

Réponses

  • vico92vico92 Membre
    06:40 modifié #2
    En fait, si quelqu'un pouvait m'expliquer comment acceder aux donnees de l'accelerometre depuis n'importe où, ça serait plus simple. Je n'arrive pas à  gérer le delegate correctement alors que c'est surement la clef...
  • AliGatorAliGator Membre, Modérateur
    06:40 modifié #3
    L'accéléromètre est un singleton, et il ne peut y avoir qu'un seul delegate.
    Donc deux solutions s'offrent à  toi :

    1) soit tu conçois ton appli de sorte de pouvoir utiliser un objet unique pour contenir les informations de ton acceleromètre (par exemple un objet unique qui garde les dernières valeurs de l'accéléromètre, et ensuite chaque objet qui a besoin de ces valeurs "requêtent" l'objet pour lui demander cette dernière valeur)

    2a) soit tu utilises un delegate "intermédiaire" qui va "distribuer" les messages dudit delegate à  plusieurs objets "listeners". Ceci peut être fait à  l'aide d'un objet, qui sera delegate du sharedAccelerometer et implémentera donc le protocole associé... et aura  en variable d'instance genre un "NSArray* listeners" qui va contenir tous les objets à  qui tu veux relayer les méthodes de l'UIAccelerometerDelegate. Donc l'implémentation des méthodes de UIAccelerometerDelegate dans ton objet consistera à  appeler ces mêmes messages sur chacun des objets du NSArray (via boucle for ou via [tt]makeObjectsPerformSelector:[/tt]).

    2b) Une autre solution est de ne pas utiliser un NSArray de listeners, mais que ton objet qui sera delegate du sharedAccelerometer émette une NSNotification dans le defaultCenter pour chacune des méthodes de delegate. Et ensuite dans le reste de ton appli, pour chaque objet qui souhaite être informé des modifications de ton accéléromètre, il suffit qu'il s'enregistre en observeur de la ou les notifications qui l'intéresse et que ton delegate émet.

    C'est le même principe que le tableau de listener (c'est le design pattern Listener/Observer derrière dans les deux cas), juste que dans le cas du NSNotificationCenter c'est plus orienté Cocoa en utilisant les classes toutes faites pour ça ;D
  • vico92vico92 Membre
    06:40 modifié #4
    Je vais plancher sur la 1ere solution, merci pour ton explication 

    (Ton message est daté de 3h du mat' heure française, soit tu es un bosseur couche-tard  :brule: comme moi, soit tu vis au Canada.)
  • LastikoLastiko Membre
    06:40 modifié #5
    aucun des 2

    il est pas humain simplement ;)
  • vico92vico92 Membre
    06:40 modifié #6
    dans 1242495408:

    aucun des 2

    il est pas humain simplement ;)


    Et oui c'est pas "crocodile du D"  mais un crocodile du C
    (je vous laisse méditer là -dessus...)
  • vico92vico92 Membre
    06:40 modifié #7
    Bon c pas le tout, je fais des blagues mais ça fait 2 jours que je suis bloqué avec mon histoire d'accelerometre  :'(

    J'essaye de faire la methode que tu m'as conseillé AliGator, mais je n'ai pas encore de résultat  :crackboom:-

    J'ai donc implémenté UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer]; dans le viewDidLoad de mon ViewController (soumis au protocole UIAccelerometerDelegate):
    <br />- (void)viewDidLoad {<br /><br />	UIAccelerometer *accelerometer = [UIAccelerometer sharedAccelerometer];<br />	accelerometer.delegate = self ;<br />	accelerometer.updateInterval = 1.0f/100.0f;<br />	[super viewDidLoad];<br />	<br />}<br />
    

    et je renvoie la valeur d'acceleration dans une view toute neuve grâce à  :
    <br />- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {<br />	<br />	[(GameView *)self.view setAcceleration:acceleration];<br />}<br />
    


    Maintenant, j'essaye en vain d'utiliser ces données à  partir d'autres subViews, qui sont des sous-classes de GameView. Mais je ne sais pas trop comment les appeler ces données, j'ai essayé avec viewDidLoad, awakeFromNib, ça compile sans erreurs mais rien ne bouge au runtime :
    <br />- (void)awakeFromNib {<br /><br />	// Use a basic low-pass filter to only keep the gravity in the accelerometer values for the X and Y axes<br />&nbsp; &nbsp; accelerationY = acceleration.y * kFilteringFactor + accelerationY * (1.0 - kFilteringFactor);<br />	<br />	CGAffineTransform translateL = CGAffineTransformMakeTranslation(accelerationY*100, - accelerationY*150);<br />	CGAffineTransform translateR = CGAffineTransformMakeTranslation(accelerationY*100, accelerationY*150);<br />	sangleL.transform = translateL;<br />	sangleR.transform = translateR;<br />	<br />}<br /><br />
    


    Voilà , comme je suis conscient que je demande beaucoup de choses sur ce forum, ne pouvant moi-même pas trop aider les autres du fait de mon statut de noob, je vous propose mes services en matière de graphisme, c'est mon métier depuis 15 ans, on dit que je me débrouille pas trop mal, alors si je peux vous conseiller ou vous aider, you're welcome  :brule:

    (ma bande demo est visible ici (c'est du graphisme 2D/3D et des SFX): http://www.dailymotion.com/relevance/search/demo+victor+barrere/video/x8loex_demo-reel-victor-barrere-2009_shortfilms
  • NseaProtectorNseaProtector Membre
    06:40 modifié #8
    A mon avis la solution 2b (notification center) évoqué par Aligator serait plus facile à  implémenter.
Connectez-vous ou Inscrivez-vous pour répondre.