public MovablePlatform(float radius)
 {
     Radius = radius;
     PolyBody = new PolyBody(1, 4);
     color = Color.Gray;
     Load();
 }
 public Block(float scale)
 {
     Scale = scale;
     PolyBody = new PolyBody(1, 4);
     this.PolyBody.Friction = .3f;
     Load();
 }
 public FixedBlock(float radius)
 {
     Radius = radius;
     PolyBody = new PolyBody(1, 4);
     PolyBody.IsFixed = true;
     Load();
 }
 public Platform(float length)
 {
     Length = length;
     Width = DefaultThickness;
     PolyBody = new PolyBody(1, 4);
     PolyBody.IsFixed = true;
     Load();
 }
 public Bouncer(float radius)
 {
     Radius = radius;
     PolyBody = new PolyBody(1, 5);
     PolyBody.Restitution = 0.0f;
     color = Color.Gray;
     Load();
 }
 public Floor(float width)
 {
     Width = width;
     Height = .5f; // Constant
     PolyBody = new PolyBody(1, 4);
     color = Color.Gray;
     Load();
 }
 public Player(Vector2 position)
 {
     Scale = .5f;
     PolyBody = new PolyBody(1, 4);
     PolyBody.Position = position;
     PolyBody.Rotation = 0;
     PolyBody.Friction = .15f;
     PolyBody.CanSleep = false;
     PolyBody.IsRotationFixed = true;
     Load();
 }
        public Portal(string id, string partnerAddress, float x, float y)
        {
            Scale = .25f;
            PolyBody = new PolyBody(1, 10);
            PolyBody.Position = new Vector2(x, y);
            IsPhysicsable = false;

            ID = id;
            PartnerAddress = partnerAddress;

            Active = true;
            Load();
        }
        public GravityGrenade(Actor launcher, float weaponPower, Vector2 destination)
        {
            Scale = .7f;
            this.doNotSave = true;
            var player = (GameEngine.Singleton.GetPlayState())
                .ActiveMap.MainPlayer;
            Launcher = launcher;
            WeaponPower = weaponPower;
            PolyBody = new PolyBody(.1f, 3);
            PolyBody.Gravity = -9.8f * Vector2.UnitY;
            Load();
            PolyBody.Position = launcher.PolyBody.Position +
                (launcher.PolyBody.GetWidth() + (Sprite.BoundingBox().X/2)) * Math.Sign(destination.X - launcher.PolyBody.Position.X) *
                Vector2.UnitX;
            PolyBody.Velocity = computeTargetVelocity(destination);

            PolyBody.Collided += new PhysicsEventHandler(Detonate);
        }
        public static bool TestCollisionPartiPoly(Particle p, PolyBody bod, out Vector2 axis, out float disp)
        {
            axis = new Vector2();
            disp = float.MinValue;

            var norms = bod.GetNormals().ToList();

            Vector2 closeV = Vector2.Zero;
            var verts = bod.GetTransformedVertices();
            float min = float.MaxValue;
            foreach (var v in verts)
            {
                var d = (p.Position - v).LengthSquared();
                if (d < min)
                {
                    d = min;
                    closeV = v;
                }
            }
            if (closeV != Vector2.Zero && p.Position - closeV != Vector2.Zero)
            {
                var pNorm = Vector2.Normalize(p.Position - closeV);
                norms.Add(pNorm);
            }

            //
            //Col test
            //
            foreach (Vector2 ax in norms)
            {
                float d = Projection.IntervalDist(p.Project(ax), bod.Project(ax));

                if (d > 0) //no collision if even 1 separating axis found
                {
                    disp = 0;
                    return false;
                }
                else if (d > disp) //return disp w/ lowset overlap (ie: highest separation)
                {
                    disp = d;
                    axis = ax;
                }

            }

            if (Vector2.Dot(p.Position - bod.Position, axis) < 0) //make sure the normal always points from p->bod. (should this use .GetCentroid() instead of position?)
                axis = -axis;
            return true;
        }
示例#11
0
 void Collided(PolyBody sender, object ignoreParamater)
 {
     var game = (GameEngineCore.GameStates.IPlayable)GameEngine.Singleton.ActiveState;
     if (game.ActiveMap.MainPlayer.PolyBody == sender)
     {
         this.actUpon();
         if (CollidedWith != null)
             CollidedWith(this, (PolyBody)sender);
     }
 }
        //axis must be from a->b!
        /// <summary>
        /// finds vertices of each polygon which are within the other polygon
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="axis"></param>
        /// <param name="disp"></param>
        /// <returns></returns>
        public static List<Contact> FindSubContactsPoly_CheapVerts(PolyBody a, PolyBody b, Vector2 axis, float disp)
        {
            var cons = new List<Contact>();

            foreach (var v in a.GetTransformedVertices())
            {
                if(TestPointInPoly(b, v))
                    cons.Add(new Contact(a, b, v, axis, disp));
            }
            foreach (var v in b.GetTransformedVertices())
            {
                if(TestPointInPoly(a, v))
                    cons.Add(new Contact(a, b, v, axis, disp));
            }

            return cons;
        }
        //axis must be from a->b!
        public static List<Contact> FindSubContactsPoly(PolyBody a, PolyBody b, Vector2 axis, float disp)
        {
            Vector2[] supA = GetSupports(b, axis); //get supports. instead of iterating over ALL vertices, only iterate over 4 closest, based on sep axis
            Vector2[] supB = GetSupports(a, -axis);

            var cons = new List<Contact>();

            for (int i = 0; i < supA.Length; i++)
                for (int j = 0; j < supB.Length; j++)
                {
                    Vector2 vout;
                    if (TestCollisionLine(supA[i], supA[(i + 1) % supA.Length], supB[j], supB[(j + 1) % supB.Length], out vout))
                    {
                        cons.Add(new Contact(a, b, vout, axis, disp));
                    }
                }

            return cons;
        }
        public static Texture2D GenerateTexFromPolygon(Polygon p)
        {
            var ppm = MathUtil.PixelsPerMeter;

            var np = new PolyBody(1, p.RawVertices.Length);
            //np.RawVertices = p.GetRotatedVertices();
            np.RawVertices = p.RawVertices;
            np.Position = Vector2.Zero;
            np.Rotation = 0;

            var bb = np.GetBoundingBoxRaw();

            int w = (int)(bb.Width * ppm);
            int h = (int)(bb.Height * ppm);
            Color[] col = new Color[w * h];

            Debug.Trace("Generating textures...");

            /*for (int x = 0; x < w; x++)
                for (int y = 0; y < h; y++)
                {
                    var xt = bb.xmin + x/ppm; //transform into polygon-space
                    var yt = bb.ymax - y/ppm;
                    var vt = new Vector2((float)xt, (float)yt);
                    if (CollisionEngine.TestPointInPoly(np, vt))
                    {
                        col[x + y * w] = Color.White;
                    }
                    else
                    {
                        col[x + y * w] = Color.TransparentBlack;
                    }
                }*/
            Enumerable.Range(0, w).PForEach(x =>
                {
                    for (int y = 0; y < h; y++)
                    {
                        var xt = bb.xmin + x / ppm; //transform into polygon-space
                        var yt = bb.ymax - y / ppm;
                        var vt = new Vector2((float)xt, (float)yt);
                        if (CollisionEngine.TestPointInPoly(np, vt))
                        {
                            col[x + y * w] = Color.White;
                        }
                        else
                        {
                            col[x + y * w] = Color.Black;
                        }
                    }
                }
            );

            var sb = (SpriteBatch)(Globals.Variables["SpriteBatch"]);
            var dev = (GraphicsDevice)(Globals.Variables["GraphicsDevice"]);
            Texture2D tex = new Texture2D(dev, w, h, false, SurfaceFormat.Color);
            tex.SetData<Color>(col);

            /*MemoryStream texStream = new MemoryStream();
            texStream.BeginWrite();
            col.

            Texture2D tex = Texture2D.FromFile((GraphicsDevice)(Globals.Variables["GraphicsDevice"]), texStream);*/

            Debug.Trace("Done generating!");
            return tex;
        }
        void MouseClick(GUIElement sender, MouseEventArgs e)
        {
            if (e.CurrentMouseState.LeftButton == ButtonState.Released)
            {
                pemitter.TurnOff();
            }

            if (e.isClicked(MouseButtons.Right))
            {
                int vertexCount = (new Random()).Next(4, 4);
                if (vertexCount >= 9)
                {
                    vertexCount = 25;
                }
                var polybody = new PolyBody(1f, vertexCount);
                polybody.MakeRegularFromRad(.8f);
                polybody.Mass = 1f;
                polybody.Position = new Vector2(e.CurrentMouseState.X, e.CurrentMouseState.Y).C2P();
                polybody.Restitution = 0.1f;
                polybody.Friction = .20f;

                AddAndInit(polybody);
                //vertices.Add(new Vector2(e.CurrentMouseState.X, e.CurrentMouseState.Y).C2P());
            }
        }
 // Helper Functions
 // Events
 void KeyUp(GUIElement sender, KeyEventArgs e)
 {
     if (e.InterestingKeys.Contains<Keys>(Keys.Escape))
         this.Exit();
     if (e.InterestingKeys.Contains<Keys>(Keys.OemTilde))
         GameEngine.Singleton.AddAndLoad(new ConsoleState());
     if (vertices.Count > 0 && e.InterestingKeys.Contains(Keys.Enter))
     {
         var body = new PolyBody(1, vertices.Count);
         body.ConstructFromVertices(vertices.ToArray());
         body.IsFixed = true;
         PhysicsManager.AddRigidBody(body);
         body.tex = GraphicsGenerator.GenerateTexFromPolygon(body);
         vertices.Clear();
     }
 }
        // Init Functions
        void InitPhysicsEngine()
        {
            pemitter = new ParticleEmmiter(PhysicsManager, new Vector2(1f, .5f), Vector2.One, 10f, 50f, 3f);

            var ground = new PolyBody(1, 4);
            ground.MakeRect(20, 1, (new Vector2(size.Width / 2, 0)));
            ground.IsFixed = true;
            AddAndInit(ground);

            /*var polybody = new PolyBody(1f, (new Random()).Next(5, 5)); //3,8
            polybody.MakeRegularFromRad(.8f);
            polybody.Mass = 1f;
            polybody.Position = new Vector2(size.Width / 2, size.Height / 2);
            polybody.Restitution = 0.0f;

            AddAndInit(polybody);*/

            var rotPlat = new PolyBody(1f, 4);
            rotPlat.MakeRect(8, 1);
            rotPlat.Mass = 4f;
            rotPlat.Position = new Vector2(size.Width / 2, size.Height / 2);
            rotPlat.Restitution = 0.0f;
            rotPlat.IsPivot = true;

            AddAndInit(rotPlat);

            #region bouncer
            float width1 = 4f;
            float width2 = 2f;

            float height = .5f;

            var p1 = new PolyBody(3, 4);
            p1.MakeRect(width1, height);
            p1.Position = new Vector2(size.Width / 2, 1);
            var p1_con1 = -(Vector2.UnitX * width1 / 2 * 3 / 4);
            var p1_con2 = (Vector2.UnitX * width1 / 2 * 3 / 4);

            var p2 = new PolyBody(1, 4);
            p2.MakeRect(width2, height);
            p2.Position = new Vector2(size.Width / 2, 3.5f);
            var p2_con1 = -(Vector2.UnitX * width2 / 2 * 3 / 4) - (Vector2.UnitY * height/2 * 2 / 3);
            var p2_con2 = (Vector2.UnitX * width2 / 2 * 3 / 4) - (Vector2.UnitY * height/2 * 2 / 3);

            Spring s1 = new Spring(p1, p2, p1_con1, p2_con1, 3f, 30f, 1.0f);
            Spring s2 = new Spring(p1, p2, p1_con2, p2_con2, 3f, 30f, 1.0f);

            Spring s3 = new Spring(p1, p2, p1_con1, p2_con2, 3f, 30f, 1.0f);
            Spring s4 = new Spring(p1, p2, p1_con2, p2_con1, 3f, 30f, 1.0f);

            s1.SetLengthToCurrent();
            s2.SetLengthToCurrent();

            PhysicsManager.AddBinaryForceComponent(s1);
            PhysicsManager.AddBinaryForceComponent(s2);
            PhysicsManager.AddBinaryForceComponent(s3);
            PhysicsManager.AddBinaryForceComponent(s4);

            AddAndInit(p1);
            AddAndInit(p2);
            #endregion bouncer
        }
        private void DrawPolygon(PolyBody body)
        {
            Vector2 position = body.Position;
            Color color;
            if (body.IsSleeping)
                color = Color.Black;
            else
                color = Color.Red;

            GraphicsEngine.DrawPolygon((Polygon)body, color, new Vector2(.1f).P2C().X);
            //GraphicsEngine.DrawForces(position, ((PolyBody)body).currForces, 3, .1f);
        }
 private void AddAndInit(PolyBody p)
 {
     PhysicsManager.AddRigidBody(p);
     p.tex = GraphicsGenerator.GenerateTexFromPolygon(p);
 }
 private void FillPolygon(PolyBody body, Actor actor)
 {
     GraphicsEngine.FillPolygon(body, ((PolyBody)body).tex, actor.color);
 }
 public static Contact FindFirstContact_ReallyCheap(PolyBody spirit, PolyBody body, Vector2 axis, float disp)
 {
     foreach (var v in spirit.GetTransformedVertices())
     {
         if (TestPointInPoly(body, v))
             return new Contact(spirit, body, v, axis, disp);
     }
     return new Contact(null, null, Vector2.Zero, Vector2.Zero, 0f);
 }