泡泡龙是一款非常经典的游戏,版本有很多,如百度的《彩色泡泡》等。游戏开始时,泡泡应该出现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.75
public float VerticalStartY=3.0f; //开始点Y
public 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.ScreenToWorldPoint
Vector3 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.veloc