Libérer le curseur avec une camera FPS
Proposé par diOxy

le 01 March 2007 à 15h 21mn 33s

3073 visualisations



Salut !

J'ai vu la question dans la section Aide Irrlicht C++ alors je me suis dit qu'il y avais ptetre un petit tutorial a faire, donc je livre ici la méthode que j'emploi.

Attention, il y a sans doutes d'autre façon de faire, simplement c'est celle que j'utilise.

Dans la classe principale, je déclare...

Code:

    class MainClass
    {
        static bool BasculerEvenementsCamera = false;
        etc...

Il est aussi possible de se servir d'une énumération des évènements, mais là je fais simple.

Je me sert de MPos qui est une Position2D. Et le déclare de la façon suivante hors de la boucle.

Code:

Position2D MPos = new Position2D(0,0);

J'ai l'habitude de toujours initialiser, même quand ce n'est pas nécessaire.

Dans votre code de gestion des évènements, mettez simplement BasculerEvenementsCamera a true. Par exemple, comme ceci :

Code:

    case KeyCode.Tab:
        BasculerEvenementsCamera = true;
        return true;

Puis, dans la boucle while, placez ce code.
Attention ! Le curseur n'apparaît que lorsque vous déplacez la souris.

Code:

if (BasculerEvenementsCamera)
{
    BasculerEvenementsCamera = false;
    if (smgr.ActiveCamera.InputReceiverEnabled)
    {
        smgr.ActiveCamera.InputReceiverEnabled = false;
        device.CursorControl.Visible = true;
        MPos = device.CursorControl.Position;
    } 
    else
    {
        device.CursorControl.Position = MPos;
        smgr.ActiveCamera.InputReceiverEnabled = true;
        device.CursorControl.Visible = false;
    }
}

Voici une Modification du HelloWorld que zitzu a porté sous IrrlichtNETCP

Code:

using IrrlichtNETCP;

namespace Tutorial01
{
    class Tutorial01
    {
        static bool BasculerEvenementsCamera = false;
        static bool Quitter = false;
        static void Main(string[] args)
        {
            IrrlichtDevice device = new IrrlichtDevice(  DriverType.OpenGL, new dimension2d(800, 600), 32, false, true, true, true);
            device.WindowCaption = "Hello World! - Irrlicht Engine Demo";
            device.FileSystem.WorkingDirectory = "c:/irrlicht/media";  // Adaptez a votre configuration !!!
            VideoDriver driver = device.VideoDriver;
            SceneManager smgr = device.SceneManager;
            device.OnEvent += new OnEventDelegate(device_OnEvent);
            GUIEnvironment guienv = device.GUIEnvironment;
            
            guienv.AddStaticText
                ( "Appuyez sur la touche TAB pour liberer/capturer le curseur", 
                    new rect( new Position2D(10, 10), 
                    new dimension2d(220, 18)),
                    true, false, guienv.RootElement, -1, false
                );
                
            AnimatedMesh mesh = smgr.GetMesh("sydney.md2");
            AnimatedMeshSceneNode node = smgr.AddAnimatedMeshSceneNode(mesh);
            if (node != null)
            {
                node.Scale = new vector3d(0.1f, 0.1f, 0.1f);
                node.SetMaterialFlag(MaterialFlag.Lighting, false);
                node.SetMaterialTexture(0, driver.GetTexture("sydney.bmp"));
            }
            CameraSceneNode cam = smgr.AddCameraSceneNodeFPS(smgr.RootSceneNode, 100f, 100f, false);
            cam.Position=new vector3d(0, 0, -5);
            cam.Target=new vector3d(0, 0, 0);
            
            device.CursorControl.Visible = false;
            Position2D MPos = new Position2D(0,0);
            
            while (device.Run())
            {
                if (BasculerEvenementsCamera)
                {
                    BasculerEvenementsCamera = false;
                    if (smgr.ActiveCamera.InputReceiverEnabled)
                    {
                        smgr.ActiveCamera.InputReceiverEnabled = false;
                        device.CursorControl.Visible = true;
                        MPos = device.CursorControl.Position;
                    }
                    else
                    {
                        device.CursorControl.Position = MPos;
                        smgr.ActiveCamera.InputReceiverEnabled = true;
                        device.CursorControl.Visible = false;
                    }
                }
                
                driver.BeginScene(true, true, new Color(255, 100, 101, 140));
                smgr.DrawAll();
                guienv.DrawAll();
                driver.EndScene();
                if (Quitter) device.Close();
            }
            device.Dispose();
        }
        
        static bool device_OnEvent(Event p_e)
        {
            if (p_e.Type == EventType.KeyInputEvent &&
                !p_e.KeyPressedDown)
            {
                switch (p_e.KeyCode)
                {
                    case KeyCode.Tab:
                        BasculerEvenementsCamera = true;
                        return true;
                    case KeyCode.Escape:
                        Quitter = true;
                        return true;
                } 
            }
            return false;
        }
    }
}

Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
Analysé par
878 membres
1424 sujets
11113 messages
Dernier membre inscrit: ElmasOzer
18 invités en ligne
Aucun membre connecté
RSS Feed