Esempio n. 1
0
    void Start()
    {
        colliderDictionary.Clear();
        gridDictionary.Clear();

        vertices  = new List <Vector3>();
        triangles = new List <int>();
        UVs       = new List <Vector2> ();

        vertices.Add(new Vector3(0.5f, -0.5f, 0));
        vertices.Add(new Vector3(0.5f, 0.5f, 0));
        vertices.Add(new Vector3(-0.5f, 0.5f, 0));
        vertices.Add(new Vector3(-0.5f, -0.5f, 0));

        int[] square = new int[4];
        for (int i = 0; i < 4; i++)
        {
            square [i] = i;
        }

        BoxCollider2D coll = gameObject.AddComponent <BoxCollider2D> ();
        OldModule     core = new OldModule(Vector2.zero, 1, square, this.gameObject, ref coll, pickup);

        core.baconNumber = 0;
        core.relations   = new OldModule[4];
        indexedOldModules.Add(core);
        core.index = 0;

        foreach (Vector2 uv in core.GetUV())
        {
            UVs.Add(uv);
        }

        colliderDictionary.Add(core.collider, core);
        gridDictionary.Add(core.gridLocation, core);

        for (int i = 0; i < 4; i++)
        {
            bounds [i] = core;
        }

        width  = 1;
        height = 1;
        centre = Vector2.zero;

        triangles.Add(2);
        triangles.Add(1);
        triangles.Add(0);

        triangles.Add(3);
        triangles.Add(2);
        triangles.Add(0);

        GenerateMesh();
    }
Esempio n. 2
0
    void AddOldModuleRelations(OldModule module)
    {
        module.relations = new OldModule[4];
        OldModule relative;

        if (gridDictionary.ContainsKey(module.gridLocation + Vector2.right))
        {
            relative              = gridDictionary [module.gridLocation + Vector2.right];
            module.relations[0]   = relative;
            relative.relations[2] = module;
            if (module.baconNumber == -1 || relative.baconNumber < module.baconNumber)
            {
                module.baconNumber = relative.baconNumber;
            }
        }
        if (gridDictionary.ContainsKey(module.gridLocation + Vector2.up))
        {
            relative              = gridDictionary [module.gridLocation + Vector2.up];
            module.relations[1]   = relative;
            relative.relations[3] = module;
            if (module.baconNumber == -1 || relative.baconNumber < module.baconNumber)
            {
                module.baconNumber = relative.baconNumber;
            }
        }
        if (gridDictionary.ContainsKey(module.gridLocation + Vector2.left))
        {
            relative              = gridDictionary [module.gridLocation + Vector2.left];
            module.relations[2]   = relative;
            relative.relations[0] = module;
            if (module.baconNumber == -1 || relative.baconNumber < module.baconNumber)
            {
                module.baconNumber = relative.baconNumber;
            }
        }
        if (gridDictionary.ContainsKey(module.gridLocation + Vector2.down))
        {
            relative              = gridDictionary [module.gridLocation + Vector2.down];
            module.relations[3]   = relative;
            relative.relations[1] = module;
            if (module.baconNumber == -1 || relative.baconNumber < module.baconNumber)
            {
                module.baconNumber = relative.baconNumber;
            }
        }
        module.baconNumber++;
        foreach (OldModule neighbour in module.relations)
        {
            if (neighbour != null && neighbour.baconNumber > module.baconNumber + 1)
            {
                neighbour.UpdateBaconNumber(module.baconNumber + 1);
            }
        }
    }
Esempio n. 3
0
 public int[] Remove(OldModule first, bool last)
 {
     for (int i = 0; i < 4; i++)
     {
         OldModule neighbour = relations[i];
         if (neighbour != null)
         {
             neighbour.RemoveRelation(Conversion.FlipDirection(i), last);
         }
     }
     ReleasePickup(first);
     return(vertReference);
 }
Esempio n. 4
0
        public void ReleasePickup(OldModule first)
        {
            //GameObject newPickup = Instantiate (pickup);
            CtrlDrag script = pickup.GetComponent <CtrlDrag> ();

            pickup.transform.position         = parentObject.transform.TransformPoint(new Vector3(gridLocation [0], gridLocation [1], 0));
            pickup.transform.localEulerAngles = new Vector3(0, 0, parentObject.transform.eulerAngles.z + gridRotation * 90 - 90);
            pickup.SetActive(true);
            if (first == this)
            {
                script.PickUp();
            }
            else
            {
                float force = Mathf.Sqrt(Vector2.SqrMagnitude((gridLocation - first.gridLocation) * 20));
                float angle = Conversion.DegToRad(pickup.transform.localEulerAngles.z + 90);
                pickup.GetComponent <Rigidbody2D> ().AddForce(new Vector2(Mathf.Cos(angle), Mathf.Sin(angle) * -1) * force);
            }
        }
Esempio n. 5
0
    void AddOldModule(object[] package)
    {
        BoxCollider2D rootCollider = (BoxCollider2D)package [0];

        int[]   rootVerts    = colliderDictionary [rootCollider].vertReference;
        Vector2 rootLoctaion = colliderDictionary [rootCollider].gridLocation;
        int     direction    = (int)package [1];
        Vector2 transform    = Vector2.right;
        Vector2 gridLocation = Vector2.zero;
        bool    outOfBounds  = false;
        int     se           = 0;
        int     ne           = 0;
        int     nw           = 0;
        int     sw           = 0;

        switch (direction)
        {
        case 0:
            vertices.Add(vertices [rootVerts [0]] + Vector3.right);
            se = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [1]] + Vector3.right);
            ne = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [1]]);
            nw = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [0]]);
            sw           = vertices.Count - 1;
            gridLocation = rootLoctaion + transform;
            if (bounds [0].gridLocation [0] < gridLocation [0])
            {
                outOfBounds = true;
            }
            break;

        case 1:
            transform = Vector2.up;
            vertices.Add(vertices [rootVerts [1]]);
            se = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [1]] + Vector3.up);
            ne = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [2]] + Vector3.up);
            nw = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [2]]);
            sw           = vertices.Count - 1;
            gridLocation = rootLoctaion + transform;
            if (bounds [1].gridLocation [1] < gridLocation [1])
            {
                outOfBounds = true;
            }
            break;

        case 2:
            transform = Vector2.left;
            vertices.Add(vertices [rootVerts [3]]);
            se = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [2]]);
            ne = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [2]] + Vector3.left);
            nw = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [3]] + Vector3.left);
            sw           = vertices.Count - 1;
            gridLocation = rootLoctaion + transform;
            if (bounds [2].gridLocation [0] > gridLocation [0])
            {
                outOfBounds = true;
            }
            break;

        case 3:
            transform = Vector2.down;
            vertices.Add(vertices [rootVerts [0]] + Vector3.down);
            se = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [0]]);
            ne = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [3]]);
            nw = vertices.Count - 1;
            vertices.Add(vertices [rootVerts [3]] + Vector3.down);
            sw           = vertices.Count - 1;
            gridLocation = rootLoctaion + transform;
            if (bounds [3].gridLocation [1] > gridLocation [1])
            {
                outOfBounds = true;
            }
            break;
        }
        int[] square = new int[4];
        square [0] = se;
        square [1] = ne;
        square [2] = nw;
        square [3] = sw;

        BoxCollider2D coll   = gameObject.AddComponent <BoxCollider2D> ();
        OldModule     module = new OldModule(rootLoctaion + transform, direction, square, this.gameObject, ref coll, (GameObject)package[2]);

        indexedOldModules.Add(module);
        module.index = indexedOldModules.IndexOf(module);
        AddOldModuleRelations(module);

        foreach (Vector2 uv in module.GetUV())
        {
            UVs.Add(uv);
        }



        colliderDictionary.Add(module.collider, module);
        gridDictionary.Add(module.gridLocation, module);

        if (outOfBounds)
        {
            bounds [direction] = module;
        }

        triangles.Add(nw);
        triangles.Add(ne);
        triangles.Add(se);

        triangles.Add(nw);
        triangles.Add(se);
        triangles.Add(sw);

        GenerateMesh();
    }
Esempio n. 6
0
    /*void AddOldModuleCornerRelations(OldModule module)
     * {
     *      module.cornerRelations = new OldModule[4];
     *      if (gridDictionary.ContainsKey (module.gridLocation + new Vector2 (1, -1)))
     *      {module.cornerRelations [0] = gridDictionary [module.gridLocation + new Vector2 (1, -1)];}
     *      if (gridDictionary.ContainsKey (module.gridLocation + new Vector2 (1, 1)))
     *      {module.cornerRelations [1] = gridDictionary [module.gridLocation + new Vector2 (1, 1)];}
     *      if (gridDictionary.ContainsKey (module.gridLocation + new Vector2 (-1, 1)))
     *      {module.cornerRelations [2] = gridDictionary [module.gridLocation + new Vector2 (-1, 1)];}
     *      if (gridDictionary.ContainsKey (module.gridLocation + new Vector2 (-1, -1)))
     *      {module.cornerRelations [3] = gridDictionary [module.gridLocation + new Vector2 (-1, -1)];}
     *      /*for (int i = 0; i < 4; i++)
     *              {
     *                      if (relations [i] != null)
     *                      {
     *                              OldModule neighbour = relations [i];
     *                              if(neighbour.relations[Conversion.RoundInt(i-1)] != null)
     *                                      {cornerRelations [i] = neighbour.relations [Conversion.RoundInt (i - 1)];}
     *                              if(neighbour.relations[Conversion.RoundInt(i+1)] != null)
     *                                      {cornerRelations[i + 1] = neighbour.relations [Conversion.RoundInt (i + 1)];}
     *                      }
     *              }
     * }*/
    void RemoveOldModule(OldModule module)
    {
        OldModule         first    = module;
        Queue <OldModule> toRemove = new Queue <OldModule> ();

        int[,] map = new int[width, height];
        int     baconNumber = module.baconNumber;
        Vector2 mapLoc      = module.gridLocation + centre;

        map [(int)mapLoc[0], (int)mapLoc[1]] = 1;
        toRemove.Enqueue(module);
        foreach (OldModule baseRelation in module.relations)
        {
            if (baseRelation != null && baseRelation.baconNumber > baconNumber)
            {
                List <OldModule>  foundOldModules = new List <OldModule> ();
                List <Vector2>    foundLocations  = new List <Vector2> ();
                Queue <OldModule> queue           = new Queue <OldModule> ();

                mapLoc = baseRelation.gridLocation + centre;
                map [(int)mapLoc[0], (int)mapLoc[1]] = 1;
                foundOldModules.Add(baseRelation);
                foundLocations.Add(mapLoc);
                queue.Enqueue(baseRelation);

                while (queue.Count > 0)
                {
                    OldModule current = queue.Dequeue();
                    foreach (OldModule relation in current.relations)
                    {
                        if (relation != null)
                        {
                            mapLoc = relation.gridLocation + centre;
                            int flag = map[(int)mapLoc[0], (int)mapLoc[1]];
                            if (flag != 1)
                            {
                                if (flag == 2)
                                {
                                    foreach (Vector2 loc in foundLocations)
                                    {
                                        map [(int)loc[0], (int)loc[1]] = 2;
                                    }
                                    queue.Clear();
                                    foundOldModules.Clear();
                                    break;
                                }
                                foundLocations.Add(mapLoc);
                                if (relation.baconNumber <= baconNumber)
                                {
                                    foreach (Vector2 loc in foundLocations)
                                    {
                                        map [(int)loc[0], (int)loc[1]] = 2;
                                    }
                                    queue.Clear();
                                    foundOldModules.Clear();
                                    break;
                                }
                                map [(int)mapLoc [0], (int)mapLoc [1]] = 1;
                                foundOldModules.Add(relation);
                                queue.Enqueue(relation);
                            }
                        }
                    }
                }
                foreach (OldModule foundOldModule in foundOldModules)
                {
                    toRemove.Enqueue(foundOldModule);
                }
            }
        }
        while (toRemove.Count > 0)
        {
            OldModule removedOldModule = toRemove.Dequeue();
            bool      last             = toRemove.Count == 1;
            //AddOldModuleCornerRelations (removedOldModule);

            triangles.RemoveRange(removedOldModule.index * 6, 6);
            RemoveVertices(removedOldModule.Remove(first, last));
            RemoveIndex(removedOldModule.index);
            gridDictionary.Remove(removedOldModule.gridLocation);
            colliderDictionary.Remove(removedOldModule.collider);
            Destroy(removedOldModule.collider);
        }
        GenerateMesh();
    }