Historique des modifications - Message

Message #1726

Sujet: Libérer le curseur avec une camera FPS


Type Date Auteur Contenu
Dernière modification 01-03-2007 14:22:32 diOxy
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...
	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.

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 :

	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.

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

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;
        }
    }
}
Création du message 01-03-2007 14:21:33 diOxy
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...
	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.

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 :

	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.

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

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;
        }
    }
}

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
193 invités en ligne
membre en ligne: -
RSS Feed