示例#1
0
文件: example04.cs 项目: h3zjp/krkr2
        public void run()
        {
            /* Like in the HelloWorld example, we create an IrrlichtDevice with
             * new(). The difference now is that we ask the user to select
             * which hardware accelerated driver to use. The Software device would be
             * too slow to draw a huge Quake 3 map, but just for the fun of it, we make
             * this decision possible too.
             */
            // ask user for driver
            DriverType driverType;
            // Ask user to select driver:
            StringBuilder sb = new StringBuilder();

            sb.Append("Please select the driver you want for this example:\n");
            sb.Append("\n(a) Direct3D 9.0c\n(b) Direct3D 8.1\n(c) OpenGL 1.5");
            sb.Append("\n(d) Software Renderer\n(e)Apfelbaum Software Renderer");
            sb.Append("\n(f) Null Device\n(otherKey) exit\n\n");
            // Get the user's input:
            TextReader tIn  = Console.In;
            TextWriter tOut = Console.Out;

            tOut.Write(sb.ToString());
            string input = tIn.ReadLine();

            // Select device based on user's input:
            switch (input)
            {
            case "a":
                driverType = DriverType.DIRECT3D9;
                break;

            case "b":
                driverType = DriverType.DIRECT3D8;
                break;

            case "c":
                driverType = DriverType.OPENGL;
                break;

            case "d":
                driverType = DriverType.SOFTWARE;
                break;

            case "e":
                driverType = DriverType.SOFTWARE2;
                break;

            case "f":
                driverType = DriverType.NULL_DRIVER;
                break;

            default:
                return;
            }
            // Create device and exit if creation fails:
            device = new IrrlichtDevice(driverType, new Dimension2D(1024, 768), 32, true, true, true);               // Bob changed this.
            if (device == null)
            {
                tOut.Write("Device creation failed.");
                return;
            }
            /* set this as event receiver*/
            device.EventReceiver = this;

            /*
             * Get a reference to the video driver and the SceneManager so that
             * we do not always have to write device.VideoDriver and
             * device.SceneManager.
             */
            ISceneManager smgr   = device.SceneManager;
            IVideoDriver  driver = device.VideoDriver;

            /*Create the node for moving it with the 'W' and 'S' key. We create a
             * 'test node', which is a cube built in into the engine for testing purposes.
             * We place the node a (0,0,30) and we assign a texture to it to let it look a
             * little bit more interesting.*/
            node = smgr.AddCubeSceneNode(10, null, 0, new Vector3D(0, 0, 30), new Vector3D(), new Vector3D(1, 1, 1));
            node.SetMaterialTexture(0, driver.GetTexture(path + "wall.bmp"));
            node.SetMaterialFlag(MaterialFlag.LIGHTING, false);

            /* Now we create another node, moving using a scene node animator. Scene
             * node animators modify scene nodes and can be attached to any scene node
             * like mesh scene nodes, billboards, lights and even camera scene nodes.
             * Scene node animators are not only able to modify the position of a scene
             * node, they can also animate the textures of an object for example. We create
             * a test scene node again an attach a 'fly circle' scene node to it, letting
             * this node fly around our first test scene node.*/
            ISceneNode n = smgr.AddTestSceneNode(10, null, 0, new Vector3D(), new Vector3D(), new Vector3D(1, 1, 1));

            n.SetMaterialTexture(0, driver.GetTexture(path + "t351sml.jpg"));
            ISceneNodeAnimator anim = smgr.CreateFlyCircleAnimator(new Vector3D(0, 0, 30), 20, 0.001f);

            n.AddAnimator(anim);
            //is this really necessary?
            anim.__dtor();

            /*The last scene node we add to show possibilities of scene node animators
             * is a md2 model, which uses a 'fly straight' animator to run between two
             * points.*/
            IAnimatedMeshSceneNode anms = smgr.AddAnimatedMeshSceneNode(
                smgr.GetMesh(path + "sydney.md2"), null, 0);

            if (anms != null)
            {
                anim = smgr.CreateFlyStraightAnimator(new Vector3D(100, 0, 60), new Vector3D(-100, 0, 60), 10000, true);
                anms.AddAnimator(anim);
                anim.__dtor();

                /*To make to model look better, we disable lighting (we have created no lights,
                 * and so the model would be black), set the frames between which the animation
                 * should loop, rotate the model around 180 degrees, and adjust the animation
                 * speed and the texture.
                 * To set the right animation (frames and speed), we would also be able to just
                 * call "anms->setMD2Animation(scene::EMAT_RUN)" for the 'run' animation
                 * instead of "setFrameLoop" and "setAnimationSpeed", but this only works with
                 * MD2 animations, and so you know how to start other animations.*/
                anms.Position = new Vector3D(0, 0, 40);
                anms.SetMaterialFlag(MaterialFlag.LIGHTING, false);
                anms.SetFrameLoop(320, 360);
                anms.AnimationSpeed = 30;
                anms.Rotation       = new Vector3D(0, 180, 0);
                anms.SetMaterialTexture(0, driver.GetTexture(path + "sydney.BMP"));
            }

            /*To be able to look at and move around in this scene, we create a first person
             * shooter style camera and make the mouse cursor invisible.*/
            ICameraSceneNode camera = smgr.AddCameraSceneNodeFPS(null, 100, 100, 0);

            camera.Position = new Vector3D(0, 0, 0);
            device.CursorControl.Visible = false;

            /*
             * We have done everything, so lets draw it. We also write the current
             * frames per second and the drawn primitives to the caption of the
             * window.
             */
            int lastFPS = -1;

            while (device.Run())
            {
                if (device.WindowActive)
                {
                    device.VideoDriver.BeginScene(true, true, new Color(0, 200, 200, 200));
                    device.SceneManager.DrawAll();
                    device.VideoDriver.EndScene();
                    int fps = device.VideoDriver.FPS;
                    if (lastFPS != fps)
                    {
                        device.WindowCaption = "Irrlicht Engine - Movement example [" +
                                               device.VideoDriver.Name + "] FPS:" + fps.ToString();
                        lastFPS = fps;
                    }
                }
            }



            /*
             * In the end, delete the Irrlicht device.
             */
            // Instead of device->drop, we'll use:
            GC.Collect();
        }