public Block.PATTERN selectBlockColor() { Block.PATTERN color = Block.PATTERN.FIRST; // 이번 레벨의 레벨 데이터를 가져온다. LevelData level_data = this.level_control.getCurrentLevelData(); float rand = Random.Range(0.0f, 1.0f); // 0.0~1.0 사이의 난수. float sum = 0.0f; // 출현 확률의 합계. int i = 0; // 블록의 종류 전체를 처리하는 루프. for (i = 0; i < level_data.patternPercent.Length - 1; i++) { if (level_data.patternPercent[i] == 0.0f) { continue; // 출현 확률이 0이면 루프의 처음으로 점프. } sum += level_data.patternPercent[i]; // 출현 확률을 더한다. if (rand < sum) { // 합계가 난숫값을 웃돌면. break; // 루프를 빠져나온다. } } color = (Block.PATTERN)i; // i번째 색을 반환한다. return(color); }
// 낙하했을 때 위아래 블록을 교체한다. public void fallBlock(BlockControl block0, Block.DIR4 dir, BlockControl block1) { // block0과 block1의 색, 크기, 사라질 때까지 걸리는 시간, 표시, 비표시, 상태 // 를 기록. Block.PATTERN color0 = block0.pattern; Block.PATTERN color1 = block1.pattern; Vector3 scale0 = block0.transform.localScale; Vector3 scale1 = block1.transform.localScale; float vanish_timer0 = block0.vanish_timer; float vanish_timer1 = block1.vanish_timer; bool visible0 = block0.isVisible(); bool visible1 = block1.isVisible(); Block.STEP step0 = block0.step; Block.STEP step1 = block1.step; // block0과 block1의 각종 속성을 교체한다. block0.setColor(color1); block1.setColor(color0); block0.transform.localScale = scale1; block1.transform.localScale = scale0; block0.vanish_timer = vanish_timer1; block1.vanish_timer = vanish_timer0; block0.setVisible(visible1); block1.setVisible(visible0); block0.step = step1; block1.step = step0; block0.beginFall(block1); }
public void swapBlock(BlockControl block0, Block.DIR4 dir, BlockControl block1) { // 각각의 블록 패턴을 기억해 둔다. Block.PATTERN color0 = block0.pattern; Block.PATTERN color1 = block1.pattern; // 각각의 블록 숫자를 기억해 둔다. Block.NUMBER number0 = block0.num; Block.NUMBER number1 = block1.num; // 각각의 블록의 확대율을 기억해 둔다. Vector3 scale0 = block0.transform.localScale; Vector3 scale1 = block1.transform.localScale; // 각각의 블록의 '사라지는 시간'을 기억해 둔다. float vanish_timer0 = block0.vanish_timer; float vanish_timer1 = block1.vanish_timer; // 각각의 블록의 이동할 곳을 구한다. Vector3 offset0 = BlockRoot.getDirVector(dir); Vector3 offset1 = BlockRoot.getDirVector(BlockRoot.getOppositDir(dir)); // 패턴을 교체한다. block0.setColor(color1); block1.setColor(color0); // 숫자를 교체한다. block0.setNumber(number1); block1.setNumber(number0); // 확대율을 교체한다. block0.transform.localScale = scale1; block1.transform.localScale = scale0; // '사라지는 시간'을 교체한다. block0.vanish_timer = vanish_timer1; block1.vanish_timer = vanish_timer0; block0.beginSlide(offset0); // 원래 블록 이동을 시작한다. block1.beginSlide(offset1); // 이동할 위치의 블록 이동을 시작한다. }
// 인수 color의 색으로 블록을 칠한다. public void setColor(Block.PATTERN _pattern) { this.pattern = _pattern; Sprite pattern_value; switch (this.pattern) { // 칠할 색에 따라서 갈라진다. default: case Block.PATTERN.SPADE: pattern_value = block_root.Spade; break; case Block.PATTERN.DIAMOND: pattern_value = block_root.Diamond; break; case Block.PATTERN.HEART: pattern_value = block_root.Heart; break; case Block.PATTERN.CLOVER: pattern_value = block_root.Clover; break; } // 이 게임 오브젝트의 머티리얼 색상을 변경한다. SpriteRenderer cardPattern = GetComponentInChildren <SpriteRenderer>(); cardPattern.sprite = pattern_value; }
// 블록을 만들어 내고 가로 9칸, 세로 9칸에 배치한다. public void initialSetUp() { // 그리드의 크기를 9×9로 한다. this.blocks = new BlockControl[Block.BLOCK_NUM_X, Block.BLOCK_NUM_Y]; // 블록의 색 번호. int color_index = 0; Block.PATTERN color = Block.PATTERN.FIRST; Block.NUMBER number = Block.NUMBER.FIRST; for (int y = 0; y < Block.BLOCK_NUM_Y; y++) { // 처음~마지막행 for (int x = 0; x < Block.BLOCK_NUM_X; x++) { // 왼쪽~오른쪽 // BlockPrefab의 인스턴스를 씬에 만든다. GameObject game_object = Instantiate(this.BlockPrefab) as GameObject; // 위에서 만든 블록의 BlockControl 클래스를 가져온다. BlockControl block = game_object.GetComponent <BlockControl>(); // 블록을 그리드에 저장한다. this.blocks[x, y] = block; // 블록의 위치 정보(그리드 좌표)를 설정한다. block.i_pos.x = x; block.i_pos.y = y; // 각 BlockControl이 연계할 GameRoot는 자신이라고 설정한다. block.block_root = this; // 그리드 좌표를 실제 위치(씬의 좌표)로 변환한다. Vector3 position = BlockRoot.calcBlockPosition(block.i_pos); // 씬의 블록 위치를 이동한다. block.transform.position = position; // 블록의 색을 변경한다. //block.setColor((Block.COLOR)color_index); // 현재 출현 확률을 바탕으로 색을 결정한다. color = this.selectBlockColor(); block.setColor(color); // 현재 출현 확률을 바탕으로 색을 결정한다. //number = this.selectBlockNum(); //block.setNumber(number); //수정필요 // 블록의 이름을 설정(후술)한다. 나중에 블록 정보 확인때 필요. block.name = "block(" + block.i_pos.x.ToString() + "," + block.i_pos.y.ToString() + ")"; // 전체 색 중에서 임의로 하나의 색을 선택한다. color_index = Random.Range(0, (int)Block.PATTERN.NORMAL_COLOR_NUM); } } }
// 색이 바꿔 낙하 상태로 하고 지정한 위치에 재배치한다. public void beginRespawn(int start_ipos_y) { // 지정 위치까지 y좌표를 이동. this.position_offset.y = (float)(start_ipos_y - this.i_pos.y) * Block.COLLISION_SIZE; this.next_step = Block.STEP.FALL; //int color_index = //Random.Range((int)Block.COLOR.FIRST, (int)Block.COLOR.LAST + 1); //this.setColor((Block.COLOR)color_index); // 현재 레벨의 출현 확률을 바탕으로 블록의 색을 결정한다. Block.PATTERN color = this.block_root.selectBlockColor(); this.setColor(color); Block.NUMBER number = this.block_root.selectBlockNum(); this.setNumber(number); }