private void Initialize(Vector2 bodySize, Vector2 bodyPosition, float density, World world, Color bodyColor, Color jointColor) { Body = BodyFactory.CreateBody(world, bodyPosition); Body.BodyType = BodyType.Dynamic; BodyFixture = FixtureFactory.CreateRectangle(bodySize.X, bodySize.Y, density, Vector2.Zero, Body); BodyFixture.UserData = this; BodySize = bodySize; BodyColor = bodyColor; JointColor = jointColor; World = world; Density = density; Joint = null; PartActuator = null; PartMotionSystem = MotionSystem.Actuator; CollidingSides = new bool[4]; for (int i = 0; i < 4; i++) CollidingSides[i] = false; Collisions = new List<Collision>(); ChildParts = new List<FenotipoCell>(); }
/* VERSIONE OBSOLETA DA AGGIORNARE /// <summary> /// Posiziona la parte vicino a quella a cui deve unirsi e crea il giunto. /// </summary> /// <param name="otherPart">Altra parte a cui unire questa</param> /// <param name="thisPartPosition">Posizione del centro del giunto rispetto al baricentro di questa parte</param> /// <param name="otherPartPosition">Posizione del centro del giunto rispetto al baricentro dell'altra parte</param> /// <param name="jointColor">Colore del giunto</param> /// <returns>false se thisPartPosizion è all'interno della parte, true altrimenti</returns> public bool Join(FParte otherPart, Vector2 thisPartPosition, Vector2 otherPartPosition, Color jointColor) { Body.Position = Utils.TranslateAndRotate((otherPartPosition - thisPartPosition), otherPart.Body.Position, otherPart.Body.Rotation); Body.Rotation = otherPart.Body.Rotation; Joint = JointFactory.CreateRevoluteJoint(World, otherPart.Body, this.Body, thisPartPosition); JointOffset = new Vector2(thisPartPosition.X, thisPartPosition.Y); Joint.MotorEnabled = true; Joint.MaxMotorTorque = Const.MaxMotorTorquePerAreaUnit * this.BodySize.X * this.BodySize.Y; //determina la dimensione del giunto in base alla posizione rispetto al centro del corpo e alla dimensione del corpo stesso if ((thisPartPosition.X > BodySize.X / 2) && (Math.Abs(thisPartPosition.Y) <= BodySize.Y / 2)) { JointRadius = thisPartPosition.X - BodySize.X / 2; ConnectionSide = Side.Right; } else if ((thisPartPosition.X < -BodySize.X / 2) && (Math.Abs(thisPartPosition.Y) <= BodySize.Y / 2)) { JointRadius = -thisPartPosition.X - BodySize.X / 2; ConnectionSide = Side.Left; } else if ((thisPartPosition.Y > BodySize.Y / 2) && (Math.Abs(thisPartPosition.X) <= BodySize.X / 2)) { JointRadius = thisPartPosition.Y - BodySize.Y / 2; ConnectionSide = Side.Bottom; } else if ((thisPartPosition.Y < -BodySize.Y / 2) && (Math.Abs(thisPartPosition.X) <= BodySize.X / 2)) { JointRadius = -thisPartPosition.Y - BodySize.Y / 2; ConnectionSide = Side.Top; } else return false; JointFixture = FixtureFactory.CreateCircle(JointRadius, Density, Body, JointOffset); if(JointColor != null) JointColor = jointColor; Joint.CollideConnected = true; //abilita la collisione dei due body connessi dal giunto PartActuator = new Actuator(this, otherPart, Const.MaxForcePerAreaUnit * BodyArea); return true; } */ /// <summary> /// Posiziona la parte vicino a quella a cui deve unirsi e crea il giunto. /// </summary> /// <param name="otherPart">Altra parte a cui unire questa</param> /// <param name="thisPartSidePosition">Posizione del punto di contatto del giunto con il bordo di questa parte rispetto al centro di questa parte</param> /// <param name="otherPartSidePosition">Posizione del punto di contatto del giunto con il bordo dell'altra parte rispetto al centro dell'altra parte</param> /// <param name="jointColor">Colore del giunto</param> /// <param name="jointRadius">Raggio del giunto</param> /// <returns>false se thisPartSidePosition non è sul bordo della parte, true altrimenti</returns> public bool Join(FenotipoCell otherPart, Vector2 thisPartSidePosition, Vector2 otherPartSidePosition, Color jointColor, float jointRadius) { Vector2 jointOffset; if (thisPartSidePosition.X == -(BodySize.X / 2)) { jointOffset = new Vector2(-jointRadius * 2, 0); ConnectionSide = Side.Left; } else if (thisPartSidePosition.X == (BodySize.X / 2)) { jointOffset = new Vector2(jointRadius * 2, 0); ConnectionSide = Side.Right; } else if (thisPartSidePosition.Y == -(BodySize.Y / 2)) { jointOffset = new Vector2(0, -jointRadius * 2); ConnectionSide = Side.Top; } else if (thisPartSidePosition.Y == (BodySize.Y / 2)) { jointOffset = new Vector2(0, jointRadius * 2); ConnectionSide = Side.Bottom; } else return false; Body.Position = Utils.TranslateAndRotate(otherPartSidePosition - thisPartSidePosition - jointOffset, otherPart.Body.Position, otherPart.Body.Rotation); Body.Rotation = otherPart.Body.Rotation; if (Joint != null) World.RemoveJoint(Joint); Joint = JointFactory.CreateRevoluteJoint(World, otherPart.Body, this.Body, thisPartSidePosition + jointOffset/2); Joint.MotorEnabled = true; Joint.MaxMotorTorque = Const.MaxMotorTorquePerAreaUnit * this.BodySize.X * this.BodySize.Y; JointRadius = jointRadius; JointFixture = FixtureFactory.CreateCircle(JointRadius, Density, Body, thisPartSidePosition + jointOffset/2); if (JointColor != null) JointColor = jointColor; JointOffset = thisPartSidePosition + jointOffset / 2; Joint.CollideConnected = true; PartActuator = new Actuator(this, otherPart, Const.MaxForcePerAreaUnit * BodyArea); otherPart.AddChild(this); return true; }