Unity中利用C#开发泡泡龙游戏

来源:互联网 发布:mac的safari打不开网页 编辑:程序博客网 时间:2024/05/02 01:33

泡泡龙是一款非常经典的游戏,版本有很多,如百度的《彩色泡泡》等。游戏开始时,泡泡应该出现m行;如果连续n次发射泡泡没有出现同色泡泡相消的情况,在屏幕上方自动加上一行泡泡;如果屏幕中泡泡全部被同色相消掉,则过关;如果屏幕中泡泡行数达到max行,则认为闯关失败。

开发软件: Unity

开发语言: C#

对一些数据的定义及封装:

<pre class="csharp" name="code">public  const int MaxRow = 11;     //泡泡所在位置的最大行public  const int MaxColumn = 9;   //泡泡所在位置的最大列public  int RowNum=8;     //初始化时产生气泡 行数public  int ColumnNum = 9;//初始化时产生气泡 列数public GameObject[] BubblePrefab; //预制对象数组public  struct BubbleClass        //bubble 结构体{public GameObject BubbleObj; //实例化的对象public int type;             //泡泡类型   如果颜色不同,则也认为类型不同public Vector3 position;     // 泡泡位置public bool  IsDestroy;      //当前位置的泡泡是否被销毁    如果当前位置的泡泡被销毁,则认为当前位置空闲,可以容纳发射的泡泡public int   Life;           //不同类型的泡泡生命值不同 public bool  Isconnection; //true表示与第一排相连   false表示不与第一排小泡相连}public  BubbleClass[,] BubbleArray;        //屏幕中MaxRow*MaxColumn格中泡泡数组public  BubbleClass    BubbleCurrentShoot; //当前要发射的泡泡public  BubbleClass    BubbleNextShoot;    //下一次要发射的泡泡public  float          BubbleMoveSpeed=5f; //小球移动速度public  float          CircleRadius=0.24f;//小泡半径private int NextNum=-1;    //发射球下一次标号     private int CurrentNum=-1; //发射球当前标号     private Vector3 NextPoint=new Vector3(-1.4f,-3.8f,0f); //下一个小泡发射位置 new Vector3(1.2f,-3.7f,0f)private Vector3 StartPoint=new Vector3(0.026f,-3.65f,0f); //小泡发射起点位置 new Vector3(0f,-3.6f,0f)public enum BState{READY,FLY,FINISH};//待发射小泡的三种状态 发射前(准备态),运动中, 完成态public BState BubbleState;//private int BubblePrefabLength=0;public bool BubbleInitFlag=false;public float HorizontalStartX = -3.0f;       //开始点X -1.75public float VerticalStartY=3.0f;             //开始点Ypublic float HorizontalDistance=0.5f;         //水平小泡之间间距public float VerticalDistance=0.45f;          //竖直小泡之间间距public float HorizontalIdentitationDis=0.25f; //水平右缩进距离public bool IdentitationFlag=false; //true代表 0,2,4,6,8,10为缩进,1,3,5,7,9为不缩进  false则相反public int CurrentRowCount=0; //当前屏幕中气泡行数//设计共10关 public  int GameLevel=1;         //游戏难度等级   public int BubbleKindsCount=4; //当前等级下的小泡种类private GameObject[] BubbleCurrentPrefab; //当前难度等级下的小泡预制对象数组public bool StartFlag=false; //开始标志public GameObject Menu; //菜单对象public int ShootBubbleCount=0; //发射小泡数public int Score=0;public UILabel LabelPoint;public int BubbleScore=10; //打掉一个气泡的得分public int BubbleBoudary=0;//连续几次没打中,则加一排小泡

 

涉及的主要步骤有:

(1)泡泡的产生。

初始屏幕泡泡的产生,相邻两行泡泡需要交错,才能形成完整的正六边形。主要代码:

//随机在屏幕上方方格产生气泡  初始化时调用此函数public void InitProduceScreenBubble(){int flagBubble = -1;for(int i=0;i<RowNum;i++){if(i==0){ flagBubble=Random.Range(0,2);//产生0,1数  0为这排气泡最左边气泡抵墙,1为此排气泡整体右缩进}else{if(flagBubble==0){flagBubble=1;}else{flagBubble=0;}}for(int j=0;j<ColumnNum;j++){float x1;if(i==0)   //第一排小泡{if(flagBubble==0){x1=HorizontalStartX+HorizontalDistance*j;IdentitationFlag=false;}else{x1=HorizontalStartX+HorizontalDistance*j+HorizontalIdentitationDis;IdentitationFlag=true;}}else  //其它排小泡{if(flagBubble==0){x1=HorizontalStartX+HorizontalDistance*j;}else {x1=HorizontalStartX+HorizontalDistance*j+HorizontalIdentitationDis;}}int temp=Random.Range(0,BubbleKindsCount); //为类型标号float x2=VerticalStartY-VerticalDistance*i;Vector3 tposition= new Vector3(x1,x2,0f);GameObject obj2=GameObject.Instantiate(BubblePrefab[temp],tposition,Quaternion.identity) as GameObject;BubbleArray[i,j].BubbleObj=obj2;BubbleArray[i,j].IsDestroy=false;BubbleArray[i,j].Life=1;BubbleArray[i,j].position=tposition;BubbleArray[i,j].type=temp;BubbleArray[i,j].Isconnection=true;}}}


发射小泡的产生:

//随机在下方产生当前和下一次要发射的小泡public void ProduceBubbleBottom(){if((CurrentNum==-1)&&(NextNum==-1))  //说明游戏刚开始{int m1 = Random.Range (0, BubbleKindsCount);int m2 = Random.Range (0, BubbleKindsCount);CurrentNum=m1;NextNum=m2;GameObject obj1=GameObject.Instantiate(BubblePrefab[m1],StartPoint,Quaternion.identity) as GameObject;GameObject obj2=GameObject.Instantiate(BubblePrefab[m2],NextPoint,Quaternion.identity) as GameObject;InitBubbleCurrent(obj1,m1,StartPoint,false,1);InitBubbleNext(obj2,m2,NextPoint,false,1);BubbleState=BState.READY;}else //如果游戏进行中{CurrentNum=NextNum;BubbleCurrentShoot.BubbleObj=BubbleNextShoot.BubbleObj;BubbleCurrentShoot.IsDestroy=BubbleNextShoot.IsDestroy;BubbleCurrentShoot.Life=BubbleNextShoot.Life;BubbleCurrentShoot.type=BubbleNextShoot.type;BubbleCurrentShoot.BubbleObj.transform.position=StartPoint;BubbleCurrentShoot.position=StartPoint;int m2 = Random.Range (0, BubbleKindsCount);GameObject obj2=GameObject.Instantiate(BubblePrefab[m2],NextPoint,Quaternion.identity) as GameObject;InitBubbleNext(obj2,m2,NextPoint,false,1);NextNum=m2;BubbleState=BState.READY;}}


发射小泡的运动:将发射小泡添加Rigidbody属性,去掉重力,设置其速度Velocity(矢量)即可实现运动。

//气泡发射函数void BubbleShoot(){//如果鼠标左击if(Input.GetMouseButton(0)){//UICamera.mainCamera.ScreenToWorldPointVector3 currentPosition = BubbleCurrentShoot.position ;Vector3 moveToward = Camera.main.ScreenToWorldPoint( Input.mousePosition );Vector3 moveDirection = moveToward - currentPosition;moveDirection.z = 0; moveDirection=moveDirection.normalized;Vector2 Direction=new Vector2(moveDirection.x,moveDirection.y);BubbleCurrentShoot.BubbleObj.rigidbody2D.velocity=Direction.normalized*BubbleMoveSpeed;//BubbleState==BState.FLY;  //小泡发射后就变为运动态BubbleState=BState.FLY;}}


(2) 发射小泡的碰撞检测

a. 发射小泡碰撞到左右屏幕边界,则需要反向弹回。

发射小泡从AO射入,则从OB射出,且OB与X同OA与X的夹角是相同的。检测方法,则在屏幕左右边缘加上“线碰撞器”,当发射小泡碰撞线碰撞器时,进入碰撞函数,改变发射小泡的速度方向即可。

void OnTriggerEnter2D(Collider2D collision){//屏幕边界碰撞检测if(maincontrol.BubbleInitFlag){if(collision.gameObject==maincontrol.BubbleCurrentShoot.BubbleObj){Vector2 tp = collision.gameObject.rigidbody2D.velocity;tp=new Vector2(-tp.x,tp.y);collision.gameObject.rigidbody2D.velocity= tp.normalized*maincontrol.BubbleMoveSpeed;}}}


 

b.发射小泡与屏幕中小泡碰撞

屏幕中的小泡以及发射小泡都是预制(Prefab)对象实例化而得到的。因而在的=建立预制对象时,就给预制对象加上组件”Circle Collider 2D",圆形2D碰撞器,为了去掉物理特性碰撞,选择“IsTrigger" ,这是为了避免小泡被撞飞。 注意: Unity 中要实现碰撞,务必保证碰撞物体和被撞物体两者中至少有一个具有刚体属性。

//小泡碰撞检测函数void OnTriggerEnter2D(Collider2D collision){if(maincontrol.StartFlag==true){//如果当前气泡就是发射气泡if(maincontrol.BubbleInitFlag){if(collision.gameObject==maincontrol.BubbleCurrentShoot.BubbleObj){maincontrol.ShootBubbleCount++;Vector2 tp = collision.gameObject.rigidbody2D.velocity;collision.gameObject.rigidbody2D.velocity= tp.normalized*0f;//调整发射小泡的位置ShootBubblePosition(gameObject);//Debug.Log ("行号:" + bbPosition.rown+"列号:" + bbPosition.columnn);Count=0;InitBubbleSameType();//delete []BubbleSameType;BubbleSameType[Count].obj=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].BubbleObj;BubbleSameType[Count].rowNum=bbPosition.rown;BubbleSameType[Count].ColumnNum=bbPosition.columnn;Count++;CountBubble(maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].BubbleObj,maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].type);if(Count>=3){maincontrol.ShootBubbleCount=0;int r=FindMinRow(); //找出颜色相同气泡中最小行号for(int i=0;i<Count;i++){GameObject CrackObj=GameObject.Instantiate(BubbleCrackPrefab,BubbleSameType[i].obj.transform.position,Quaternion.identity) as GameObject;Destroy(CrackObj,1f);Destroy(BubbleSameType[i].obj);int k1=BubbleSameType[i].rowNum;int k2=BubbleSameType[i].ColumnNum;maincontrol.BubbleArray[k1,k2].BubbleObj=null;maincontrol.BubbleArray[k1,k2].IsDestroy=true;maincontrol.BubbleArray[k1,k2].Life=0;maincontrol.BubbleArray[k1,k2].type=-1;maincontrol.BubbleArray[k1,k2].Isconnection=false;}//Debug.Log(Count);maincontrol.Score+=Count*maincontrol.BubbleScore;   Count=0;InitBubbleSameType();QueryBubbleSuspended(r);//清除悬空气泡if(Count>=1){for(int i=0;i<Count;i++){Destroy(BubbleSameType[i].obj);int k1=BubbleSameType[i].rowNum;int k2=BubbleSameType[i].ColumnNum;maincontrol.BubbleArray[k1,k2].BubbleObj=null;maincontrol.BubbleArray[k1,k2].IsDestroy=true;maincontrol.BubbleArray[k1,k2].Life=0;maincontrol.BubbleArray[k1,k2].type=-1;maincontrol.BubbleArray[k1,k2].Isconnection=false;}//Debug.Log(Count);}   maincontrol.Score+=Count*maincontrol.BubbleScore;   } else{//连续3次没打中想销毁if(maincontrol.ShootBubbleCount==maincontrol.BubbleBoudary){Vector3 pp=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].position;pp.y=tp.y-maincontrol.VerticalDistance;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].BubbleObj=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].BubbleObj;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].BubbleObj.transform.position=pp; maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].position=pp;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].IsDestroy=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].IsDestroy;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].Life=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].Life;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].type=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].type;maincontrol.BubbleArray[bbPosition.rown+1,bbPosition.columnn].Isconnection=maincontrol.BubbleArray[bbPosition.rown,bbPosition.columnn].Isconnection;}}Count=0;InitBubbleSameType();maincontrol.BubbleCurrentShoot.BubbleObj=null;maincontrol.BubbleCurrentShoot.IsDestroy=true;maincontrol.BubbleCurrentShoot.position=new Vector3(0f,0f,0f);maincontrol.BubbleCurrentShoot.type=-1;maincontrol.BubbleState=MainControl.BState.FINISH;maincontrol.BubbleCurrentShoot.Isconnection=false;}  }}}


 

(3)发射泡泡运动停止后的位置确定

下图绿色为被撞泡泡,以其为中心的六边形如下:图片来源:http://blog.csdn.net/luchenqun/article/details/8393879

根据碰撞函数可以得到被碰小泡(上面绿色)的坐标,根据它,可以得出其周围六个顶点小泡的位置 (假设都有小泡),再根据 

public  BubbleClass[,] BubbleArray;

数组(记录了屏幕中所有泡泡信息),判断六个位置是否有泡泡,根据发射小泡入射角度和六边形角度范围,给出发射小泡的位置。

//计算当前被撞小泡的位置  即当前小泡对象  obj为发射小泡碰撞的小泡void ShootBubblePosition(GameObject obj){int row=0, column=0;bool isIdentitation=false;GeneralBubblePosition (ref row, ref column,obj.transform.position); //if(maincontrol.IdentitationFlag){if(row%2==0){isIdentitation=true;}else{isIdentitation=false;}}else{if(row%2==0){isIdentitation=false;}else{isIdentitation=true;}}//int Currenttype=maincontrol.BubbleArray[row,column].type;bool Ichange = false; //判断obj小泡周围是否有同颜色的小泡(重复的不算)//float pbegin,pbegin1;//float pend,pend1;int LeftUpNum, LeftDownNum, RightUpNum, RightDownNum;Vector3 tp = maincontrol.BubbleCurrentShoot.BubbleObj.transform.position - obj.transform.position;tp.z = 0f;tp = tp.normalized;float angle=0f;if((tp.x>-0.00001f)&&(tp.x<=0.00001f)){if(tp.y>=0){angle=90f;}else{angle=-90f;}}else{if(tp.x>0f) {if(tp.y>=0f)//第一象限{angle=Mathf.Atan(tp.y/tp.x)*Mathf.Rad2Deg;}else  //第四象限{angle=Mathf.Atan(tp.y/tp.x)*Mathf.Rad2Deg;}}else{if(tp.y>=0f)//第二象限{angle=180f+Mathf.Atan(tp.y/tp.x)*Mathf.Rad2Deg;}else  //第三象限{angle=-180f+Mathf.Atan(tp.y/tp.x)*Mathf.Rad2Deg;}}}if(isIdentitation) //如果当前行缩进{//pbegin=PStartx;  //当前气泡的左右气泡肯定缩进//pend=PEndx;//pbegin1=PStartx0;//当前气泡的左上、左下、右上、右下气泡肯定不缩进//pend1=PEndx0;LeftUpNum=column;RightUpNum=column+1;LeftDownNum=column;RightDownNum=column+1;}else{//pbegin=PStartx0; //当前气泡的左右气泡肯定不缩进//pend=PEndx0;//pbegin1=PStartx;//当前气泡的左上、左下、右上、右下气泡肯定缩进//pend1=PEndx;LeftUpNum=column-1;RightUpNum=column;LeftDownNum=column-1;RightDownNum=column;}//直接计算位置   obj为中心的六边形定点位置Vector3 Left = new Vector3 (obj.transform.position.x - maincontrol.HorizontalDistance, obj.transform.position.y, obj.transform.position.z);Vector3 Right = new Vector3 (obj.transform.position.x + maincontrol.HorizontalDistance, obj.transform.position.y, obj.transform.position.z);Vector3 LeftUp = new Vector3 (obj.transform.position.x - maincontrol.HorizontalIdentitationDis, obj.transform.position.y+maincontrol.VerticalDistance, obj.transform.position.z);Vector3 RightUp = new Vector3 (obj.transform.position.x + maincontrol.HorizontalIdentitationDis, obj.transform.position.y+maincontrol.VerticalDistance, obj.transform.position.z);Vector3 LeftDown = new Vector3 (obj.transform.position.x - maincontrol.HorizontalIdentitationDis, obj.transform.position.y-maincontrol.VerticalDistance, obj.transform.position.z);Vector3 RightDown = new Vector3 (obj.transform.position.x + maincontrol.HorizontalIdentitationDis, obj.transform.position.y-maincontrol.VerticalDistance, obj.transform.position.z);//if((Left.x>=pbegin)&&(Left.x<=pend))//{if((column-1)>=0){if(maincontrol.BubbleArray[row,column-1].BubbleObj==null){if(((angle>=-180f)&&(angle<-150f))||((angle>=150f)&&(angle<180f))){BoundaryDeal(Left,row,column-1);return ;}}}//}//if((Right.x>=pbegin)&&(Right.x<=pend))//{if((column+1)<=(MainControl.MaxColumn-1)){if(maincontrol.BubbleArray[row,column+1].BubbleObj==null){if((angle>=-30f)&&(angle<30f)){BoundaryDeal(Right,row,column+1);return ;}}}//}//if((LeftUp.x>=pbegin1)&&(LeftUp.x<=pend1)&&(LeftUp.y>=PEndy)&&(LeftUp.y<=PStarty)) //上一行没有缩进//{if(((row-1)>=0)&&(LeftUpNum>=0)&&(LeftUpNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj==null){if((angle>90f)&&(angle<=150f)){BoundaryDeal(LeftUp,row-1,LeftUpNum);return ;}}}//}//if((RightUp.x>=pbegin1)&&(RightUp.x<=pend1)&&(RightUp.y>=PEndy)&&(RightUp.y<=PStarty)) //上一行没有缩进//{if(((row-1)>=0)&&(RightUpNum>=0)&&(RightUpNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj==null){if((angle>=30f)&&(angle<90f)){BoundaryDeal(RightUp,row-1,RightUpNum);return ;}}}//}//if((LeftDown.x>=pbegin1)&&(LeftDown.x<=pend1)&&(LeftDown.y>=PEndy)&&(LeftDown.y<=PStarty)) //下一行没有缩进//{if(((row+1)<=(MainControl.MaxRow-1))&&(LeftDownNum>=0)&&(LeftDownNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj==null){if((angle>=-150f)&&(angle<-90f)){BoundaryDeal(LeftDown,row+1,LeftDownNum);return ;}else if((column==0)&&(angle>=-180f)&&(angle<-90f)&&isIdentitation){BoundaryDeal(LeftDown,row+1,LeftDownNum);}}}//}//if((RightDown.x>=pbegin1)&&(RightDown.x<=pend1)&&(RightDown.y>=PEndy)&&(RightDown.y<=PStarty)) //下一行没有缩进//{if(((row+1)<=(MainControl.MaxRow-1))&&(RightDownNum>=0)&&(RightDownNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj==null){if((angle>=-90f)&&(angle<-30f)){BoundaryDeal(RightDown,row+1,RightDownNum);return ;}}}//}//如果都不属于   默认处理if(!Ichange){if(isIdentitation) //如果当前行缩进{if(((angle>=-180f)&&(angle<-150f))||((angle>=150f)&&(angle<180f)))//left{if(column==0){BoundaryDeal(LeftUp,row-1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(Left,row,column-1);return ;}}else if((angle>=-30f)&&(angle<30f)) //right{if(column==0){BoundaryDeal(Right,row,column+1);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftDown,row+1,column);return ;}}else if((angle>90f)&&(angle<=150f)) //LeftUp{if(column==0){BoundaryDeal(LeftUp,row-1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftUp,row-1,column);return ;}}else if((angle>=30f)&&(angle<90f))//rightup{if(column==0){BoundaryDeal(RightUp,row-1,column+1);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftUp,row-1,column);return ;}}else if((angle>=-150f)&&(angle<-90f))//leftdown{if(column==0){BoundaryDeal(LeftDown,row+1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftDown,row+1,column);return ;}}else if((angle>=-90f)&&(angle<-30f))//rightdown{if(column==0){BoundaryDeal(RightDown,row+1,column+1);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftDown,row+1,column);return ;}}}else{if(((angle>=-180f)&&(angle<-150f))||((angle>=150f)&&(angle<180f)))//left{if(column==0){BoundaryDeal(RightUp,row-1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(Left,row,column-1);return ;}}else if((angle>=-30f)&&(angle<30f)) //right{if(column==0){BoundaryDeal(Right,row,column+1);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(RightDown,row+1,column);return ;}}else if((angle>90f)&&(angle<=150f)) //LeftUp{if(column==0){BoundaryDeal(RightUp,row-1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftUp,row-1,column-1);return ;}}else if((angle>=30f)&&(angle<90f))//rightup{if(column==0){BoundaryDeal(RightUp,row-1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(RightUp,row-1,column);return ;}}else if((angle>=-150f)&&(angle<-90f))//leftdown{if(column==0){BoundaryDeal(RightDown,row+1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(LeftDown,row+1,column-1);return ;}}else if((angle>=-90f)&&(angle<-30f))//rightdown{if(column==0){BoundaryDeal(RightDown,row+1,column);return ;}if(column==MainControl.MaxColumn){BoundaryDeal(RightDown,row+1,column);return ;}}}}}


(4)同色小泡有3个以上,小泡相消(包含发射小泡)

核心:计算同色小泡数目以及记录同色小泡信息

//找出与小泡obj同色且相连的小泡  type包含颜色   当前小泡碰撞了发射小泡public void CountBubble(GameObject obj,int type){int row=0, column=0;bool isIdentitation=false;GeneralBubblePosition (ref row, ref column,obj.transform.position); //int Currenttype=maincontrol.BubbleArray[row,column].type;if(maincontrol.IdentitationFlag){if(row%2==0){isIdentitation=true;}else{isIdentitation=false;}}else{if(row%2==0){isIdentitation=false;}else{isIdentitation=true;}}//直接计算位置   obj为中心的六边形定点位置/*Vector3 Left = new Vector3 (obj.transform.position.x - maincontrol.HorizontalDistance, obj.transform.position.y, obj.transform.position.z);Vector3 Right = new Vector3 (obj.transform.position.x + maincontrol.HorizontalDistance, obj.transform.position.y, obj.transform.position.z);Vector3 LeftUp = new Vector3 (obj.transform.position.x - maincontrol.HorizontalIdentitationDis, obj.transform.position.y+maincontrol.VerticalDistance, obj.transform.position.z);Vector3 RightUp = new Vector3 (obj.transform.position.x + maincontrol.HorizontalIdentitationDis, obj.transform.position.y+maincontrol.VerticalDistance, obj.transform.position.z);Vector3 LeftDown = new Vector3 (obj.transform.position.x - maincontrol.HorizontalIdentitationDis, obj.transform.position.y-maincontrol.VerticalDistance, obj.transform.position.z);Vector3 RightDown = new Vector3 (obj.transform.position.x + maincontrol.HorizontalIdentitationDis, obj.transform.position.y-maincontrol.VerticalDistance, obj.transform.position.z);           */bool Ichange = false; //判断obj小泡周围是否有同颜色的小泡(重复的不算)//float pbegin,pbegin1;//float pend,pend1;int LeftUpNum, LeftDownNum, RightUpNum, RightDownNum;if(isIdentitation) //如果当前行缩进{//pbegin=PStartx;  //当前气泡的左右气泡肯定缩进//pend=PEndx;//pbegin1=PStartx0;//当前气泡的左上、左下、右上、右下气泡肯定不缩进//pend1=PEndx0;LeftUpNum=column;RightUpNum=column+1;LeftDownNum=column;RightDownNum=column+1;}else{//pbegin=PStartx0; //当前气泡的左右气泡肯定不缩进//pend=PEndx0;//pbegin1=PStartx;//当前气泡的左上、左下、右上、右下气泡肯定缩进//pend1=PEndx;LeftUpNum=column-1;RightUpNum=column;LeftDownNum=column-1;RightDownNum=column;}//if((Left.x>=pbegin)&&(Left.x<=pend))//{if((column-1)>=0){if(maincontrol.BubbleArray[row,column-1].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row,column-1].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row,column-1].BubbleObj)) //如果原数组中不存在{ Ichange=true; BubbleSameType[Count].obj=maincontrol.BubbleArray[row,column-1].BubbleObj; BubbleSameType[Count].rowNum=row; BubbleSameType[Count].ColumnNum=column-1; Count++; CountBubble(maincontrol.BubbleArray[row,column-1].BubbleObj,Currenttype); //递归调用}}}}//}  //if((Right.x>=pbegin)&&(Right.x<=pend))//{if((column+1)<=(MainControl.MaxColumn-1)){if(maincontrol.BubbleArray[row,column+1].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row,column+1].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row,column+1].BubbleObj))//如果原数组中不存在{ Ichange=true; BubbleSameType[Count].obj=maincontrol.BubbleArray[row,column+1].BubbleObj; BubbleSameType[Count].rowNum=row; BubbleSameType[Count].ColumnNum=column+1; Count++; CountBubble(maincontrol.BubbleArray[row,column+1].BubbleObj,Currenttype); //递归调用}}}}//}//if((LeftUp.x>=pbegin1)&&(LeftUp.x<=pend1)&&(LeftUp.y>=PEndy)&&(LeftUp.y<=PStarty)) //上一行没有缩进//{if(((row-1)>=0)&&(LeftUpNum>=0)&&(LeftUpNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row-1,LeftUpNum].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj))//如果原数组中不存在{    Ichange=true;    BubbleSameType[Count].obj=maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj;    BubbleSameType[Count].rowNum=row-1;    BubbleSameType[Count].ColumnNum=LeftUpNum;    Count++;    CountBubble(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj,Currenttype); //递归调用}}}}//}//if((RightUp.x>=pbegin1)&&(RightUp.x<=pend1)&&(RightUp.y>=PEndy)&&(RightUp.y<=PStarty)) //上一行没有缩进//{if(((row-1)>=0)&&(RightUpNum>=0)&&(RightUpNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row-1,RightUpNum].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj))//如果原数组中不存在{    Ichange=true;    BubbleSameType[Count].obj=maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj;    BubbleSameType[Count].rowNum=row-1;    BubbleSameType[Count].ColumnNum=RightUpNum;    Count++;    CountBubble(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj,Currenttype); //递归调用}}}}//}//if((LeftDown.x>=pbegin1)&&(LeftDown.x<=pend1)&&(LeftDown.y>=PEndy)&&(LeftDown.y<=PStarty)) //下一行没有缩进//{if(((row+1)<=(MainControl.MaxRow-1))&&(LeftDownNum>=0)&&(LeftDownNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row+1,LeftDownNum].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj))//如果原数组中不存在{    Ichange=true;    BubbleSameType[Count].obj=maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj;    BubbleSameType[Count].rowNum=row+1;    BubbleSameType[Count].ColumnNum=LeftDownNum;    Count++;    CountBubble(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj,Currenttype); //递归调用}}}}//}//if((RightDown.x>=pbegin1)&&(RightDown.x<=pend1)&&(RightDown.y>=PEndy)&&(RightDown.y<=PStarty)) //下一行没有缩进//{if(((row+1)<=(MainControl.MaxRow-1))&&(RightDownNum>=0)&&(RightDownNum<=(MainControl.MaxColumn-1))){if(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj!=null){if(Currenttype==maincontrol.BubbleArray[row+1,RightDownNum].type) //如果类型相同{if(!IsExistInArray(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj))//如果原数组中不存在{    Ichange=true;    BubbleSameType[Count].obj=maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj;    BubbleSameType[Count].rowNum=row+1;    BubbleSameType[Count].ColumnNum=RightDownNum;    Count++;    CountBubble(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj,Currenttype); //递归调用}}}}//}if (Ichange == false){return;}}


 

(5)泡泡掉落(主要判断泡泡是否直接或间接与屏幕中第一行的泡泡相连)

如果没有相连(即泡泡悬空),泡泡会自然掉落(也需要消去)。

// 查询整个屏幕中悬浮气泡void QueryBubbleSuspended(int row){for(int i=row;i<MainControl.MaxRow;i++){if(IsRowHaveEmpty(i)){for(int j=0;j<MainControl.MaxColumn;j++){if((!maincontrol.BubbleArray[i,j].IsDestroy)&&(maincontrol.BubbleArray[i,j].BubbleObj!=null)) //如果当前位置有小泡{connectionCount=0;InitConnectionPathObj();if(IsConnection(maincontrol.BubbleArray[i,j].BubbleObj)) //如果当前小泡与第一排直接或间接相连{}else  //如果当前小泡为孤立小泡(没有与第一排的小泡友直接或间接相连){if(!IsExistInArray(maincontrol.BubbleArray[i,j].BubbleObj))//如果原数组中不存在{  BubbleSameType[Count].obj=maincontrol.BubbleArray[i,j].BubbleObj;  BubbleSameType[Count].rowNum=i;  BubbleSameType[Count].ColumnNum=j;  maincontrol.BubbleArray[i,j].Isconnection=false;  Count++;}}}}}}}//一行中所有小泡位置是否有空bool IsRowHaveEmpty(int row){for(int j=0;j<MainControl.MaxColumn;j++){ if(maincontrol.BubbleArray[row,j].IsDestroy==true) //如果有空 所在位置的气泡被消灭{return true;}}return false;}//递归查询一个气泡obj是否与上一层想连接//1-6 分别代表调用IsConnection的obj为当前obj的Left,Right,LeftUp,RightUp,LeftDown,RightDown 0表示初始调用bool  IsConnection(GameObject obj){int row=0, column=0;bool isIdentitation=false;GeneralBubblePosition (ref row, ref column,obj.transform.position);ConnectionPathObj[connectionCount++] = obj;//如果obj已经处于第一排  则返回if(row==0){return true;}/*if(row<r){if(maincontrol.BubbleArray[row,column].Isconnection){return true;}else{//去除路径不通的小泡if(connectionCount>0){connectionCount--;ConnectionPathObj [connectionCount] = null;}return false;}}*/if(maincontrol.IdentitationFlag){if(row%2==0){isIdentitation=true;}else{isIdentitation=false;}}else{if(row%2==0){isIdentitation=false;}else{isIdentitation=true;}}//bool BoolConnection = false; //判断obj小泡周围是否有同颜色的小泡(重复的不算)//float pbegin,pbegin1;//float pend,pend1;int LeftUpNum, LeftDownNum, RightUpNum, RightDownNum;if(isIdentitation) //如果当前行缩进{//pbegin=PStartx;  //当前气泡的左右气泡肯定缩进//pend=PEndx;//pbegin1=PStartx0;//当前气泡的左上、左下、右上、右下气泡肯定不缩进//pend1=PEndx0;LeftUpNum=column;RightUpNum=column+1;LeftDownNum=column;RightDownNum=column+1;}else{//pbegin=PStartx0; //当前气泡的左右气泡肯定不缩进//pend=PEndx0;//pbegin1=PStartx;//当前气泡的左上、左下、右上、右下气泡肯定缩进//pend1=PEndx;LeftUpNum=column-1;RightUpNum=column;LeftDownNum=column-1;RightDownNum=column;}if(((column-1)>=0))    //Left{if(maincontrol.BubbleArray[row,column-1].BubbleObj!=null){if(!IsInConnectionPathObj(maincontrol.BubbleArray[row,column-1].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row,column-1].BubbleObj)) //递归调用{return true; }}}}if((column+1)<=(MainControl.MaxColumn-1)) //Right{if(maincontrol.BubbleArray[row,column+1].BubbleObj!=null){   if(!IsInConnectionPathObj(maincontrol.BubbleArray[row,column+1].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row,column+1].BubbleObj)) //递归调用{return true; }}}}if(((row-1)>=0)&&(LeftUpNum>=0)&&(LeftUpNum<=(MainControl.MaxColumn-1))) //LeftUp{if(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj!=null){if(!IsInConnectionPathObj(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row-1,LeftUpNum].BubbleObj)) //递归调用{return true; }}}}if(((row-1)>=0)&&(RightUpNum>=0)&&(RightUpNum<=(MainControl.MaxColumn-1))) //RightUp{if(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj!=null){if(!IsInConnectionPathObj(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row-1,RightUpNum].BubbleObj)) //递归调用{return true; }}}}if(((row+1)<=(MainControl.MaxRow-1))&&(LeftDownNum>=0)&&(LeftDownNum<=(MainControl.MaxColumn-1))) //LeftDown{if(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj!=null){if(!IsInConnectionPathObj(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row+1,LeftDownNum].BubbleObj))//递归调用{return true; }}}}if(((row+1)<=(MainControl.MaxRow-1))&&(RightDownNum>=0)&&(RightDownNum<=(MainControl.MaxColumn-1))) //RightDown{if(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj!=null){    if(!IsInConnectionPathObj(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj)){if(IsConnection(maincontrol.BubbleArray[row+1,RightDownNum].BubbleObj)) //递归调用{return true; }}}}    //去除路径不通的小泡if(connectionCount>0){  connectionCount--;  ConnectionPathObj [connectionCount] = null;}return false;}


 


 

1 0
原创粉丝点击