logancberrypie

Composition over inheritance

Mar 5th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.46 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Composition
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             Particle test = new Particle();
  14.             Console.WriteLine(test.hasInitialVelocity);
  15.  
  16.             test.AddParticlePropery(Particle.Properties.initialVelocity);
  17.             Console.WriteLine(test.hasInitialVelocity);
  18.             Console.WriteLine(test.initialVelocity);
  19.  
  20.             test.initialVelocity = 5;
  21.             Console.WriteLine(test.hasInitialVelocity);
  22.             Console.WriteLine(test.initialVelocity);
  23.  
  24.             Console.ReadLine();
  25.  
  26.  
  27.         }
  28.     }
  29.  
  30.     class SimulationController
  31.     {
  32.         private static float timeTillUpdate = 1.0f;
  33.  
  34.  
  35.         public void Update()
  36.         {
  37.             UpdateParticleGraphValues();
  38.  
  39.             UpdateTimeLabel();
  40.             UpdateVelocity();
  41.             UpdatePosition();
  42.  
  43.  
  44.  
  45.         }
  46.  
  47.         private void UpdatePosition()
  48.         {
  49.             foreach (Particle particle in Particle.ParticleInstances)
  50.             {
  51.                 particle.MyGameObject.transform.position = particle.MyGameObject.transform.position + particle.currentVelocity * deltaT;
  52.             }
  53.         }
  54.  
  55.         private void UpdateVelocity()
  56.         {
  57.             foreach (Particle particle in Particle.ParticleInstances)
  58.             {
  59.                 Vector3 acceleration = GetAccelleration(particle);
  60.                 particle.currentVelocity = particle.currentVelocity + acceleration * deltaT;
  61.             }
  62.         }
  63.  
  64.         private Vector3 GetAccelleration(Particle particle)
  65.         {
  66.             Vector3 accelerationCounter = Vector3.zero;
  67.             if (particle.hasGravity && particle.hasMass)
  68.             {
  69.                 accelerationCounter = GetAccellerationGravity(particle);
  70.             }
  71.             if (particle.hasAcceleration)
  72.             {
  73.                 accelerationCounter += particle.acceleration;
  74.             }
  75.             return accelerationCounter;
  76.         }
  77.  
  78.         private void GetAccellerationGravity(Particle particle)
  79.         {
  80.             Vector3 sum = Vector3.zero;
  81.             Vector3 positionDelta = Vector3.zero;
  82.             foreach (Particle planet in Particle.ParticleInstances)
  83.             {
  84.                 if (planet.hasGravity && planet.hasMass)
  85.                 {
  86.                     positionDelta = planet.MyGameObject.transform.position - particle.MyGameObject.transform.position;
  87.                     //Cannot divide by 0
  88.                     if (positionDelta != Vector3.zero)
  89.                     {
  90.                         sum += planet.mass * positionDelta / Mathf.Pow(MyMaths.Vector_Magnitude(positionDelta), 3);
  91.                     }
  92.                 }
  93.  
  94.             }
  95.             return G * sum;
  96.         }
  97.  
  98.         private void UpdateParticleGraphValues()
  99.         {
  100.             //Only updates every X seconds
  101.             if (timeTillUpdate <= 0)
  102.             {
  103.                 //Updates the points stored for every planet created
  104.                 UpdateGraphValues();
  105.                 //Index of particle user has selected for graphing
  106.                 int index = Gravity_InputController.Instance.DropBoxGraphTarget.value;
  107.                 //Updating graphs
  108.                 Gravity_InputController.Instance.GraphAcceleration.GetComponent<GraphMaker>().CreateGraph(GravityPlanets.PlanetInstances[index].graphPointsAcceleration);
  109.                 Gravity_InputController.Instance.GraphSpeed.GetComponent<GraphMaker>().CreateGraph(GravityPlanets.PlanetInstances[index].graphPointsSpeed);
  110.  
  111.                 timeTillUpdate = timePerUpdate;
  112.             }
  113.             else
  114.             {
  115.                 timeTillUpdate -= Time.deltaTime;
  116.             }
  117.         }
  118.  
  119.         //Updates the values of points to plot for every planet
  120.         private void UpdateGraphValues()
  121.         {
  122.             foreach (Particle particle in Particle.ParticleInstances)
  123.             {
  124.                 if (particle.hasGraphingValuesAcceleration)
  125.                 {
  126.                     UpdateGraphValuesAcceleration(particle);
  127.                 }
  128.                 if (particle.hasGraphingValuesSpeed)
  129.                 {
  130.                     UpdateGraphValuesSpeed(particle);
  131.                 }
  132.                 if (particle.hasGraphingValuesMomentumX)
  133.                 {
  134.                     UpdateGraphValuesMomentumX(particle);
  135.                 }
  136.                 if (particle.hasGraphingValuesMomentumY)
  137.                 {
  138.                     UpdateGraphValuesMomentumY(particle);
  139.                 }
  140.  
  141.             }
  142.         }
  143.  
  144.         private void UpdateGraphValuesMomentumY(Particle particle)
  145.         {
  146.             particle.graphingValuesMomentumY.Add(new Vector2(
  147.                 simulationTime,
  148.                 particle.mass * particle.currentVelocity.y));
  149.         }
  150.  
  151.         private void UpdateGraphValuesMomentumX(Particle particle)
  152.         {
  153.             particle.graphingValuesMomentumX.Add(new Vector2(
  154.             simulationTime,
  155.             particle.mass * particle.currentVelocity.x));
  156.         }
  157.  
  158.         private void UpdateGraphValuesSpeed(Particle particle)
  159.         {
  160.             particle.graphingValuesSpeed.Add(new Vector2(simulationTime, particle.currentVelocity.magnitude));
  161.         }
  162.  
  163.         private void UpdateGraphValuesAcceleration(Particle particle)
  164.         {
  165.             particle.graphingValuesAcceleration.Add(new Vector2(simulationTime, GetAccelleration(particle).magnitude));
  166.         }
  167.     }
  168.  
  169.  
  170.  
  171.  
  172.     class Particle
  173.     {
  174.         public static List<Particle> ParticleInstances = new List<Particle>();
  175.  
  176.         public enum Properties
  177.         {
  178.             MyGameObject,
  179.             ParticlePrefabs,
  180.             ParticleSprites,
  181.             displacement,
  182.             initialVelocity,
  183.             currentVelocity,
  184.             acceleration,
  185.             motionTime,
  186.             initialPosition,
  187.             key,
  188.             numberOfInputs,
  189.             invalidInput,
  190.             diameter,
  191.             restitution,
  192.             mass,
  193.             gravity,
  194.             collisions,
  195.             graphingValuesSpeed,
  196.             graphingValuesAcceleration,
  197.             graphingValuesMomentumX,
  198.             graphingValuesMomentumY,
  199.         }
  200.  
  201.         public void AddParticlePropery(Properties propertyType)
  202.         {
  203.             ObjectProperties[propertyType] = null;
  204.         }
  205.  
  206.  
  207.         public Dictionary<Properties, object> ObjectProperties = new Dictionary<Properties, object>();
  208.  
  209.         public bool hasMyGameObject => ObjectProperties.ContainsKey(Properties.MyGameObject);
  210.         public bool hasParticlePrefabs => ObjectProperties.ContainsKey(Properties.ParticlePrefabs);
  211.         public bool hasParticleSprites => ObjectProperties.ContainsKey(Properties.ParticleSprites);
  212.  
  213.         public bool hasDisplacement => ObjectProperties.ContainsKey(Properties.displacement);
  214.         public bool hasInitialVelocity => ObjectProperties.ContainsKey(Properties.initialVelocity);
  215.         public bool hasCurrentVelocity => ObjectProperties.ContainsKey(Properties.currentVelocity);
  216.         public bool hasAcceleration => ObjectProperties.ContainsKey(Properties.acceleration);
  217.         public bool hasMotionTime => ObjectProperties.ContainsKey(Properties.motionTime);
  218.  
  219.         public bool hasKey => ObjectProperties.ContainsKey(Properties.key);
  220.         public bool hasNumberOfInputs => ObjectProperties.ContainsKey(Properties.numberOfInputs);
  221.         public bool hasInvalidInput => ObjectProperties.ContainsKey(Properties.invalidInput);
  222.  
  223.         public bool hasDiameter => ObjectProperties.ContainsKey(Properties.diameter);
  224.         public bool hasRestitution => ObjectProperties.ContainsKey(Properties.restitution);
  225.         public bool hasMass => ObjectProperties.ContainsKey(Properties.mass);
  226.         public bool hasInitialPosition => ObjectProperties.ContainsKey(Properties.initialPosition);
  227.  
  228.         public bool hasGraphingValuesSpeed => ObjectProperties.ContainsKey(Properties.graphingValuesSpeed);
  229.         public bool hasGraphingValuesAcceleration => ObjectProperties.ContainsKey(Properties.graphingValuesAcceleration);
  230.         public bool hasGraphingValuesMomentumX => ObjectProperties.ContainsKey(Properties.graphingValuesMomentumX);
  231.         public bool hasGraphingValuesMomentumY => ObjectProperties.ContainsKey(Properties.graphingValuesMomentumY);
  232.  
  233.         public bool hasGravity => ObjectProperties.ContainsKey(Properties.gravity);
  234.         public bool hasCollisions => ObjectProperties.ContainsKey(Properties.collisions);
  235.  
  236.  
  237.         public float initialVelocity
  238.         {
  239.             get
  240.             {
  241.                 if (hasInitialVelocity)
  242.                 {
  243.                     return (float)ObjectProperties[Properties.initialVelocity];
  244.                 }
  245.                 else { throw new NotSupportedException("This particle has no initial Velocity"); }
  246.             }
  247.             set
  248.             {
  249.                 if (hasInitialVelocity)
  250.                 {
  251.                     ObjectProperties[Properties.initialVelocity] = value;
  252.                 }
  253.                 else { throw new NotSupportedException("This particle has no initial Velocity"); }
  254.             }
  255.         }
  256.  
  257.         public GameObject MyGameObject
  258.         {
  259.             get
  260.             {
  261.                 if (hasMyGameObject)
  262.                 {
  263.                     return ObjectProperties[Properties.MyGameObject];
  264.                 }
  265.                 else { throw new NotSupportedException("This particle has no Gameobject"); }
  266.             }
  267.             set
  268.             {
  269.                 if (hasMyGameObject)
  270.                 {
  271.                     ObjectProperties[Properties.MyGameObject] = value;
  272.                 }
  273.                 else { throw new NotSupportedException("This particle has no Gameobject"); }
  274.             }
  275.         }
  276.  
  277.         public List<GameObject> ParticlePrefabs
  278.         {
  279.             get
  280.             {
  281.                 if (hasMyGameObject)
  282.                 {
  283.                     return (float)ObjectProperties[Properties.MyGameObject];
  284.                 }
  285.                 else { throw new NotSupportedException("This particle has no Gameobject"); }
  286.             }
  287.             set
  288.             {
  289.                 if (hasMyGameObject)
  290.                 {
  291.                     ObjectProperties[Properties.MyGameObject] = value;
  292.                 }
  293.                 else { throw new NotSupportedException("This particle has no Gameobject"); }
  294.             }
  295.         }
  296.  
  297.  
  298.     }
  299. }
Advertisement
Add Comment
Please, Sign In to add comment