Comment effacer un dessin ?
macvelotte
Membre
Salut les champions ...
J'ai "dessiné" sur un fond d'image ; je voudrais remplacer ce dessin (commande par NSTimer ...) pour obsrver son évolution au cours du temps : est-il possible de l'effacer sans modifier l'image de fond ?
J'ai "dessiné" sur un fond d'image ; je voudrais remplacer ce dessin (commande par NSTimer ...) pour obsrver son évolution au cours du temps : est-il possible de l'effacer sans modifier l'image de fond ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Donne plus de précisions sur ce que tu veux faire, c'est une animation en faites ? Quelles sont les techniques de dessin que tu emploies (drawRect: ?), comment est ton fond (image, ou bien fond uni) ?
Le dessin : dans un rectangle (NSRect) des courbes (NSBezierPath)
Oui, c'est en somme une animation (qui évolue sur 24 heures ...)
Le fond de la fenetre est une NSImageWiew (le planisphere)
Par dessus, une CustomView (StretchView) avec un rectangle aux dimensions de la fenêtre, clearColor (transparence pour le planisphere) et les courbes de Bezier remplis de nooir avec différentes transparences pour indiquerr successivement crépuscules civil, nautique, astronomique puis nuit (pas complètement noire ...)
Le disque jaune représente le soleil au dessus du point de la terre où il est au zénit.
J'aimerais donc retracer les crépuscules ; ceux-ci avancnt de droite à gauche à raison d'un pixel toutes les 2 minutes.
Qulle est l'icone "options" ?
Dessous ton message, il y un lien "options supplémentaires".
Les écrans sont toujours trop petits !
[Fichier joint supprimé par l'administrateur]
-(void) methodeTimer:(NSTimer*) timer
{
 [stretchView setNeedsDisplay:YES];
}
http://www.objective-cocoa.org/forum/index.php?topic=387.0
Mais je n'arrive pas à y mettre mon planisphere ..
et je suis un clampin : quid du code correct pour NSEraseRect ???
As tu regardé le lien que je t'indique ?
En gros: fais-tu un removeAllPoints sur ton bezierpath avant de faire un nouveau tracé ?
dans le style [macourbe removeAllPoints] ???
J'essaye
Il me semble que Cocoa ne possède pas de méthode pour plaquer une bitmap directement, il faut donc faire appel aux fonctions Quartz (bref, se taper la doc). C'est long. J'aurais fais comme toi MacVelotte.
Par contre, je ne comprends pas pourquoi faire un setNeedsDisplay: ne marche pas.
Bon, je n'ai pas encore de solution ; il faut donc conculter les documents ...à’
J'ai utilisé une vue séparée pour le soleil et pour l'ombre.
Cela permet de montrer deux techniques différentes:
- déplacement de l'origine de la vue pour le soleil
- translation d'un bezier Path pour l'ombre
Je ne fait aucun test de dépassement des vues, et j'entrevois un petit problème à ce niveau: pour l'ombre si le bord de la planisphere est atteint, il faut dessiner la partie qui dépasse de l'autre coté de la planisphère ! Une solution simple serait de dessiner deux fois la partie dans l'ombre : NJN (nuit-jour-nuit) ainsi une simple translation permet de positionner correctement l'ombre dans la planisphère.
[Fichier joint supprimé par l'administrateur]
Ha bon ? ???
Il s'agit ici, dans la méthode drawrect de ta view, d'afficher ton image en début de tracé, ensuite tu traces tes NSBezierPaths à la suite....pas besoin d'aller chercher dans les APIs Quartz pour faire ça...:)
N.B. : le soleil se déplace dans l'autre sens ... ce qui ne change rien au problème !
[Fichier joint supprimé par l'administrateur]
Comment fais-tu pour "afficher l'image en début de tracé" sans les API Quartz ? C'est ce que j'appelle plaquer la bitmap.
La solution de MacVelotte est d'utiliser une NSImageView en fond et de dessiner les courbes de Bézier dans la drawRect: d'un custom view non-opaque.
Tu as toutes les méthodes nécessaires dans NSImage.
[Fichier joint supprimé par l'administrateur]
Donc, plutot qu'effacer une NSBezierPath, on met pardessus l'image de fond, et on recommence !
cette "simple animation" est un trésor !
ça marche, mais j'obtiens à l'éxecution le messaage suivant :
2005-03-21 10:32:00.906 planisphere[4734] *** NSTimer discarding exception 'NSInternalInconsistencyException' (reason 'lockFocus sent to a view whose window is deferred and does not yet have a corresponding platform window') that raised during firing of timer with target 337980 and selector 'retracer:'
et je n'en comprends pas le sens ???
http://www.objective-cocoa.org/forum/index.php?topic=751.msg8641#msg8641