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;}
- Unity中利用C#开发泡泡龙游戏
- C#+XNA开发的泡泡龙游戏
- cocos2dx 泡泡龙游戏开发思路探究
- html5泡泡龙游戏开发随笔
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第40讲:PHP中预定义超全局变量
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第51讲:PHP中smarty模板技术介绍
- 我写的Flash泡泡龙游戏
- 泡泡龙游戏算法实现简介
- 基于cocos2d-x简易泡泡龙游戏
- 古代珍宝币泡泡龙游戏介绍
- VC 类泡泡龙游戏算法
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第42讲:PHP数据库开发案例
- cocos-js web开发泡泡龙游戏【一 加载游戏场景】
- cocos-js web开发泡泡龙游戏【二 生成游戏所有元素】
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第一讲引言
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第二讲html运行原理及结构
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第三讲:html符号实体、超链接
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第四讲:html表格元素
- 计算几何算法概览
- 后缀数组·小结
- [HDOJ 4913] Least common multiple [动态规划+线段树]
- IOS在类别中添加属性
- 在matlab中配置vlfeat
- Unity中利用C#开发泡泡龙游戏
- 拍照-照片-上传
- 自定义代码提示片段
- ACM暑假集训方法
- hdu 1166 敌兵布阵
- hdu-1412-{A} + {B}
- 蓝桥杯第5届(校园站)Java本科A组试题1:猜年龄
- 算法竞赛入门经典(第2版)习题4-3 黑白棋 Othello UVa220
- JPA & Hibernate 注解