示例#1
0
 private void Awake()
 {
     rb      = GetComponent <Rigidbody2D>();
     magData = Resources.Load <MagnetData>("ScriptableObjects/MagnetData");
     Assert.IsNotNull(transform.Find("Magnet"), "Magnet not attached");
     mag = transform.Find("Magnet").GetComponent <Magnetizable>();
     StartCoroutine(BecomeInvincibleForSeconds(2f));
 }
示例#2
0
        public void setData(MagnetData e)
        {
            bInitialized = false;
            data         = e;

            getModifiedData();
            updateEnableStates();
            bInitialized = true;
        }
示例#3
0
 //释放对象,清理内存
 public void Clear()
 {
     _dash       = null;
     _double     = null;
     _magnet     = null;
     _protect    = null;
     _superMan   = null;
     _startDash  = null;
     _deadDash   = null;
     _colliction = null;
 }
示例#4
0
    // Grabs MagnetData (ScriptableObject) and parents RigidBody2D (Required)
    private void Awake()
    {
        magnetData = Resources.Load <MagnetData>("ScriptableObjects/MagnetData");
        magnetData.nonMagnetizedList.Add(this);
        rigidBody = transform.parent.GetComponent <Rigidbody2D>();
        Assert.IsNotNull(rigidBody, "No RigidBody2D component was found on parent object.");

        Assert.IsTrue(gameObject.transform.childCount > 0);
        posMag = gameObject.transform.GetChild(0);
        if (gameObject.transform.childCount > 1) // Player has no negative magnet
        {
            negMag = gameObject.transform.GetChild(1);
        }
    }
示例#5
0
        private void addMagnetNodeToTree(int emitterIndex, int magnetIndex)
        {
            if (emitterIndex < 0 || emitterIndex >= mEffect.Emitters.Count)
            {
                return;
            }

            if (magnetIndex < 0 || magnetIndex >= mEffect.Emitters[emitterIndex].Magnets.Count)
            {
                return;
            }

            ParticleEmitter emitter     = mEffect.Emitters[emitterIndex];
            MagnetData      magnet      = mEffect.Emitters[emitterIndex].Magnets[magnetIndex];
            TreeNode        rootNode    = treeView1.Nodes[0];
            TreeNode        emitterNode = rootNode.Nodes[emitterIndex];

            addNode(emitterNode, magnet.Name, ParticleEditorPageEnum.eMagnet, 11);

            emitterNode.Expand();
        }
示例#6
0
        void PasteOnSelectedMagnet()
        {
            TreeNode node = treeView1.SelectedNode;

            if (node == null)
            {
                return;
            }

            if ((ParticleEditorPageEnum)node.Tag != ParticleEditorPageEnum.eMagnet)
            {
                return;
            }

            if ((ParticleEditorPageEnum)node.Parent.Tag != ParticleEditorPageEnum.eEmitter)
            {
                return;
            }

            int emitterIndex = node.Parent.Index;

            if (emitterIndex < 0 || emitterIndex >= mEffect.Emitters.Count)
            {
                return;
            }

            int magnetIndex = node.Index - (int)ParticleEditorPageEnum.eEmitterPropertyTotal;

            if (magnetIndex < 0 || magnetIndex >= mEffect.Emitters[emitterIndex].Magnets.Count)
            {
                return;
            }

            MagnetData copiedNode = s_MagnetCopy.clone();

            //copiedNode.Name += "_Copy";
            mEffect.Emitters[emitterIndex].addMagnetAt(magnetIndex, copiedNode);
        }
示例#7
0
        void CopySelectedMagnet()
        {
            TreeNode node = treeView1.SelectedNode;

            if (node == null)
            {
                return;
            }

            if ((ParticleEditorPageEnum)node.Tag != ParticleEditorPageEnum.eMagnet)
            {
                return;
            }

            if ((ParticleEditorPageEnum)node.Parent.Tag != ParticleEditorPageEnum.eEmitter)
            {
                return;
            }

            int emitterIndex = node.Parent.Index;

            if (emitterIndex < 0 || emitterIndex >= mEffect.Emitters.Count)
            {
                return;
            }

            int magnetIndex = node.Index - (int)ParticleEditorPageEnum.eEmitterPropertyTotal;

            if (magnetIndex < 0 || magnetIndex >= mEffect.Emitters[emitterIndex].Magnets.Count)
            {
                return;
            }

            // clear copy
            s_MagnetCopy = null;
            s_MagnetCopy = mEffect.Emitters[emitterIndex].Magnets[magnetIndex].clone();
        }
示例#8
0
 void EnumerateMagnets()
 {
     numMagnets = 0;
     if (Parent == null)
     {
         return;
     }
     foreach (Node node in Parent.Nodes)
     {
         ParticlesMagnet magnet = node as ParticlesMagnet;
         if (magnet != null)
         {
             if (numMagnets >= MaxMagnets)
             {
                 break;
             }
             Matrix32 transform   = magnet.CalcLocalToParentTransform();
             Widget   basicWidget = GetBasicWidget();
             if (basicWidget != null)
             {
                 for (Node n = Parent; n != basicWidget; n = n.Parent)
                 {
                     if (n.AsWidget != null)
                     {
                         transform *= n.AsWidget.CalcLocalToParentTransform();
                     }
                 }
             }
             magnets[numMagnets++] = new MagnetData {
                 Magnet = magnet,
                 PrecalcTransitionMatrix    = transform.CalcInversed(),
                 PrecalcInvTransitionMatrix = transform
             };
         }
     }
 }
示例#9
0
        void ApplyMagnetToParticle(Particle p, MagnetData magnetData, float delta)
        {
            ParticlesMagnet magnet         = magnetData.Magnet;
            Vector2         targetPosition = p.RegularPosition;

            targetPosition = magnetData.PrecalcTransitionMatrix.TransformVector(targetPosition);
            switch (magnet.Shape)
            {
            case EmitterShape.Area:
                // Looking for point of magnet's edge, in the direction of particle is moving.
                if (targetPosition.X > 0 && targetPosition.X < magnet.Size.X &&
                    targetPosition.X > 0 && targetPosition.Y < magnet.Size.Y)
                {
                    // Particle is got inside magnet, move it outside.
                    float d0 = targetPosition.X;
                    float d1 = targetPosition.Y;
                    float d2 = magnet.Size.X - targetPosition.X;
                    float d3 = magnet.Size.Y - targetPosition.Y;
                    if (d0 < d1 && d0 < d2 && d0 < d3)
                    {
                        targetPosition.X = 0;
                    }
                    else if (d1 < d0 && d1 < d2 && d1 < d3)
                    {
                        targetPosition.Y = 0;
                    }
                    else if (d2 < d0 && d2 < d1 && d2 < d3)
                    {
                        targetPosition.X = magnet.Size.X;
                    }
                    else
                    {
                        targetPosition.Y = magnet.Size.Y;
                    }
                }
                else
                {
                    targetPosition.X = Mathf.Clamp(targetPosition.X, 0, magnet.Size.X);
                    targetPosition.Y = Mathf.Clamp(targetPosition.Y, 0, magnet.Size.Y);
                }
                break;

            case EmitterShape.Ellipse:
                if (Math.Abs(magnet.Size.Y) > 1e-5)
                {
                    Vector2 center = 0.5f * magnet.Size;
                    float   k      = magnet.Size.X / magnet.Size.Y;
                    targetPosition   -= center;
                    targetPosition.Y *= k;
                    targetPosition    = targetPosition.Normalized;
                    targetPosition   *= magnet.Size.X * 0.5f;
                    targetPosition.Y /= k;
                    targetPosition   += center;
                }
                else
                {
                    targetPosition = 0.5f * magnet.Size;
                }
                break;

            case EmitterShape.Line:
                targetPosition.Y = 0.5f * magnet.Size.Y;
                if (targetPosition.X < 0.0f)
                {
                    targetPosition.X = 0.0f;
                }
                else if (targetPosition.X > magnet.Size.X)
                {
                    targetPosition.X = magnet.Size.X;
                }
                break;

            case EmitterShape.Point:
                targetPosition = 0.5f * magnet.Size;
                break;
            }
            targetPosition = magnetData.PrecalcInvTransitionMatrix.TransformVector(targetPosition);

            Vector2 direction       = targetPosition - p.RegularPosition;
            float   squaredDistance = direction.SqrLength;

            direction = direction.Normalized;

            float magnetStrength = magnet.Strength;

            if (magnet.Attenuation > 0.0001f)
            {
                magnetStrength /= (float)Math.Pow(squaredDistance, magnet.Attenuation * 0.5f);
            }

            float t = magnetStrength * p.MagnetAmountCurrent * delta;

            if (t * t > squaredDistance)
            {
                t = (float)Math.Sqrt(squaredDistance);
            }
            p.RegularPosition += direction * t;
        }