public void ThrowWad() { Wad wad = EntityFactory.Instance.Create <Wad>(); wad.FacingRight = true; wad.GetComponent <Rigidbody2D>().MovePosition(transform.position); wad.gameObject.layer = LayerMask.NameToLayer(COLLECT_LAYER); TrajectoryModData throwTrajectory = new TrajectoryModData(GetImpactFromGradient(), GetAngularImpactFromGradient(), trajectory); wad.Impact(throwTrajectory); NumWadsSpawned++; }
public virtual bool ResolveBounce(Collision2D collision) { if (IgnoreBounce) { return(false); } //10 is arbitrary value ContactPoint2D[] contacts = new ContactPoint2D[10]; int numContacts = collision.GetContacts(contacts); if (numContacts > 0) { bool bounce = false; TrajectoryModData bounceData = new TrajectoryModData(); if (contacts[0].normalImpulse > strongNormalImpulseThreshold) { bounceData = strongBounceData; bounce = true; } else if (contacts[0].normalImpulse > weakNormalImpulseThreshold) { bounceData = weakBounceData; bounce = true; } if (bounce) { ResetDrag(); //only if relative velocity is negative i.e. we're moving towards the object //velocity before collision Vector2 incomingVel = collision.otherCollider.gameObject == gameObject ? -contacts[0].relativeVelocity : contacts[0].relativeVelocity; Vector2 dir = incomingVel.normalized; Vector2 norm = contacts[0].normal; Vector2 outputDir = (dir - 2.0f * (Vector2.Dot(dir, norm)) * norm).normalized; Vector2 bounceImpact = contacts[0].normalImpulse * outputDir * bounceData.Impact; Impact(new TrajectoryModData(bounceImpact, bounceData)); } return(bounce); } return(false); }
public void ThrowPlayer() { Player player = EntityFactory.Instance.Create <Player>(); player.PlayerId = ++numSpawned; //wad.GetComponent<Rigidbody2D>().MovePosition(transform.position); player.transform.position = transform.position; player.GetComponent <Rigidbody2D>().constraints = RigidbodyConstraints2D.None; player.FacingRight = true; player.gameObject.layer = LayerMask.NameToLayer(COLLECT_LAYER); TrajectoryModData throwTrajectory = new TrajectoryModData(GetImpactFromGradient() + new Vector2(-5.0f, 20.0f), GetAngularImpactFromGradient(), trajectory); player.Impact(throwTrajectory); }
public TrajectoryModifier(Entity entity, TrajectoryModData tmod) { impact = tmod.Impact; DragAddition = tmod.DragAddition; MetaDrag = tmod.MetaDrag; duration = tmod.Duration; //need entity's base drag entity.ResetDrag(); /* set the entity's initial velocity to the impact */ entity.Velocity = tmod.Additive ? entity.Velocity + impact : impact; entity.AngularVelocity += tmod.AngularImpact; originalDrag = entity.Drag; entity.Drag = tmod.DragAddition; storedDrag = tmod.DragAddition; }
public void Impact(TrajectoryModData tmod) { trajectoryModifier = new TrajectoryModifier(this, tmod); }
public TrajectoryModData(Vector2 impact, float angularImpact, TrajectoryModData modData) : this(impact, angularImpact, modData.DragAddition, modData.MetaDrag, modData.Duration, modData.Additive) { }