Historique des modifications - Message

Message #11486

Sujet: Irrlicht Sur Anndroid - Partie 2 - Multitouch Event


Type Date Auteur Contenu
Dernière modification 07-01-2014 16:49:13 nabouill
[intro]
Suite à la partie1 et à l’intégration des event sur la GUI, nous allons maintenant passer au multitouch.

Effectivement, à la base dans Irrlicht, il nous renvoi si on cliqué sur un bouton avec le clic gauche par exemple. Cependant, nos dernier test nous dit si par exemple nous avons cliqué sur le bouton « quittez » mais si nous restons appuyé sur ce bouton et essayons d’appuyé en même temps sur un autre, cela ne fonctionne pas, il reste bloqué sur l’event précédant temps que celui-ci n’est pas terminée, ce qui va vite nous poser problème.

Imaginons que nous avons un bouton pour avancer et un autre pour reculer, vous poser votre doigt sur « avancer » puis vous le faite glissé sur « reculer ». Et bien, vous n’allez pas reculer mais continuer d’avancé tant que votre doigt touchera l’écran.

Nous allons donc pour remédier à ce problème utilisé les event multitouch.[/intro]


Pour cela nous allons récupérer la position de chaque touche renvoyé par :
event.MultiTouchInput.X;
event.MultiTouchInput.Y;

Soit par exemple une function MyEventReciver:

Code c++ :


class MyEventReceiver : public IEventReceiver
{

    public:
    MyEventReceiver(SAppContext & context) : Context(context) { }
    int posX[2];
    int posY[2];

    virtual bool OnEvent(const SEvent& event)
    {
        if(event.EventType == EET_MULTI_TOUCH_EVENT)
        {

            for( int i = 0; i < 2; i++)
            {

                if(event.MultiTouchInput.Touched[i])
                {
                    posX[i] = event.MultiTouchInput.X[i];
                    posY[i]= event.MultiTouchInput.Y[i];
                    __android_log_print(ANDROID_LOG_ERROR, "*******MOUSE***** ", "X = %i, Y = %i,\
", posX[i], posY[i]);

                }
                else
                {
                    posX[i] = -1; // on reset la position si on n’y touche plus
                    posY[i] = -1; // on reset la position si on n’y touche plus
                }

            }
        }

        return false;
    }

    private:
    SAppContext & Context;
}; 


Puis dans notre code, on n’a plus qu’à vérifier les positions touchées pour en faire ce qu’on veut, imaginons un bouton en position rect<s32>(10,10,50,50) :

Code c++ :


MyEventReceiver receiver(context);
device->setEventReceiver(&receiver);
env->addButton(rect<s32>(10,10,50,50),0) ;

/*
…
*/

// on parcourt les positions que l’on touche
for(int i = 0; i < 2; i++)
{
	If(receiver.posX[i] > 10 && receiver.posX[i] < 50
	&& receiver.posY[i] > 10 && receiver.posY[i] < 50)
	{
                     //on touche à notre bouton
              }
}


Dans cette exemple on se limite à récupère la position de 2 touches simultané, cependant vous avez la possibilité d’en récupérer jusqu’à 10 dans l’état actuel d’Irrlicht (même plus si vous modifiez la valeur de NUMBER_OF_MULTI_TOUCHES dans IEventReceiver.h)
Création du message 07-01-2014 16:42:53 nabouill
[intro]
Suite à la partie1 et à l’intégration des event sur la GUI, nous allons maintenant passer au multitouch.

Effectivement, à la base dans Irrlicht, il nous renvoi si on cliqué sur un bouton avec le clic gauche par exemple. Cependant, nos dernier test nous dit si par exemple nous avons cliqué sur le bouton « quittez » mais si nous restons appuyé sur ce bouton et essayons d’appuyé en même temps sur un autre, cela ne fonctionne pas, il reste bloqué sur l’event précédant temps que celui-ci n’est pas terminée, ce qui va vite nous poser problème.

Imaginons que nous avons un bouton pour avancer et un autre pour reculer, vous poser votre doigt sur « avancer » puis vous le faite glissé sur « reculer ». Et bien, vous n’allez pas reculer mais continuer d’avancé tant que votre doigt touchera l’écran.

Nous allons donc pour remédier à ce problème utilisé les event multitouch.[/intro]


Pour cela nous allons récupérer la position de chaque touche renvoyé par :
event.MultiTouchInput.X;
event.MultiTouchInput.Y;

Soit par exemple une function MyEventReciver:

Code c++ :


class MyEventReceiver : public IEventReceiver
{

    public:
    MyEventReceiver(SAppContext & context) : Context(context) { }
    int posX[2];
    int posY[2];

    virtual bool OnEvent(const SEvent& event)
    {
        if(event.EventType == EET_MULTI_TOUCH_EVENT)
        {

            for( int i = 0; i < 2; i++)
            {

                if(event.MultiTouchInput.Touched[i])
                {
                    posX[i] = event.MultiTouchInput.X[i];
                    posY[i]= event.MultiTouchInput.Y[i];
                    __android_log_print(ANDROID_LOG_ERROR, "*******MOUSE***** ", "X = %i, Y = %i,\
", posX[i], posY[i]);

                }
                else
                {
                    posX[i] = -1; // on reset la position si on n’y touche plus
                    posY[i] = -1; // on reset la position si on n’y touche plus
                }

            }
        }

        return false;
    }

    private:
    SAppContext & Context;
}; 


Puis dans notre code, on n’a plus qu’à vérifier les positions touchées pour en faire ce qu’on veut, imaginons un bouton en position rect<s32>(10,10,50,50) :

Code c++ :


MyEventReceiver receiver(context);
device->setEventReceiver(&receiver);
env->addButton(rect<s32>(10,10,50,50),0) ;

/*
…
*/

// on parcourt les positions que l’on touche
for(int i = 0; i < 2; i++)
{
	If(receiver.posX[i] > 10 && receiver.posX[i] < 50
	&& receiver.posY[i] > 10 && receiver.posY[i] < 50)
	{
                     //on touche à notre bouton
              }
}


Dans cette exemple on se limite à récupère la position de 2 touches simultané, cependant vous avez la possibilité d’en récupérer jusqu’à 10 dans l’état actuel d’Irrlicht (même plus si vous modifiez la valeur de NUMBER_OF_MULTI_TOUCHES dans IEventReceiver.h)

Retour

Options Liens officiels Caractéristiques Statistiques Communauté
Préférences cookies
Corrections
irrlicht
irrklang
irredit
irrxml
Propulsé par Django
xhtml 1.0
css 2.1
884 membres
1440 sujets
11337 messages
Dernier membre inscrit: Saidov17
166 invités en ligne
membre en ligne: -
RSS Feed