Associer un son à un bouton

HommeCocoa

Membre actif
3 Janvier 2003
173
0
Vevey - Suisse
Bonsoir,

Je viens de m'apercevoir que l'on pouvait associer un son à un bouton en glissant un des sons se trouvant dans la palette d'instance de Interface builder sous l'onglet "Sounds". Sans une seule ligne de code, le son choisi est joué à chaque pression du bouton. C'est assez interessant, mais quelqu'un sait si l'on peut faire la même chose mais au passage de la souris sur le bouton et non pas au "mouseUp" ? :sleep:

Bonne soirée Cocoa,
David
 
Oui c'est possible (bien qu'assez insupportable, à mon avis).
Tu dois ajouter un "Tracking Rectangle" sur ton bouton et faire retentir le son lorsque la bonne méthode du délegué est appelée.

C'est pas une réponse très complète, mais j'ai pas le temps de chercher davantage.
 
Oui c'est vrai que dans la plus part des cas, c'est asser insuportable, seulement dans ce cas, c'est pas un "gadget" mais c'est une application destiné au enfant ne sachant pas lire, du coup, il doivent trouver les sons représenté par des boutons non pas en lisant mais en écoutant :)

Le "Tracking rectangle" c'est un objet que l'on peut trouver dans Interface Builder?

Merci,
David
 
HommeCocoa a dit:
Oui c'est vrai que dans la plus part des cas, c'est asser insuportable, seulement dans ce cas, c'est pas un "gadget" mais c'est une application destiné au enfant ne sachant pas lire, du coup, il doivent trouver les sons représenté par des boutons non pas en lisant mais en écoutant :)

Le "Tracking rectangle" c'est un objet que l'on peut trouver dans Interface Builder?

Merci,
David

il faut que tu implementes ta class nsbutton avec un nsevent
Tracking rectangle n'est que la zone du button

il faut que tu catch l'event mouseUP et là tu appels ton son
 
J'ai essayé de faire ce que je te disais de faire.
Le principe:
On sous-classe NSButton (ici la classe CeSurvolButton), et dans la méthode -awakeFromNib, on ajoute un "tracking rectangle", un rectangle qui sert à suivre le mouvement de la souris. On le positionne pour qu'il soit superposé au bouton. On charge également le son à ce moment là (pour ne pas le faire de façon répétitive).

La méthode -mouseEntered: est ensuite dérivée pour jouer le son lorsque le pointeur entre dans le tracking rectangle.

Bloc de code:
#import <Cocoa/Cocoa.h>


@interface CeSurvolButton : NSButton
{
	NSSound	*_sound;
}

- (void)awakeFromNib;
- (void)mouseEntered:(NSEvent *)theEvent;

@end


Bloc de code:
#import "CeSurvolButton.h"


@implementation CeSurvolButton

- (void)awakeFromNib
{
		_sound = [NSSound soundNamed:@"Glass"];
		[self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:YES];
}

- (void)mouseEntered:(NSEvent *)theEvent
{
	NSLog(@"Entre");
	[_sound play];
}

@end

Et voilà.

Je pensais qu'on pouvait le faire avec un délégué (ça me semblait plus propre), mais cette méthode est relativement directe.
 
Merci bien pour l'explication,

J'ai juste un petit problème, je sais comment créer une sous-classe d'un NSView avec la commande "New File" mais je n'ai aucune idée comment créer un sous-classe de NSButton.

Héé oui je suis un sacré débutant :)

Merci encore
David
 
Dans la fen&#234;tre principale de IB, tu affiche le panel 'Classes' , tu clics sur la classe NSButton et tu presses sur <return>. Apr&#232;s, clic-droite sur ta classe fra&#238;chement cr&#233;&#233;e et 'Create files for <ta classe>'.

A+
 
Bonjour tout le monde, voila, jsuis tout nouveau en Interface Builder ainsi que sur le forum et du coup, je galere.
Mon probleme parait idiot mais... je ne trouve aucun onglet "Sounds" ni de palette d'instance dans mon IB et du coup je n'arrive pas a associer un son a un bouton.
Il est possible que cela vienne de ma version (Xcode 3.x et IB 3.x too) mais a ce moment la, quelqu'un pourrait-il me dire comment je doit m'y prendre ? (meme si je sais bien que je deterre un post qui a 4ans, je garde espoir ^^)
 
Mon probleme parait idiot mais... je ne trouve aucun onglet "Sounds" ni de palette d'instance dans mon IB et du coup je n'arrive pas a associer un son a un bouton.
Il est possible que cela vienne de ma version (Xcode 3.x et IB 3.x too)

Effectivement, Interface Builder a beaucoup évolué depuis.
Les sons se trouvent maintenant dans la palette Library > Media. Tu peux en glisser un sur un bouton.

- System Media contient les sons intégrés à Mac OS.
- User Media, ceux mis dans les Resources de ton appli.


(Tatouille, ton filtre marche trop bien: nous allons finir par nous trouver très seuls, entre connaisseurs).
 
:D:p moi j'ai toujours espoir de voir demarrer un truc comme NSCoder Night ou CocoaHeads en France, et inviter les entreprises avec des talks, c'est comme ca que tu dynamises le marché et aide les independants a se regrouper et a trouver des projets et des clients

pour l'instant j'ai pas fini de migrer mais cocoa/touch represente 50% de mon travail, j'aimerai passer a 95% :)

Bloc de code:
- (id)initWithCoder:(NSCoder *)coder
{
        if ((self = [super initWithCoder:coder])) {
                [self setSound:[NSSound soundNamed:@"toto"]];
                [self addTrackingRect:[self bounds] owner:self userData:nil assumeInside:YES];
        }
        
        return self;
}

- (void)mouseEntered:(NSEvent *)theEvent
{
        if (![[self sound] isPlaying]) {
                [[self sound] play];
        }
}

- (void)mouseUp:(NSEvent *)theEvent
{
    // overwrite default don't work
}
la solution serait, (snip), conclusion: ce qui prouve qu'il est plus efficient et facile de travailler a partir d'un NSControl si tu veux faire un nouveau button
Bloc de code:
- (void)mouseEntered:(NSEvent *)theEvent
{
        if (![[self sound] isPlaying]) {
                [[self sound] play];
        }
}

- (void)mouseUp:(NSEvent *)theEvent
{
    // overwrite default
    [self highlight:NO];
}

- (void)mouseDown:(NSEvent *)theEvent
{
    // overwrite default
    [self highlight:YES];
}

@end