unityでパズルゲーム2

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

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

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

##操作説明とサンプル WebPlayerでビルドしたものです。
スマホ用なので、本来は画面の両端は表示されないはずです・・・
つくったもの

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

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

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

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

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

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

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

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どうなったかって?・・・それは聞かないお約束