62 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System.Collections.Generic;
 | 
						|
using FarseerPhysics.Collision.Shapes;
 | 
						|
using FarseerPhysics.Common;
 | 
						|
using FarseerPhysics.Dynamics;
 | 
						|
using Microsoft.Xna.Framework;
 | 
						|
 | 
						|
namespace FarseerPhysics.Factories
 | 
						|
{
 | 
						|
    public static class LinkFactory
 | 
						|
    {
 | 
						|
        /// <summary>
 | 
						|
        /// Creates a chain.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="world">The world.</param>
 | 
						|
        /// <param name="start">The start.</param>
 | 
						|
        /// <param name="end">The end.</param>
 | 
						|
        /// <param name="linkWidth">The width.</param>
 | 
						|
        /// <param name="linkHeight">The height.</param>
 | 
						|
        /// <param name="fixStart">if set to <c>true</c> [fix start].</param>
 | 
						|
        /// <param name="fixEnd">if set to <c>true</c> [fix end].</param>
 | 
						|
        /// <param name="numberOfLinks">The number of links.</param>
 | 
						|
        /// <param name="linkDensity">The link density.</param>
 | 
						|
        /// <returns></returns>
 | 
						|
        public static Path CreateChain(World world, Vector2 start, Vector2 end, float linkWidth, float linkHeight,
 | 
						|
                                       bool fixStart, bool fixEnd, int numberOfLinks, float linkDensity)
 | 
						|
        {
 | 
						|
            //Chain start / end
 | 
						|
            Path path = new Path();
 | 
						|
            path.Add(start);
 | 
						|
            path.Add(end);
 | 
						|
 | 
						|
            //A single chainlink
 | 
						|
            PolygonShape shape = new PolygonShape(PolygonTools.CreateRectangle(linkWidth, linkHeight), linkDensity);
 | 
						|
 | 
						|
            //Use PathManager to create all the chainlinks based on the chainlink created before.
 | 
						|
            List<Body> chainLinks = PathManager.EvenlyDistributeShapesAlongPath(world, path, shape, BodyType.Dynamic,
 | 
						|
                                                                                numberOfLinks);
 | 
						|
 | 
						|
            if (fixStart)
 | 
						|
            {
 | 
						|
                //Fix the first chainlink to the world
 | 
						|
                JointFactory.CreateFixedRevoluteJoint(world, chainLinks[0], new Vector2(0, -(linkHeight / 2)),
 | 
						|
                                                      chainLinks[0].Position);
 | 
						|
            }
 | 
						|
 | 
						|
            if (fixEnd)
 | 
						|
            {
 | 
						|
                //Fix the last chainlink to the world
 | 
						|
                JointFactory.CreateFixedRevoluteJoint(world, chainLinks[chainLinks.Count - 1],
 | 
						|
                                                      new Vector2(0, (linkHeight / 2)),
 | 
						|
                                                      chainLinks[chainLinks.Count - 1].Position);
 | 
						|
            }
 | 
						|
 | 
						|
            //Attach all the chainlinks together with a revolute joint
 | 
						|
            PathManager.AttachBodiesWithRevoluteJoint(world, chainLinks, new Vector2(0, -linkHeight),
 | 
						|
                                                      new Vector2(0, linkHeight),
 | 
						|
                                                      false, false);
 | 
						|
 | 
						|
            return (path);
 | 
						|
        }
 | 
						|
    }
 | 
						|
} |