コード例 #1
0
    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++;
    }
コード例 #2
0
    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);
    }
コード例 #3
0
    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);
    }
コード例 #4
0
    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;
    }
コード例 #5
0
 public void Impact(TrajectoryModData tmod)
 {
     trajectoryModifier = new TrajectoryModifier(this, tmod);
 }
コード例 #6
0
 public TrajectoryModData(Vector2 impact, float angularImpact, TrajectoryModData modData) : this(impact, angularImpact, modData.DragAddition, modData.MetaDrag, modData.Duration, modData.Additive)
 {
 }