Unityでパズルゲーム2

ayumegu(プログラマー)
よろしくお願いします。

昨日の記事からちょっといろいろいろやってみたくなってパズルの種類を簡単に2つ追加してみました。

ねこの画像は引き続きこちらから借りていますことらのイラスト工房

操作説明とサンプル

WebPlayerでビルドしたものです。
スマホ用なので、本来は画面の両端は表示されないはずです・・・
つくったもの

  • つむつ○: 前回の記事のパズルです
    同じ種類の猫を3つ以上つなげると消えるだけ
  • ぽこぱ○: こちらもラインの某ゲームのパズル基本部分。3つ以上つなげると消えます
  • おっさんま○: おっさんま○というゲームが気に入ったのでそのアプリの基本部分
    同じ色のドロップを数字の数だけ選択すると消えます。ドラッグじゃなくてタップ(クリック)なので注意

あきたボタンでタイトルに戻れます

ぽこぱ○

普通のパズルと違い、はちの姿にパズルが並んでいるところがポイント
ずらすのは簡単で、

1
if(x % 2 == 0) posY -= 0.5;

こんな感じでy座標をずらせばOK。
線を引けるかどうかのチェックは、配列からチェックするとめんどくさかったので、
2つのオブジェクトの距離が一定以下なら隣り合っているという形式にしてしまいました。
消えると落ちてくる処理などはまえに書いたパズド○みたいなやつとアルゴリズムはほぼ一緒なのでソースは割愛

おっさんま○

おっさん要素もなにもないシュールなものですね。
基本的な機能しかないので、説明することも、特筆することもありません
本家のアプリは三角形、四角形とかで線が引かれたりするのですが、そこの部分どうやったら再現できるかなと考え中でありまする。

ソース汚くてもいいならどうぞ パズルの実装部分です

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
var DROP_COL = 7;
var DROP_ROW = 6;

var countDownObj:GameObject;
var dropList:Array;
var gameStatus:int;     // 0 wait 1:play
var clickStartObject:GameObject;
var removeObjectList:Array;
var lineObject:GameObject;

var redCount:int;
var greenCount:int;
var blueCount:int;
var yellowCount:int;
var dropFlg:boolean;

function Start () {
  Init();
}

function Update () {
  if(gameStatus == 1){
      if(Input.GetMouseButtonDown(0)){
          if(clickStartObject == null){
              removeObjectList = new Array();

              var hit:RaycastHit2D =Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
              if (hit.collider != null) {
                  if(hit.collider.gameObject.name.IndexOf("Drop") != -1){
                      clickStartObject = hit.collider.gameObject;
                      removeObjectList.push(clickStartObject);
                      var dropTexture:tk2dSprite = clickStartObject.GetComponent(tk2dSprite);
                      dropTexture.color.a = 0.5;
                      
                  }
              }
          }else{
              hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
              if (hit.collider != null) {
                  if(hit.collider.gameObject.name == clickStartObject.name){
                  
                      var idExistNo:int = -1;
                      for(var i:int = 0; i < removeObjectList.length; i++){
                          var obj:GameObject = removeObjectList[i];
                          if(obj == hit.collider.gameObject){
                              idExistNo = i;
                          }
                      }
                      
                      if(idExistNo == -1){
                          dropTexture = hit.collider.gameObject.GetComponent(tk2dSprite);
                          dropTexture.color.a = 0.5;
                          
                          removeObjectList.push(hit.collider.gameObject);
                      }else{
                          for(i = idExistNo + 1; i < removeObjectList.length; i++){
                              obj = removeObjectList[i];
                              obj.GetComponent(tk2dSprite).color.a = 1;
                          }
                          removeObjectList.splice(idExistNo + 1, removeObjectList.length - idExistNo - 1);
                      }
                      var dropObject:Drop2Object = clickStartObject.GetComponent(Drop2Object);
                      if(removeObjectList.length == dropObject.count){
                          for(i = 0; i < removeObjectList.length; i++){
                              obj = removeObjectList[i];
                              var removeObj:Drop2Object = obj.GetComponent(Drop2Object);
                              dropList[removeObj.posX + removeObj.posY * DROP_COL] = null;
                              Destroy(obj);
                              clickStartObject = null;
                          }
                          Drop();
                      }
                              
              
                  }else{
                      for(i = 0; i < removeObjectList.length; i++){
                          obj = removeObjectList[i];
                          dropTexture = obj.GetComponent(tk2dSprite);
                          dropTexture.color.a = 1.0;
                      }
                      clickStartObject = null;
                      removeObjectList = new Array();
                  }
              }
          }
      }
  }
}

function Drop(){
  if(!dropFlg){
      for(var x:int = 0; x < DROP_COL; x++){
          var maxCount:int = 0;  //画面外の何個目か
          for(var y:int = DROP_ROW - 1; y >= 0; y--){
              maxCount ++;
              if(dropList[x + y * DROP_COL] == null){
                  var drop:GameObject = createDrop(x,y);
                  var posX:float = drop.transform.position.x;
                  drop.transform.position.x =  -1.0 * maxCount;
                  iTween.MoveTo(drop, iTween.Hash("x", posX, "delay", 0, "time", 0.3, "easeType", "easeInOutQuad"));
                              
                  dropList[x + y * DROP_COL] = drop;
              }
          }
      }
  }
}

function GetDrop(posX:int, posY:int){
  return dropList[posX + posY * DROP_COL];
}

function Init(){
  dropFlg     = false;
  redCount    = Random.Range(2,5);
  greenCount  = Random.Range(2,5);
  blueCount   = Random.Range(2,5);
  yellowCount = Random.Range(2,5);
  
  gameStatus = 0;
  countDownObj.SetActive(false);
  
  dropList = new Array();
  for(var y:int = 0; y < DROP_ROW; y++){
      for(var x:int = 0; x < DROP_COL; x++){
          var drop:GameObject = createDrop(x,y);
          dropList.push(drop);
      }
  }
  
  countDown();
}

private function createDrop(x:int, y:int){
  var drop:GameObject =  Instantiate(Resources.Load("Prefabs/Drop2"));
  drop.transform.position.x = x * 1.0;
  var posY:float = -y * 1.0;
  if(x % 2 == 0) posY -= 0.5;
  drop.transform.position.y = posY;
  var dropTexture:tk2dSprite = drop.GetComponent(tk2dSprite);
  var spriteId:int = Random.Range(6,10);
  dropTexture.spriteId = spriteId;
  drop.name = "Drop" + spriteId;
  var dropObject:Drop2Object = drop.GetComponent(Drop2Object);
  dropObject.posX = x;
  dropObject.posY = y;
  var count:int;
  if(spriteId == 6){
      count = redCount;
  }else if(spriteId == 7){
      count = greenCount;
  }else if(spriteId == 8){
      count = blueCount;
  }else if(spriteId == 9){
      count = yellowCount;
  }
  drop.transform.FindChild("Count").GetComponent(tk2dTextMesh).text = count + "";
  dropObject.count = count;
  return drop;
}

private function countDown(){
  var countDownText:tk2dTextMesh = countDownObj.GetComponent(tk2dTextMesh);
  countDownObj.SetActive(true);
  countDownText.text = 3 + "";
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.2,"y", 1.2, "delay", 0, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 0.8,"y", 0.8, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.0,"y", 1.0, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  yield WaitForSeconds(1);
  countDownText.text = 2 + "";
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.2,"y", 1.2, "delay", 0, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 0.8,"y", 0.8, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.0,"y", 1.0, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  yield WaitForSeconds(1);
  countDownText.text = 1 + "";
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.2,"y", 1.2, "delay", 0, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 0.8,"y", 0.8, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.0,"y", 1.0, "delay", 0.3, "time", 0.3, "easeType", "easeInOutQuad"));
  yield WaitForSeconds(1);
  countDownText.text = "Start";
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 1.4,"y", 1.4, "delay", 0, "time", 0.5, "easeType", "easeInOutQuad"));
  iTween.ScaleTo(countDownObj, iTween.Hash("x", 0,"y", 0, "delay", 0.5, "time", 0.5, "easeType", "easeInOutQuad"));
  yield WaitForSeconds(1);
  countDownObj.SetActive(false);
  gameStatus = 1;
}

今回の感想

基盤的な部分を作るまでがとてもたのしいのですよね〜。
次はなにつくろうかな〜なんて考えつつ、そろそろ何か一つしっかり作ってみようかなと思います。
cocosどうなったかって?・・・それは聞かないお約束