Menu

A

|

A

Surface : Affine2DInertiaProcessor

Pour faire suite à mon dernier billet, je vais maintenant expliquer une autre classe du SDK Microsoft Surface, l’Affine2DInertiaProcessor. Cette classe permet de gérer de l’inertie sur des objets. Comme pour l’Affine2DManipulationProcessor, cette classe s’utilise quasiment pareil.

La principale utilisation de cette classe réside dans l’ajout d’une inertie sur un objet suite à une manipulation (le plus souvent grâce à un Affine2DManipulationProcessor) pour ajouter du réalisme dans son interface NUI (Natural User Interface).

Le code ci-dessous vous montre comment utiliser l’Affine2DInertiaProcessor après une manipulation.

using System;
using Microsoft.Surface.Presentation;
using Microsoft.Surface.Presentation.Controls;
using Microsoft.Surface.Presentation.Manipulations;

namespace MonApplication
{
    public partial class MaSurfaceWindow: SurfaceWindow
    {
        private Affine2DManipulationProcessor traker;
        private Affine2DInertiaProcessor traker;

        public MaSurfaceWindow()
        {
            this.InitializeComponent();

            // On défini ce que la classe doit scruter
            traker = new Affine2DManipulationProcessor(Affine2DManipulations.Scale | Affine2DManipulations.Rotate | Affine2DManipulations.TranslateX | Affine2DManipulations.TranslateY, this);

            // On s'abonne aux handlers pour connaitre l'état des contacts
            // et les gestuelles qui en ressortent
            traker.Affine2DManipulationStarted += new EventHandler<Affine2DOperationStartedEventArgs>(this.traker_Affine2DManipulationStarted);
            traker.Affine2DManipulationDelta += new EventHandler<Affine2DOperationDeltaEventArgs>(this.traker_Affine2DManipulationDelta);
            traker.Affine2DManipulationCompleted += new EventHandler<Affine2DOperationCompletedEventArgs>(this.traker_Affine2DManipulationCompleted);

            // Création de la classe pour la gestion de l'inertie
            inertia = new Affine2DInertiaProcessor();

            // On s'abonne aux handlers pour connaitre l'état de l'inertie
            inertia.Affine2DInertiaCompleted += new EventHandler<Affine2DOperationCompletedEventArgs>(this.Inertia_Affine2DInertiaCompleted);
            inertia.Affine2DInertiaDelta += new System.EventHandler<Affine2DOperationDeltaEventArgs>(this.Inertia_Affine2DInertiaDelta);
        }

        private void Grid_ContactDown(object sender, ContactEventArgs e)
        {
            // On indique a l'Affine2DManipulationProcessor qu'il
            // doit scruter le contact passé en paramètre
            traker.BeginTrack(e.Contact);
        }

        private void traker_Affine2DManipulationStarted(object sender, Affine2DOperationStartedEventArgs e)
        {
            // Ici le code quand la manipulation commence
        }

        private void traker_Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
        {
            // Ici le code a chaque changement d'état d'un contact
        }

        private void traker_Affine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            // Ici le code a la fin de la manipulation

            // On renseigne l'objet d'inertie avec les informations de fin de manipulation
            inertia.InitialAngularVelocity = e.AngularVelocity;
            inertia.InitialExpansionVelocity = e.ExpansionVelocity;
            inertia.InitialOrigin = e.ManipulationOrigin;
            inertia.InitialVelocity = e.Velocity;

            // On démarre l'inertie
            inertia.Begin();
        }

        private void Inertia_Affine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            // Ici le code pour traiter la fin de l'inertie
        }

        private void Inertia_Affine2DInertiaDelta(object sender, Affine2DOperationDeltaEventArgs e)
        {
            // Ici le code a chaque changement d'état de l'objet pendant l'inertie
            // Les informations sont les mêmes que ceux du Delta de la manipulation
        }
    }
}

On remarquera que cette classe fonctionne comme la manipulation, a savoir deux événements pour la fin et la modification de l’inertie. L’événement de démarrage de l’inertie n’existe pas car cela est fait de façon programmatique. De plus, la majorité des informations que demande l’Affine2DInertiaProcessor sont fournis par l’argument de fin de manipulation.

C’est une façon simple de gérer un mouvement d’inertie.

Surface : Affine2DInertiaProcessor

Pour faire suite à mon dernier billet, je vais maintenant expliquer une autre classe du SDK Microsoft Surface, l’Affine2DInertiaProcessor. Cette classe permet de gérer de l’inertie sur des objets. Comme pour l’Affine2DManipulationProcessor, cette classe s’utilise quasiment pareil.

La principale utilisation de cette classe réside dans l’ajout d’une inertie sur un objet suite à une manipulation (le plus souvent grâce à un Affine2DManipulationProcessor) pour ajouter du réalisme dans son interface NUI (Natural User Interface).

Le code ci-dessous vous montre comment utiliser l’Affine2DInertiaProcessor après une manipulation.

using System;
using Microsoft.Surface.Presentation;
using Microsoft.Surface.Presentation.Controls;
using Microsoft.Surface.Presentation.Manipulations;

namespace MonApplication
{
    public partial class MaSurfaceWindow: SurfaceWindow
    {
        private Affine2DManipulationProcessor traker;
        private Affine2DInertiaProcessor traker;

        public MaSurfaceWindow()
        {
            this.InitializeComponent();

            // On défini ce que la classe doit scruter
            traker = new Affine2DManipulationProcessor(Affine2DManipulations.Scale | Affine2DManipulations.Rotate | Affine2DManipulations.TranslateX | Affine2DManipulations.TranslateY, this);

            // On s'abonne aux handlers pour connaitre l'état des contacts
            // et les gestuelles qui en ressortent
            traker.Affine2DManipulationStarted += new EventHandler<Affine2DOperationStartedEventArgs>(this.traker_Affine2DManipulationStarted);
            traker.Affine2DManipulationDelta += new EventHandler<Affine2DOperationDeltaEventArgs>(this.traker_Affine2DManipulationDelta);
            traker.Affine2DManipulationCompleted += new EventHandler<Affine2DOperationCompletedEventArgs>(this.traker_Affine2DManipulationCompleted);

            // Création de la classe pour la gestion de l'inertie
            inertia = new Affine2DInertiaProcessor();

            // On s'abonne aux handlers pour connaitre l'état de l'inertie
            inertia.Affine2DInertiaCompleted += new EventHandler<Affine2DOperationCompletedEventArgs>(this.Inertia_Affine2DInertiaCompleted);
            inertia.Affine2DInertiaDelta += new System.EventHandler<Affine2DOperationDeltaEventArgs>(this.Inertia_Affine2DInertiaDelta);
        }

        private void Grid_ContactDown(object sender, ContactEventArgs e)
        {
            // On indique a l'Affine2DManipulationProcessor qu'il
            // doit scruter le contact passé en paramètre
            traker.BeginTrack(e.Contact);
        }

        private void traker_Affine2DManipulationStarted(object sender, Affine2DOperationStartedEventArgs e)
        {
            // Ici le code quand la manipulation commence
        }

        private void traker_Affine2DManipulationDelta(object sender, Affine2DOperationDeltaEventArgs e)
        {
            // Ici le code a chaque changement d'état d'un contact
        }

        private void traker_Affine2DManipulationCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            // Ici le code a la fin de la manipulation

            // On renseigne l'objet d'inertie avec les informations de fin de manipulation
            inertia.InitialAngularVelocity = e.AngularVelocity;
            inertia.InitialExpansionVelocity = e.ExpansionVelocity;
            inertia.InitialOrigin = e.ManipulationOrigin;
            inertia.InitialVelocity = e.Velocity;

            // On démarre l'inertie
            inertia.Begin();
        }

        private void Inertia_Affine2DInertiaCompleted(object sender, Affine2DOperationCompletedEventArgs e)
        {
            // Ici le code pour traiter la fin de l'inertie
        }

        private void Inertia_Affine2DInertiaDelta(object sender, Affine2DOperationDeltaEventArgs e)
        {
            // Ici le code a chaque changement d'état de l'objet pendant l'inertie
            // Les informations sont les mêmes que ceux du Delta de la manipulation
        }
    }
}

On remarquera que cette classe fonctionne comme la manipulation, a savoir deux événements pour la fin et la modification de l’inertie. L’événement de démarrage de l’inertie n’existe pas car cela est fait de façon programmatique. De plus, la majorité des informations que demande l’Affine2DInertiaProcessor sont fournis par l’argument de fin de manipulation.

C’est une façon simple de gérer un mouvement d’inertie.