示例#1
0
 public void Open(DemoOpenInfo demoInfo)
 {
     this.window   = demoInfo.Window;
     this.viewport = demoInfo.Viewport;
     this.scene    = demoInfo.Scene;
     this.demoInfo = demoInfo;
     Open();
 }
示例#2
0
 public void Open(DemoOpenInfo demoInfo)
 {
     this.window = demoInfo.Window;
     this.viewport = demoInfo.Viewport;
     this.scene = demoInfo.Scene;
     this.demoInfo = demoInfo;
     Open();
 }
        public static DisposeCallback RegisterDup(DemoOpenInfo info, List<Body> bodies)
        {
            LinkedList<Body> removable = new LinkedList<Body>();
            Body body = null;
            Scalar rotation = 0;
            Vector2D scale = new Vector2D(1, 1);
            bool duplicate = false;
            bool makeJoint = false;
            Vector2D anchor = Vector2D.Zero;
            int count = 0;
            Body bj1 = null;
            Body bj2 = null;
            EventHandler<ViewportMouseButtonEventArgs> mouseDown = delegate(object sender, ViewportMouseButtonEventArgs e)
            {
                IntersectionInfo temp;
                switch (e.Button)
                {
                    case MouseButton.PrimaryButton:
                        if (makeJoint)
                        {
                            count++;
                            switch (count)
                            {
                                case 1:
                                    for (LinkedListNode<Body> node = removable.First;
                                        node != null;
                                        node = node.Next)
                                    {
                                        Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                                        if (node.Value.Shape.TryGetIntersection(pos, out temp))
                                        {
                                            bj1 = node.Value;
                                            return;
                                        }
                                    }
                                    count--;
                                    break;
                                case 2:
                                    anchor = e.Position;
                                    break;
                                case 3:
                                    for (LinkedListNode<Body> node = removable.First;
                                                                           node != null;
                                                                           node = node.Next)
                                    {
                                        Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                                        if (node.Value.Shape.TryGetIntersection(pos, out temp))
                                        {
                                            bj2 = node.Value;
                                            return;
                                        }
                                    }
                                    count--;
                                    break;
                            }
                        }
                        else
                        {

                            foreach (Body b in bodies)
                            {
                                Vector2D pos = b.Matrices.ToBody * e.Position;
                                if (b.Shape.TryGetIntersection(pos, out temp))
                                {
                                    body = b.Duplicate();
                                    info.Scene.AddGraphic(new BodyGraphic(body));
                                    return;
                                }
                            }
                            for (LinkedListNode<Body> node = removable.First;
                                node != null;
                                node = node.Next)
                            {
                                Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                                if (node.Value.Shape.TryGetIntersection(pos, out temp))
                                {
                                    if (duplicate)
                                    {
                                        body = node.Value.Duplicate();
                                        info.Scene.AddGraphic(new BodyGraphic(body));
                                        return;
                                    }
                                    else
                                    {
                                        body = node.Value;
                                        removable.Remove(node);
                                        return;
                                    }
                                }
                            }
                        }
                        break;
                    case MouseButton.SecondaryButton:
                        for (LinkedListNode<Body> node = removable.First;
                           node != null;
                           node = node.Next)
                        {
                            Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                            if (node.Value.Shape.TryGetIntersection(pos, out temp))
                            {
                                node.Value.Lifetime.IsExpired = true;
                                removable.Remove(node);
                                return;
                            }
                        }
                        break;
                }
            };
            EventHandler<ViewportMouseMotionEventArgs> mouseMotion = delegate(object sender, ViewportMouseMotionEventArgs e)
            {
                if (body != null)
                {
                    body.State.Position.Linear = e.Position;
                }
            };
            EventHandler<ViewportMouseButtonEventArgs> mouseUp = delegate(object sender, ViewportMouseButtonEventArgs e)
            {
                if (body != null)
                {
                    removable.AddLast(body);
                    body = null;
                }
            };
            EventHandler<KeyboardEventArgs> keyDown = delegate(object sender, KeyboardEventArgs e)
            {
                switch (e.Key)
                {
                    case Key.Q:
                        rotation -= .05f;
                        break;
                    case Key.E:
                        rotation += .05f;
                        break;
                    case Key.W:
                        scale.Y += .05f;
                        break;
                    case Key.S:
                        scale.Y -= .05f;
                        break;
                    case Key.A:
                        scale.X -= .05f;
                        break;
                    case Key.D:
                        scale.X += .05f;
                        break;
                    case Key.LeftControl:
                    case Key.RightControl:
                        duplicate = true;
                        break;
                    case Key.LeftShift:
                    case Key.RightShift:
                        count = 0;
                        makeJoint = true;
                        break;
                }
            };
            EventHandler<KeyboardEventArgs> keyUp = delegate(object sender, KeyboardEventArgs e)
            {
                switch (e.Key)
                {
                    case Key.Q:
                        rotation += .05f;
                        break;
                    case Key.E:
                        rotation -= .05f;
                        break;
                    case Key.W:
                        scale.Y -= .05f;
                        break;
                    case Key.S:
                        scale.Y += .05f;
                        break;
                    case Key.A:
                        scale.X += .05f;
                        break;
                    case Key.D:
                        scale.X -= .05f;
                        break;
                    case Key.LeftControl:
                    case Key.RightControl:
                        duplicate = false;
                        break;
                    case Key.LeftShift:
                    case Key.RightShift:
                        switch (count)
                        {
                            case 2:
                                info.Scene.Engine.AddJoint(new FixedHingeJoint(bj1, anchor, new Lifespan()));
                                break;
                            case 3:
                                info.Scene.Engine.AddJoint(new HingeJoint(bj1, bj2, anchor, new Lifespan()));
                                break;
                        }

                        count = 0;
                        makeJoint = false;
                        break;
                }
            };
            EventHandler<DrawEventArgs> onDraw = delegate(object sender, DrawEventArgs e)
            {
                if (body != null)
                {
                    body.State.Position.Angular += rotation;
                    body.Transformation *= Matrix2x3.FromScale(scale);
                    body.ApplyPosition();
                }
            };
            info.Scene.BeginDrawing += onDraw;
            info.Viewport.MouseDown += mouseDown;
            info.Viewport.MouseMotion += mouseMotion;
            info.Viewport.MouseUp += mouseUp;
            Events.KeyboardDown += keyDown;
            Events.KeyboardUp += keyUp;
            return delegate()
            {
                info.Scene.BeginDrawing -= onDraw;
                info.Viewport.MouseDown -= mouseDown;
                info.Viewport.MouseMotion -= mouseMotion;
                info.Viewport.MouseUp -= mouseUp;
                Events.KeyboardDown -= keyDown;
                Events.KeyboardUp -= keyUp;
            };
        }
示例#4
0
        public static DisposeCallback RegisterDup(DemoOpenInfo info, List <Body> bodies)
        {
            LinkedList <Body> removable = new LinkedList <Body>();
            Body     body      = null;
            Scalar   rotation  = 0;
            Vector2D scale     = new Vector2D(1, 1);
            bool     duplicate = false;
            bool     makeJoint = false;
            Vector2D anchor    = Vector2D.Zero;
            int      count     = 0;
            Body     bj1       = null;
            Body     bj2       = null;
            EventHandler <ViewportMouseButtonEventArgs> mouseDown = delegate(object sender, ViewportMouseButtonEventArgs e)
            {
                IntersectionInfo temp;
                switch (e.Button)
                {
                case MouseButton.PrimaryButton:
                    if (makeJoint)
                    {
                        count++;
                        switch (count)
                        {
                        case 1:
                            for (LinkedListNode <Body> node = removable.First;
                                 node != null;
                                 node = node.Next)
                            {
                                Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                                if (node.Value.Shape.TryGetIntersection(pos, out temp))
                                {
                                    bj1 = node.Value;
                                    return;
                                }
                            }
                            count--;
                            break;

                        case 2:
                            anchor = e.Position;
                            break;

                        case 3:
                            for (LinkedListNode <Body> node = removable.First;
                                 node != null;
                                 node = node.Next)
                            {
                                Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                                if (node.Value.Shape.TryGetIntersection(pos, out temp))
                                {
                                    bj2 = node.Value;
                                    return;
                                }
                            }
                            count--;
                            break;
                        }
                    }
                    else
                    {
                        foreach (Body b in bodies)
                        {
                            Vector2D pos = b.Matrices.ToBody * e.Position;
                            if (b.Shape.TryGetIntersection(pos, out temp))
                            {
                                body = b.Duplicate();
                                info.Scene.AddGraphic(new BodyGraphic(body));
                                return;
                            }
                        }
                        for (LinkedListNode <Body> node = removable.First;
                             node != null;
                             node = node.Next)
                        {
                            Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                            if (node.Value.Shape.TryGetIntersection(pos, out temp))
                            {
                                if (duplicate)
                                {
                                    body = node.Value.Duplicate();
                                    info.Scene.AddGraphic(new BodyGraphic(body));
                                    return;
                                }
                                else
                                {
                                    body = node.Value;
                                    removable.Remove(node);
                                    return;
                                }
                            }
                        }
                    }
                    break;

                case MouseButton.SecondaryButton:
                    for (LinkedListNode <Body> node = removable.First;
                         node != null;
                         node = node.Next)
                    {
                        Vector2D pos = node.Value.Matrices.ToBody * e.Position;
                        if (node.Value.Shape.TryGetIntersection(pos, out temp))
                        {
                            node.Value.Lifetime.IsExpired = true;
                            removable.Remove(node);
                            return;
                        }
                    }
                    break;
                }
            };
            EventHandler <ViewportMouseMotionEventArgs> mouseMotion = delegate(object sender, ViewportMouseMotionEventArgs e)
            {
                if (body != null)
                {
                    body.State.Position.Linear = e.Position;
                }
            };
            EventHandler <ViewportMouseButtonEventArgs> mouseUp = delegate(object sender, ViewportMouseButtonEventArgs e)
            {
                if (body != null)
                {
                    removable.AddLast(body);
                    body = null;
                }
            };
            EventHandler <KeyboardEventArgs> keyDown = delegate(object sender, KeyboardEventArgs e)
            {
                switch (e.Key)
                {
                case Key.Q:
                    rotation -= .05f;
                    break;

                case Key.E:
                    rotation += .05f;
                    break;

                case Key.W:
                    scale.Y += .05f;
                    break;

                case Key.S:
                    scale.Y -= .05f;
                    break;

                case Key.A:
                    scale.X -= .05f;
                    break;

                case Key.D:
                    scale.X += .05f;
                    break;

                case Key.LeftControl:
                case Key.RightControl:
                    duplicate = true;
                    break;

                case Key.LeftShift:
                case Key.RightShift:
                    count     = 0;
                    makeJoint = true;
                    break;
                }
            };
            EventHandler <KeyboardEventArgs> keyUp = delegate(object sender, KeyboardEventArgs e)
            {
                switch (e.Key)
                {
                case Key.Q:
                    rotation += .05f;
                    break;

                case Key.E:
                    rotation -= .05f;
                    break;

                case Key.W:
                    scale.Y -= .05f;
                    break;

                case Key.S:
                    scale.Y += .05f;
                    break;

                case Key.A:
                    scale.X += .05f;
                    break;

                case Key.D:
                    scale.X -= .05f;
                    break;

                case Key.LeftControl:
                case Key.RightControl:
                    duplicate = false;
                    break;

                case Key.LeftShift:
                case Key.RightShift:
                    switch (count)
                    {
                    case 2:
                        info.Scene.Engine.AddJoint(new FixedHingeJoint(bj1, anchor, new Lifespan()));
                        break;

                    case 3:
                        info.Scene.Engine.AddJoint(new HingeJoint(bj1, bj2, anchor, new Lifespan()));
                        break;
                    }

                    count     = 0;
                    makeJoint = false;
                    break;
                }
            };
            EventHandler <DrawEventArgs> onDraw = delegate(object sender, DrawEventArgs e)
            {
                if (body != null)
                {
                    body.State.Position.Angular += rotation;
                    body.Transformation         *= Matrix2x3.FromScale(scale);
                    body.ApplyPosition();
                }
            };

            info.Scene.BeginDrawing   += onDraw;
            info.Viewport.MouseDown   += mouseDown;
            info.Viewport.MouseMotion += mouseMotion;
            info.Viewport.MouseUp     += mouseUp;
            Events.KeyboardDown       += keyDown;
            Events.KeyboardUp         += keyUp;
            return(delegate()
            {
                info.Scene.BeginDrawing -= onDraw;
                info.Viewport.MouseDown -= mouseDown;
                info.Viewport.MouseMotion -= mouseMotion;
                info.Viewport.MouseUp -= mouseUp;
                Events.KeyboardDown -= keyDown;
                Events.KeyboardUp -= keyUp;
            });
        }