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

泡泡龙是一款非常经典的游戏,版本有很多,如百度的《彩色泡泡》等。游戏开始时,泡泡应该出现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
  • 7
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值