//--------------------------------------------------------------------- // Constructor //--------------------------------------------------------------------- public Block(BlockType blockType) { m_BlockType = blockType; status = BlockStatus.NORMAL; questType = BlockQuestType.CLEAR_SIMPLE; match = MatchType.NONE; m_Breed = BlockBreed.NA; m_nDurability = 1; }
/* * Block의 종류(breed)를 변경한다. */ public void ChangeBlock(Block block, BlockBreed notAllowedBreed) { BlockBreed genBreed; while (true) { genBreed = (BlockBreed)UnityEngine.Random.Range(0, 6); //TODO 스테이지파일에서 Spawn 정책을 이용해야함 if (notAllowedBreed == genBreed) { continue; } break; } block.breed = genBreed; }
public Color GetBlockColor(BlockBreed breed) { return(blockColors[(int)breed]); }
/** * 지정된 위치에 배치할 수 있는 3매치되지 않는 블럭을 한다. */ Block GetShuffledBlock(int nRow, int nCol) { BlockBreed prevBreed = BlockBreed.NA; //처음 비교시에 종류를 저장 Block firstBlock = null; //리스트를 전부 처리하고 큐만 남은 경우에 중복 체크 위해 사용 (큐에서 꺼낸 첫번째 블럭) bool bUseQueue = true; //true : 큐에서 꺼냄, false : 리스트에서 꺼냄 while (true) { //1. Queue에서 블럭을 하나 꺼낸다. 첫번재 후보이다. BlockVectorKV blockInfo = NextBlock(bUseQueue); Block block = blockInfo.Key; //2. 리스트에서 블럭을 전부 처리한 경우 : 전체 루프(for 문 포함)에서 1회만 발생 if (block == null) { blockInfo = NextBlock(true); block = blockInfo.Key; } Debug.Assert(block != null, $"block can't be null : queue count -> {m_UnusedBlocks.Count}"); if (prevBreed == BlockBreed.NA) //첫비교시 종류 저장 { prevBreed = block.breed; } //3. 리스트를 모두 처리 한 경우 if (m_bListComplete) { if (firstBlock == null) { //3.1 전체 리스트를 처리하고, 처음으로 큐에서 꺼낸 경우 firstBlock = block; // 큐에서 꺼낸 첫번째 블럭 } else if (System.Object.ReferenceEquals(firstBlock, block)) { //3.2 처음 보았던 블럭을 다시 처리하는 경우, // 즉, 큐에 들어있는 모든 블럭이 조건에 맞지 않는 경우 (남은 블럭 중에 조건에 맞는게 없는 경우) m_Board.ChangeBlock(block, prevBreed); } } //4. 상하좌우 인접 블럭과 겹치는 개수를 계산한다 Vector2Int vtDup = CalcDuplications(nRow, nCol, block); //5. 2개 이상 매치되는 경우, 현재 위치에 해당 블럭이 올 수 없으므로 큐에 보관하고 다음 블럭 처리하도록 continue한다 if (vtDup.x > 2 || vtDup.y > 2) { m_UnusedBlocks.Enqueue(blockInfo); bUseQueue = m_bListComplete || !bUseQueue; continue; } //6. 블럭이 위치할 수 있는 경우, 찾은 위치로 Bock GameObject를 이동시킨다. block.vertDuplicate = vtDup.y; block.horzDuplicate = vtDup.x; if (block.blockObj != null) { float initX = m_Board.CalcInitX(Constants.BLOCK_ORG); float initY = m_Board.CalcInitY(Constants.BLOCK_ORG); block.Move(initX + nCol, initY + nRow); } //7. 찾은 블럭을 리턴한다. return(block); } }