Cocos2d-x 3.x apprentissage de base: contrôle des boutons CCControlButton

La classe de bouton CCControlButton hérite de la classe de contrôle CCControl La classe de contrôle CCControl fournit principalement une série d'événements de déclenchement de contrôle à la sous-classe. Lorsque le contrôle enfant déclenche un événement associé, la fonction de rappel d'événement de contrôle associé est exécutée. Ceci est similaire au rappel du bouton de menu dans CCMenu mentionné précédemment.

La classe de contrôle CCControl comprend trois sous-classes principales:

(1) Commande de l'interrupteur CCControlSwitch

(2) Commande par curseur CCControlSlider

(3) Bouton de contrôle CCControlButton

Cette section parle de l'une de ses sous-classes: la classe de bouton CCControlButton.

Changements dans Cocos2d-x 3.x

(1) Supprimer "CC"

(2) La classe d'objet CCObject a été modifiée en Ref

(3) Le rappel d'événement de bouton est toujours cccontrol_selector, et CC_CALLBACK_2 n'est pas utilisé

(4) L'état du bouton CCControlState est changé en une énumération forte Control :: State

//

NORMAL // normal

HIGH_LIGHTED // Surlignage (c'est-à-dire à l'état tactile interne)

DISABLED // désactiver

SELECTED // sélectionné

//

(5) L'événement de bouton CCControlEvent est changé en une énumération forte Control :: EventType

//

TOUCH_DOWN // Lorsque vous venez de commencer à toucher le bouton

DRAG_INSIDE // Lors du glissement interne (tout en gardant le contact)

DRAG_OUTSIDE // Lors d'un glissement externe (tout en conservant l'état tactile)

DRAG_ENTER // Lorsque le glissement entre juste à l'intérieur (tout en gardant l'état tactile)

DRAG_EXIT // Lorsque le glissement quitte juste l'intérieur (tout en gardant l'état tactile)

TOUCH_UP_INSIDE // Soulevez votre doigt en interne (tout en continuant à le toucher)

TOUCH_UP_OUTSIDE // Soulevez votre doigt de l'extérieur (tout en le touchant)

TOUCH_CANCEL // Annuler le contact

//

(6) Les autres changements ne sont pas significatifs.

CCControlButton

Bouton de contrôle CCControlButton, je dois être familier avec cela, non? Chaque jeu utilise essentiellement des boutons.

 

 

Un bouton a non seulement plusieurs états de bouton différents, mais également certains événements de bouton. En outre, l'image d'arrière-plan utilisée par le contrôle de bouton CCControlButton est CCScale9Sprite, qui peut rendre le bouton aussi grand que possible pour conserver les bords et les coins sans distorsion.

1. État du bouton CCControlState

//

CCControlStateNormal // Normal

CCControlStateHighlighted // Highlight (c'est-à-dire dans l'état tactile interne)

CCControlStateDisabled // Désactiver

CCControlStateSelected // sélectionné

//

2. Bouton événement CCControlEvent

//

CCControlEventTouchDown // Lorsque vous venez de commencer à toucher le bouton

CCControlEventTouchDragInside // Lors d'un glissement interne (à l'état tactile)

CCControlEventTouchDragOutside // Lors d'un glissement externe (tout en conservant l'état tactile)

CCControlEventTouchDragEnter // Lorsque le glissement entre juste à l'intérieur (tout en conservant l'état tactile)

CCControlEventTouchDragExit // Lorsque le glissement quitte juste l'intérieur (tout en conservant l'état tactile)

CCControlEventTouchUpInside // Soulevez votre doigt en interne (maintenez l'état tactile)

CCControlEventTouchUpOutside // Soulevez votre doigt de l'extérieur (maintenez l'état tactile)

CCControlEventTouchCancel // Annuler le contact

//

3. Méthodes de liaison des événements de bouton

//

// Evénements de contrôle de liaison

addTargetWithActionForControlEvents (ceci, cccontrol_selector (HelloWorld :: touchDownAction), CCControlEventTouchDown);

void addTargetWithActionForControlEvents (CCObject * target, action SEL_CCControlHandler, CCControlEvent controlEvents);

// Supprimer l'événement de contrôle

// removeTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDownAction), CCControlEventTouchDown);

void removeTargetWithActionForControlEvents (CCObject * target, action SEL_CCControlHandler, CCControlEvent controlEvents);

//

4. Fichiers d'en-tête et espaces de noms devant être cités

//

#include "cocos-ext.h" // Inclut le fichier d'en-tête cocos-ext.h

utilisation de l'espace de noms cocos2d :: extension; // référence espace de noms cocos2d :: extension

//

5. Les opérations courantes sont les suivantes:

//

classe CCControlButton: public CCControl

{

/ **

* Trois façons de créer CCControlButton

* /

// Utilisez l'image point neuf CCScale9Sprite, le bouton n'a pas le libellé CCLabel

statique CCControlButton * create (CCScale9Sprite * sprite);

// Utiliser l'étiquette d'étiquette, peut être CCLabelTTF, CCLabelBMFont

statique CCControlButton * create (étiquette CCNode *, CCScale9Sprite * backgroundSprite);

// titre: contenu de l'étiquette

// fontName: ressource de police, telle que "Arial"

// fontSize: taille de la police, par défaut 12

// L'étiquette créée en interne est CCLabelTTF

statique CCControlButton * create (std :: string title, const char * fontName, float fontSize);

/ **

* Paramètre de propriété 1 (sous le CCControlState actuel)

* getCurrentTitle, getCurrentTitleColor,

* TitleLabel, BackgroundSprite, PreferredSize

* /

// Contenu de l'étiquette actuellement affiché, lecture seule getCurrentTitle

CC_SYNTHESIZE_READONLY (CCString *, m_currentTitle, CurrentTitle);

// La couleur du contenu de l'étiquette actuellement affichée, en lecture seule getCurrentTitleColor

CC_SYNTHESIZE_READONLY_PASS_BY_REF (ccColor3B, m_currentTitleColor, CurrentTitleColor);

// Définit le libellé sous le CCControlState actuel, set / get

CC_SYNTHESIZE_RETAIN (CCNode *, m_titleLabel, TitleLabel);

// Définit le sprite d'arrière-plan sous le CCControlState actuel, set / get

CC_SYNTHESIZE_RETAIN (CCScale9Sprite *, m_backgroundSprite, BackgroundSprite);

// Définit la taille du bouton. Si la taille de l'étiquette est plus grande que le bouton, elle sera automatiquement développée, set / get.

// Mais après mon test: il est défini, mais la taille du bouton est fixe. Il n'est pas automatiquement étiré en fonction de la taille de l'étiquette.

CC_PROPERTY (CCSize, m_preferredSize, PreferredSize);

/ **

* Paramètre de propriété 2 (sous CCControlState spécifié)

* setTitleLabelForState, setTitleForState, setTitleColorForState,

* setTitleTTFForState, setTitleTTFSizeForState,

* setTitleBMFontForState,

* setBackgroundSpriteForState, setBackgroundSpriteFrameForState, getBackgroundSpriteForState

* /

// Définit l'étiquette de police sous le CCControlState spécifié

// Si l'étiquette n'est pas définie, la valeur par défaut est l'étiquette de police de l'état CCButtonStateNormal

// L'étiquette de police peut être CCLabelTTF, CCLabelBMFont

virtual void setTitleLabelForState (étiquette CCNode *, état CCControlState);

CCNode virtuel * getTitleLabelForState (état CCControlState);

// Définit le contenu de l'étiquette sous le CCControlState spécifié

// Si le libellé n'est pas défini, le contenu du libellé dans l'état CCButtonStateNormal est renvoyé par défaut

virtual void setTitleForState (titre CCString *, état CCControlState);

CCString virtuel * getTitleForState (état CCControlState);

// Définit la couleur de l'étiquette sous le CCControlState spécifié

virtual void setTitleColorForState (couleur ccColor3B, état CCControlState);

virtual const ccColor3B getTitleColorForState (état CCControlState);

// ############################################# ##############################

// Définit le libellé sous le CCControlState spécifié comme CCLabelTTF

// fntFile est le nom de la ressource de police, par exemple "Arial"

virtual void setTitleTTFForState (const char * fntFile, état CCControlState);

virtual const char * getTitleTTFForState (état CCControlState);

// Définit la taille de la police de l'étiquette CCLabelTTF sous le CCControlState spécifié

virtual void setTitleTTFSizeForState (taille flottante, état CCControlState);

float virtuel getTitleTTFSizeForState (état CCControlState);

// ############################################# ##############################

// Définit le libellé sous le CCControlState spécifié comme CCLabelBMFont

// fntFile est le nom de la ressource de police, tel que * .fnt

virtual void setTitleBMFontForState (const char * fntFile, état CCControlState);

virtual const char * getTitleBMFontForState (état CCControlState);

// ############################################# ##############################

// Utilisez l'image point neuf CCScale9Sprite pour définir le sprite d'arrière-plan sous le CCControlState spécifié

virtual void setBackgroundSpriteForState (sprite CCScale9Sprite *, état CCControlState);

// Utilisez le cadre de sprite CCSpriteFrame pour définir le sprite d'arrière-plan sous le CCControlState spécifié

// En fait, le code implémenté en interne utilise en fait le sprite frame spriteFrame pour créer l'image point neuf CCScale9Sprite comme sprite d'arrière-plan

virtual void setBackgroundSpriteFrameForState (CCSpriteFrame * spriteFrame, état CCControlState);

// Récupère l'image d'arrière-plan sous le CCControlState spécifié

CCScale9Sprite virtuel * getBackgroundSpriteForState (état CCControlState);

/ **

* Hérité de la classe parent

* /

virtual void setEnabled (bool enabled); // s'il est activé

virtual void setSelected (bool enabled); // si sélectionné

virtual void setHighlighted (bool enabled); // s'il faut mettre en évidence

};

//

Combat de code

Le code provient du projet officiel TestCpp de Cocos2d-x.

1. Arrière-plan du bouton (normal, surligné)

 

 

 

 

2. Introduisez les fichiers d'en-tête et les espaces de noms

//

#include "cocos-ext.h"

en utilisant l'espace de noms cocos2d :: extension;

//

3. Déclarez la fonction de rappel de l'événement de bouton dans HelloWorld.h et l'étiquette qui affiche l'état du bouton

//

CCLabelTTF * displayLabel; // étiquette pour afficher l'état du bouton

void touchDownAction (CCObject * sender, CCControlEvent controlEvent); // Lorsque vous commencez simplement à toucher le bouton

void touchDragInsideAction (CCObject * sender, CCControlEvent controlEvent); // Lors du glissement interne (tout en conservant l'état tactile)

void touchDragOutsideAction (CCObject * sender, CCControlEvent controlEvent); // Lors d'un glissement externe (tout en conservant l'état tactile)

void touchDragEnterAction (CCObject * sender, CCControlEvent controlEvent); // Lorsque le glissement entre juste à l'intérieur (tout en conservant l'état tactile)

void touchDragExitAction (CCObject * sender, CCControlEvent controlEvent); // Lorsque le glissement quitte juste l'intérieur (tout en conservant l'état tactile)

void touchUpInsideAction (CCObject * sender, CCControlEvent controlEvent); // Soulevez votre doigt en interne (maintenez l'état tactile)

void touchUpOutsideAction (CCObject * sender, CCControlEvent controlEvent); // Soulevez votre doigt à l'extérieur (continuez à toucher)

void touchCancelAction (CCObject * sender, CCControlEvent controlEvent); // Annuler le contact

//

4. Créez un bouton dans l'init de HelloWorld.cpp et liez l'événement de bouton

//

booléen HelloWorld :: init ()

{

si (! CCLayer :: init ())

{

retourner faux;

}

// Récupère la taille de la zone visible

CCSize mysize = CCDirector :: sharedDirector () -> getVisibleSize ();

// Récupère la position d'origine de la zone visible

CCPoint origin = CCDirector :: sharedDirector () -> getVisibleOrigin ();

// Le centre de l'écran

CCPoint midPos = ccp (mysize.width / 2, mysize.height / 2);

// Afficher le libellé de l'affichage de l'état du bouton

displayLabel = CCLabelTTF :: create ("No Event", "Marker Felt", 32);

displayLabel-> setPosition (midPos + ccp (0, 100));

this-> addChild (displayLabel);

// Le sprite d'arrière-plan dans le bouton CCScale9Sprite

CCScale9Sprite * bgNormal = CCScale9Sprite :: create ("btnNormal.png"); // Arrière-plan normal

CCScale9Sprite * bgHighlighted = CCScale9Sprite :: create ("btnHighlighted.png"); // Surligner l'arrière-plan

// L'étiquette dans le bouton CCLabelTTF

CCLabelTTF * titleNormal = CCLabelTTF :: create ("Le bouton est normal!", "Feutre du marqueur", 30);

CCLabelTTF * titleHighlighted = CCLabelTTF :: create ("Le bouton est surligné!", "Marqueur senti", 30);

// Créer le bouton CCControlButton

CCControlButton * btn = CCControlButton :: create (titleNormal, bgNormal);

btn-> setPosition (midPos);

this-> addChild (btn);

// Définit l'état lorsque le bouton est mis en surbrillance

btn-> setTitleLabelForState (titleHighlighted, CCControlStateHighlighted); // Mettre en évidence le libellé

btn-> setTitleColorForState (ccRED, CCControlStateHighlighted); // 红色

btn-> setBackgroundSpriteForState (bgHighlighted, CCControlStateHighlighted); // Mettre en évidence l'arrière-plan

// J'ai écrit cette phrase, mais la taille a été fixée. Il n'est pas automatiquement étiré en fonction de la taille de l'étiquette

// btn-> setPreferredSize (CCSizeMake (120,40));

// Evénement de liaison, utilisé pour afficher l'état du bouton

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDownAction), CCControlEventTouchDown); // Lorsque le bouton est juste commencé à être touché

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDragInsideAction), CCControlEventTouchDragInside); // Lors d'un glissement interne (tout en conservant l'état tactile)

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDragOutsideAction), CCControlEventTouchDragOutside); // Lors d'un glissement externe (tout en conservant l'état tactile)

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDragEnterAction), CCControlEventTouchDragEnter); // Lorsque le glissement entre juste à l'intérieur (maintenez l'état tactile)

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchDragExitAction), CCControlEventTouchDragExit); // Lorsque le glissement quitte juste l'intérieur (tout en gardant l'état tactile)

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchUpInsideAction), CCControlEventTouchUpInside); // Soulevez votre doigt à l'intérieur (continuez à toucher)

btn-> addTargetWithActionForControlEvents (this, cccontrol_selector (HelloWorld :: touchUpOutsideAction), CCControlEventTouchUpOutside); // Soulevez votre doigt à l'extérieur (continuez à toucher)

btn-> addTargetWithActionForControlEvents (ceci, cccontrol_selector (HelloWorld :: touchCancelAction), CCControlEventTouchCancel); // 取消 触点

retourne vrai;

}

//

5. Implémentez la fonction de rappel de l'événement bouton

//

// Lorsque vous venez de commencer à toucher le bouton

void HelloWorld :: touchDownAction (CCObject * senderz, CCControlEvent controlEvent)

{

displayLabel-> setString ("Touch Down");

}

// En faisant glisser en interne (tout en gardant le toucher)

void HelloWorld :: touchDragInsideAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Glisser à l'intérieur");

}

// Lors du glissement externe (tout en continuant à toucher)

void HelloWorld :: touchDragOutsideAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Glisser à l'extérieur");

}

// Lorsque le glissement entre juste à l'intérieur (tout en gardant l'état tactile)

void HelloWorld :: touchDragEnterAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Glisser Entrée");

}

// Lorsque le glissement quitte juste l'intérieur (tout en gardant l'état tactile)

void HelloWorld :: touchDragExitAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Glisser Quitter");

}

// Soulevez votre doigt à l'intérieur (tout en continuant à toucher)

void HelloWorld :: touchUpInsideAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Retouche à l'intérieur.");

}

// Soulevez votre doigt à l'extérieur (tout en continuant à toucher)

void HelloWorld :: touchUpOutsideAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Retouche à l'extérieur.");

}

// Annule toutes les touches

void HelloWorld :: touchCancelAction (expéditeur CCObject *, CCControlEvent controlEvent)

{

displayLabel-> setString ("Touch Cancel");

}

//

6. Résultats des opérations

 

 

7. Analyse et résumé

(1) À l'origine une petite image de bouton, quelle est sa taille i_f15.gif? C'est parce que lorsque la taille de l'étiquette CCLabelTTF est plus grande que la taille du bouton, le bouton s'étire automatiquement.

(2) Lorsque je définis clairement l'état en surbrillance, l'étiquette est titleHighlighted et le contenu de l'étiquette doit afficher "Button is Highlighted!". Pourquoi est-il toujours "Button is Normal"? I_f06.gif. . . Eh bien, je ne connais pas cette question. Cependant, la couleur de la police et le sprite d'arrière-plan du bouton sont effectivement modifiés.

(3) Comme pour l'événement bouton:

1

2CCControlEventTouchDragEnter // Lorsque le glissement entre juste à l'intérieur (tout en conservant l'état tactile)

CCControlEventTouchDragExit // Lorsque le glissement quitte juste l'intérieur (tout en conservant l'état tactile)

       Je ne sais pas si vous l'avez observé? Parce que l'effet n'est visible que lorsque vous entrez ou quittez le bouton, il devient DragInside ou DragOutside avec une secousse de la main.

Je suppose que tu aimes

Origine blog.csdn.net/qq_21743659/article/details/108616151
conseillé
Classement