Screensaver & Quartz Composer

12:01 modifié dans API AppKit #1

Bonjour à  tous,

Nouveau sur le forum en tant que rédacteur, pas nouveau en tant que lecteur :)

Voilà , je déborde de fichiers .qtz, crées dans le but d'en faire des économiseurs de veille, mais voilà , quand je les poste sur des sites tel que DeviantArt, les gens galèrent pour les mettre dans leur dossier "screenSaver"... Enfin, je voudrait creer ces fameux ".saver" pour faciliter les choses ...

Bon quartz je maà®trise plus ou moins, Xcode, je en comprend pas grand chose, j'ai crée un premier Screensaver à  l'aide de ce tutoriel : http://cocoadevcentral.com/articles/000088.php, mais je n'ai nulle part trouvé sur internet un tutoriel expliquant la façon d'introduire un .qtz dans un projet .saver...

Alors, peut etre connessez vous un tutoriel pouvant m'aider, ou quelqu'un pourrait t'il me donner des consignes ou me faire un petit template-example ?

un grand merci d'avance,

MAxime

Réponses

  • AliGatorAliGator Membre, Modérateur
    12:01 modifié #2
    Bonjour et Bienvenue  ;)

    Je ne saurais pas te renseigner directement personnellement, n'ayant jamais fait ça.
    Mais je peux déjà  en attendant t'orienter vers des posts causant déjà  du sujet sur ce forum.

    1) Le projet d'économiseur d'écran "Fenêtres Volantes", dont tu as sans doute entendu parler puisqu'il a fait un petit buzz sur le net, a été conçu ici. Tu trouveras le fil de discussion associé ici. Bon il fait 50 pages, va falloir lire en diagonale, mais au final la version qui est sortie est un .saver avec du binaire dedans (donc du vrai code quoi) pour "amorcer/désamorcer" le screensaver (capture des images des fenêtres, activation du screensaver... et sortie de l'économiseur d'écran à  la fin), et un QTZ pour le reste de l'animation. Donc ça revient à  ce que tu veux faire, un QTZ à  la base mais piloté et encapsulé dans un code source fait avec XCode.

    2) Sinon tu as Ce topic qui cause de l'interfaçage entre un QTZ et du code Cocoa

    Voilà  je te laisse déjà  explorer ces pistes  ;)
  • 12:01 modifié #3
    Merci de ta réponse :)

    En effet, Fenetres volantes est un super fond d'écran que je connaisssait bien avant de connaitre cocoa et j'ai pu découvrir au fil des 50 pages quil avait été concu ici. C'est pourquoi je me tourne vers ce forum. Alors, en effet, dans le fil de discuss, on voit l'évolution, mais Boris donne ses qtz et Bru les introduits dans un .saver mais pas d'explication sur ce faire.

    Dans le second fil de discussion, on parle aussi de qtz dans un .saver, mais a part parler du fait qu'on peux utiliser les inputs et outputs dans xcode, la base me manque encore...

    En gros, pour un saver basé uniquement sur un qtz, une fois la classe importée et le .qtz aussi, comment et ou l'appeller ? C'est cela ma question...

    :) See you later alligator


  • BruBru Membre
    janvier 2008 modifié #4
    C'est très simple de lancer un qtz dans un screensaver de ton cru.

    1. créer le projet Xcode qui va bien.
    Par chance, y'a un template qui existe : new project>cocoa>screen saver module.

    2. le nouveau projet sera prérempli avec une sous-classe ScreenSaverView que tu vas devoir compléter.

    3. mets ton qtz dans les ressources du projet.

    4. modifie la méthode initWithFrame:isPreview: comme suit :
    <br />- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview<br />{<br />&nbsp;  NSString *cheminQtz;<br />&nbsp;  QCView *qtz;<br /><br />&nbsp;  if (!(self=[super initWithFrame:frame isPreview:isPreview])) return nil;<br /><br />&nbsp;  // récupération du chemin du qtz<br />&nbsp;  cheminQtz=[[NSBundle bundleForClass:[self class]] pathForResource:@&quot;mon-qtz&quot; ofType:@&quot;qtz&quot;];<br /><br />&nbsp;  if (cheminQtz)<br />&nbsp;  {<br />&nbsp; &nbsp; &nbsp; // chargement du module qtz<br />&nbsp; &nbsp; &nbsp; qtz=[[QCView alloc] initWithFrame:frame];<br />&nbsp; &nbsp; &nbsp; [qtz loadCompositionFromFile:cheminQtz];<br /><br />&nbsp; &nbsp; &nbsp; if (qtz)<br />&nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp;  [self addSubview:qtz];<br />&nbsp; &nbsp; &nbsp; &nbsp;  [qtz release];<br />&nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br /><br />&nbsp;  return self;<br />}<br />
    


    5. ajoute/modifie les méthodes startAnimation et stopAnimation :
    <br />- (void)startAnimation<br />{<br />&nbsp;  [[[self subviews] lastObject] startRendering];<br />}<br /><br />- (void)stopAnimation<br />{<br />&nbsp;  [[[self subviews] lastObject] stopRendering];<br />}<br />
    


    6. enfin ajoute la méthode hasConfigureSheet :
    <br />- (BOOL)hasConfigureSheet<br />{<br />&nbsp;  return NO;<br />}<br />
    


    7. Tu peux supprimer toutes les autres méthodes de la sous classe.

    8. compile puis installe le module screensaver.

    Dans l'exemple, le qtz que tu as déposé dans les ressources du projet se nomme mon-qtz.qtz.
    Ce que je viens d'écrire est le squelette de base.
    Il pourra être enrichi, notamment en utilisant les inputs du qtz (c'est à  dire en passant des paramètres du screensaver vers le qtz).

    Voilà .

    .
  • 12:01 modifié #5

    Merci Bru, enfin quelques éclairsissement sur ce sombre et pourtant simple passage.

    Toutefois, lorsque je suis ton tutoriel, j'ai quand meme quelques problemes.

    - Faut t'il quand meme charger le Quartz.framework ?

    - Pour introduire le .qtz dans ressources, il suffit bien de faire "action->add->Existing file->choisir le .qtz" ?

    - Dans ton code, dois je spécifier le chemin du .qtz? car il ne semble pas le trouver... (je l'ai pourtant mis dans le dossier mère du projet.

    je te met les erreurs en fichier joint

    Merci...
  • ClicCoolClicCool Membre
    janvier 2008 modifié #6
    Bonjour bodysoulspirit,

    Ce sont des erreurs typo...

    Pour le staticaly allocated ... error
    Il semble qu'un manque juste un *:
    NSString * cheminQtz

    Pour le undeclare suivant, je pense que QCView devrait-être le nom que tu pourrais donner à  ta sous classe de ScreenSaverView que tu implémentes ici. remplaces QCView par le nom de ta sous classe perso si tu veux et ça devrait coller.

    Pour le self lValue assignement erreur c'est une étourderie de débutant :P .
    Pour tester une égalité on utilise == et non pas = seul qui est ici une tentative d'assigner la valeur de droite à  l'Objet à  gauche.

    L'incompatible type assignement suivant vient de la première erreur (NSString au lieu de NSString *)
    Pareil, me semble-t-il pour l'erreur suivante.

    .




    [EDIT] correction typo (décidément !)
  • BruBru Membre
    janvier 2008 modifié #7
    Exact ClicCool pour les erreurs.

    Il manque l'étoile lors de la décla du chemin du qtz, et des parenthèses dans le premier if de la méthode initXXX. Enfin, il manque le point-virgule à  la ligne [qtz setFrame:frame].

    De plus, je n'ai pas vraiment mis les indications des frameworks/#import à  faire...
    Mais tout est dans la doc Apple !

    Pour ajouter le qtz au projet : fais un drag 'n drop du fichier qtz vers la fenêtre du projet Xcode au dessous du groupe "Resources" (dans la partie gauche de la fenêtre). Xcode  te demanderas s'il faut ajouter ledit fichier : vérifie bien que l'option "copy" soit bien cochée avant de valider.

    Sinon, en effet, faut ajouter à  ton projet le framework Quartz.framework.
    Toujours dans la partie gauche "Groups and files", tu fais un clic droit sur le groupe Framework, puis "add existing framework", enfin navigue jusqu'à  "System/Library/Frameworks/Quartz.framework" pour ajouter.

    Enfin, faut ajouter le #import qui va bien : je pense que #import <Quartz/Quartz.h> devrait suffire.

    Sinon, je suis au boulot sur un moche PC, d'où le code tapé à  la va-vite et non testé.
    Ce soir, je pourrais te fournir le code de "Fenêtres volantes" concernant la partie qtz.

    .
  • 12:01 modifié #8

    Bon, je parviens plus ou moins avec vos indications :) Un grand merci d'ailleur!

    Il semble que seul 2 petites erreurs subsistent...

    Mais ClicCool, Le nom de la sousClasse, tu veux dire _View.M ?

    Je met le log en Fichier Joint si vous pouviez me dire ce qu'il reste encore à  changer
  • BruBru Membre
    12:01 modifié #9
    Il faut changer la partie "chargement du module qtz". Relis le code au dessus que je viens de corriger.

    Relis aussi le IF qui va pas : je ne l'ai pas écrit comme ça.

    .
  • 12:01 modifié #10

    - Pour le If, j'ai mis un double == suite aux conseils de ClicCool, sinon, si je ne le fait pas, il me met un Invalid IValue in Assignement (comme sur le log joint.

    - Que dois-je changer dans le chargement du module? "CheminQtz" ? Dois je le remplacer par le nom du Qtz?
  • BruBru Membre
    12:01 modifié #11
    RELIS LE CODE QUE J'AI POSTé !

    (il est corrigé).

    .
  • 12:01 modifié #12
    Ok. Pardon, j'avait pas compris que tu l'avait modifié.

    Oui, c'est bon, ca marche nickel !  Maintenant je vois comment il faut faire.

    Par contre, je suis déçu. Je pensait que le fait de mettre un .qtz avec un module de récuperation de l'image écran, (ce qui fonctionne parfaitement si on utilise le .qtz directement comme économiseur en le placant dans le dossier screensaver) cette fonction serait reprise une fois le qtz dans le .saver, ce qui n'est pas le cas...

    C'est dommage, cela aurait été vachement plus simple que les inputs définis dans le .qtz et non rappellés dans le projet Xcode, soit par défaut appellés par le .qtz seul.

    Je joins le projet :


    Donc, un input de capture d'écran dans le .qtz, doit etre lié dans le projet xcode.
    Comment lier les inputs .qtz avec Xcode, ca je devrait trouver sur le web, par contre, quel est le code/la classe qui correspond à  la capture d'écran dans xcode ?
    Savez vous ou je pourrait trouver de la doc la dessus?
  • BruBru Membre
    12:01 modifié #13
    dans 1201607380:

    Pour le self lValue assignement erreur c'est une étourderie de débutant :P .
    Pour tester une égalité on utilise == et non pas = seul qui est ici une tentative d'assigner la valeur de droite à  l'Objet à  gauche.


    Merci pour le débutant...
    Mais le débutant, il te dis que t'es un peu à  coté de la plaque.

    Car c'est bien une assignation que je veux faire dans le IF !
    Ensuite, je teste le résultat de cette assignation.
    L'erreur provient du manque de parenthèse pour bien séparer le code assignation du code test.

    .
  • 12:01 modifié #14

    J'ai joint le projet dans mon message précédent.
  • AliGatorAliGator Membre, Modérateur
    12:01 modifié #15
    dans 1201612554:

    dans 1201607380:

    Pour le self lValue assignement erreur c'est une étourderie de débutant :P .
    Pour tester une égalité on utilise == et non pas = seul qui est ici une tentative d'assigner la valeur de droite à  l'Objet à  gauche.


    Merci pour le débutant...
    Mais le débutant, il te dis que t'es un peu à  coté de la plaque.

    Car c'est bien une assignation que je veux faire dans le IF !
    Ensuite, je teste le résultat de cette assignation.
    L'erreur provient du manque de parenthèse pour bien séparer le code assignation du code test.

    Juste une petite explication détaillée pour la ligne
    if (!(self=[super initWithFrame:frame isPreview:isPreview])) return nil;
    

    En fait il faut mettre autant de parenthèses que ça et un "=" au lieu d'un "==" parce que la ligne est une version condensée du code équivalent suivant :
    self = [super initWithFrame:frame isPreview:isPreview];<br />if (self == nil) return nil;
    


    Donc dans la paire de parenthèses la plus à  l'intérieur, il y a un "self = machin", c'est l'affectation.
    Et on profite de cette ligne pour tester si ce "self" est ensuite nil, et si c'est le cas directement retourner nil sans attendre.
    [tt]if (var)[/tt] est équivalent à  [tt]if (var != nil)[/tt] ou [tt]if (var == true)[/tt], et donc [tt]if (!var)[/tt] est équivalent à  [tt]if (var == nil)[/tt] ou [tt]if (var == false)[/tt].

    Mais si tu mets juste [tt]if (self = valeur)[/tt] le compilateur te met un warning car il pense que c'est uen faute de typo que tu as faite, en écrivant "=" là  où il s'attend habituellement à  voir un "==" (c'est plus probable d'avoir une coparaison, donc "==" dans la condition d'un "if" qu'un simple "=" qui est souvent le résultat d'une faute de frappe). Pour ne pas qu'il te mette le warning, il faut mettre des parenthèses supplémentaires pour d'une certaine façon indiquer au compilateur "oui oui c'est un "=" et pas un "==" mais c'est voulu et délibéré, pas une faute". Donc [tt]if ((self = valeur))[/tt] ou [tt]if ((self = valeur) != nil)[/tt]. Ou dans le cas qui nous intéresse (puisqu'on teste la condition inverse, si c'est nil), [tt]if (!(self = valeur))[/tt] ou [tt]if ( (self=valeur) == nil )[/tt]. La première syntaxe étant plus conseillée que la seconde.

    Voilà , je trouvais que ça méritait explication vu que c'était une ligne condensée et avec une subtilité dont on n'a pas tous l'habitude (et en plus Bru a répondu au message le temps que je rédige celui-ci ;D)
  • ClicCoolClicCool Membre
    12:01 modifié #16
    dans 1201612554:
    Merci pour le débutant...
    Mais le débutant, il te dis que t'es un peu à  coté de la plaque.


    Ahrg, zut ...

    Je me disais aussi que c'était trop beau comme occasion pour te taquiner (depuis le temps ...)

    Ceci dit moi aussi:
    - c'était juste pour aider (je n'avais pas eu l'occasion d'approfondir assez ce que tu veux faire)
    - je suis aussi sur un moche PC au travail en ce moment

    On est dans le même sac pour le coup: voilà  ce qui nous arrive quand on veux aider sans en avoir véritablement les moyens et le temps ;)
  • ClicCoolClicCool Membre
    12:01 modifié #17
    Ahrg derechef !

    Grilled par le grilleur à  retardement officiel du site !
    c'est pô bien ça  :P

    Merci pour les explications Ali.
    J'ai pas été assez attentif au code de Bru et me suis bêtement fié à  ce que disait xCode ...

    C'est pas mon jour on dirait ...
  • BruBru Membre
    12:01 modifié #18
    dans 1201612473:

    Par contre, je suis déçu. Je pensait que le fait de mettre un .qtz avec un module de récuperation de l'image écran, (ce qui fonctionne parfaitement si on utilise le .qtz directement comme économiseur en le placant dans le dossier screensaver) cette fonction serait reprise une fois le qtz dans le .saver, ce qui n'est pas le cas...
    C'est dommage, cela aurait été vachement plus simple que les inputs définis dans le .qtz et non rappellés dans le projet Xcode, soit par défaut appellés par le .qtz seul.


    Lorsque le qtz démarre sa capture d'écran, le screen-saver est déjà  lancé, donc l'écran est noir.
    Aussi, c'est du noir que le qtz capture et affiche.

    .
  • 12:01 modifié #19

    :) Bon, je suis en train de lire toute la doc cocoa sur le ACD Apple... Ca fait un paquet !

    Mais, j'aurait quand meme quelques questions a te poser a l'avenir je pense, car récuperer la capture d'écran et ce genre de choses, je ne vois pas ou ils en parlent.

    Sinon, ta proposition du code concernant le qtz de fenetres volantes m'interesse toujours...

    Bonne soirée,
    maxime
  • février 2008 modifié #20
    Bonjour,

    Bru, ton exemple de code marche nickel, mais j'ai toujours un petit problème que je ne parviens pas à  régler.

    - Dans la fenêtre des préférences système, le preview du saver ne s'affiche pas correctement. En effet, il s'affiche en petit en haut à  droite de l'espace réservé au preview...

    Deuxième question si quelqu'un pouvait m'aider, comment implementer une capture d'écran dans un .qtz importé dans un .saver? (le qtz ayant un input nommé "capture" à  cet effet)

    Ne trouvant aucun tuturiel ni exemple sur internet me permettant de résoudre ces probelemes, je me permet de demander de laide dans ce fil.

    Merci de votre aide.
  • Re-salut les gars :)


     


     


    Je déterre mon vieux post :)


     


    Entre temps pas mal de choses se sont passées.


    J'ai mis sur le web mon petit screensaver iOS 7 qui a été téléchargé plus 300 000 fois et ayant été commenté sur pas mal de magazines en ligne mac :) Content.


    Voir ici: http://bodysoulspirit.weebly.com/ios-7-screensaver-for-mac-os-x-by-bodysoulspirit.html


     


    Bon entre temps j'ai pas appris l'objective d'avantage.


     


    Mes 2 questions sont les suivantes: 


     


    1 - Y a t'il quelqu'un qui voudrait collaborer avec moi et encapsuler le .qtz dans un .saver avec un panel d'options ? En effet, Quartz gère mal la sélection de fichiers sur l'ordinateur, et ce serait bien de pouvoir avoir un diaporama d'images plutôt qu'une image seule. 


     


    2 - Y a t'il quelqu'un qui voudrait se joindre à  nous pour un projet d'application plein écran qui affiche les infos des morceaux écoutés sur iTunes & Spotify. Un mini Front Row quoi. On est 2 pour le moment, mais l'appui connait encore quelques bugs.


    Une page d'aperçu du projet ici: http://bodysoulspirit.weebly.com/fullscreen-music-player.html


     


     


    Voilaaaa,


     


    Si y'a quelque'un c'est cool.


     


    8942804_orig.jpg


Connectez-vous ou Inscrivez-vous pour répondre.