Пример #1
0
    public void SetupFragments(LevelConfig levelConfig)
    {
        rows    = levelConfig.rows;
        columns = levelConfig.columns;
        source  = EntryPoint.instance.loadAsset <Sprite>("sprites", levelConfig.id + ".jpg") as Sprite;
        Texture2D texture = source.texture;

        fragments = new Fragment[rows * columns];
        // 切成 1 : heightUnit 的矩形
        pixelsPerUnitX = (float)texture.width / (float)columns;
        pixelsPerUnitY = (float)texture.height / (float)rows;
        float height = pixelsPerUnitY / pixelsPerUnitX;

        for (int i = 0; i < fragments.Length; i++)
        {
            float         x        = Random.Range(minX, maxX);
            float         y        = Random.Range(minY, maxY);
            FragmentGroup group    = new FragmentGroup(this);
            GameObject    instance = Object.Instantiate(fragmentPrefab, new Vector3(x, y, 0f), Quaternion.identity, fragmentsRoot) as GameObject;
            Fragment      fragment = instance.GetComponent <Fragment> ();
            if (fragment == null)
            {
                fragment = instance.AddComponent <Fragment>();
            }
            group.AddMember(fragment);
            fragment.index  = i;
            fragment.row    = i / columns;
            fragment.column = i % columns;
            fragment.group  = group;
            Rect rect = new Rect(fragment.column * pixelsPerUnitX, (rows - fragment.row - 1) * pixelsPerUnitY, pixelsPerUnitX, pixelsPerUnitY);
            fragment.spriteRenderer.sprite = Sprite.Create(texture,
                                                           rect,
                                                           new Vector2(0.5f, 0.5f),
                                                           pixelsPerUnitX);
            fragment.GetComponent <BoxCollider2D>().size = new Vector3(1.0f, height, 1.0f);
            fragment.fragmentManager = this;
            fragments [i]            = fragment;
            group.SetSortingOrder(i);
            groups.Add(group);
        }
        CompressSortingOrderRange();
    }
Пример #2
0
 public void CheckAndMergeGroup(FragmentGroup group)
 {
     for (int row = 0; row < rows; row++)
     {
         for (int col = 0; col < columns; col++)
         {
             int      currentIndex = CalculateIndex(row, col);
             int      rightIndex   = CalculateIndex(row, col + 1);
             Fragment current      = fragments [currentIndex];
             if (rightIndex != -1)
             {
                 Fragment right = fragments [rightIndex];
                 if (current.group != right.group && (current.group == group || right.group == group))
                 {
                     Vector3 offset = right.transform.position - current.transform.position;
                     if (CheckDistanceAndAngle(offset, 1.0f, Vector2.right))
                     {
                         if (group == right.group)
                         {
                             groups.Remove(current.group);
                             group.Merge(current.group);
                         }
                         else
                         {
                             groups.Remove(right.group);
                             group.Merge(right.group);
                         }
                         group.Align();
                         SoundManager.instance.PlayMerge();
                         CheckWin();
                         return;
                     }
                 }
             }
             int downIndex = CalculateIndex(row + 1, col);
             if (downIndex != -1)
             {
                 Fragment down = fragments [downIndex];
                 if (current.group != down.group && (current.group == group || down.group == group))
                 {
                     Vector3 offset = down.transform.position - current.transform.position;
                     if (CheckDistanceAndAngle(offset, pixelsPerUnitY / pixelsPerUnitX, Vector2.down))
                     {
                         if (group == down.group)
                         {
                             groups.Remove(current.group);
                             group.Merge(current.group);
                         }
                         else
                         {
                             groups.Remove(down.group);
                             group.Merge(down.group);
                         }
                         group.Align();
                         SoundManager.instance.PlayMerge();
                         CheckWin();
                         return;
                     }
                 }
             }
         }
     }
 }
Пример #3
0
 public Fragment(uint type, FragmentGroup group)
     : this(type, (ushort)group)
 {
 }