糖果:
Enum SweetType |
EMPTY, NORMAL, BARRIER, ROW_CLEAR, COLUMN_CLEAR, RAINBOWCANDY, COUNT |
GameSweet |
用于存储糖果在面板上的位置,提供自己创建的糖果的属性,并且处理鼠标的进入等方法, |
变量: |
GameManager.SweetType type; Int x; Int y; GameManager gameManager; MoveSweet moveComponent; ColorSweet colorComponent; ClearSweet clearComponent; |
函数: |
Init(int _x,int _y,GameManager _gameManager); Awake();//给组件赋值, CanMove(); CanColor(); CanClear(); OnMouseEnter();//调用gameManager处理甜品的交换 OnMouseDown(); OnMouseUp(); |
MoveSweet |
用于控制糖果交换的位移效果 |
变量: |
IEnumerator moveCoroutine;//糖果移动动画的协程 GameSweet sweet; |
函数: |
Move(int newX,newY,float time);//用于外部调用,开启移动协程 IEnumerator MoveCoroutine(int newX,newY,float time);//使用循环利用插值的方法,使得糖果在time的时间内平滑的移动到指定的位置。 |
Enum ColorType |
YELLOW, PURPLE, RED, BLUE, GREEN, PINK, ANY, COUNT |
Struct ColorSprite |
ColorType color; Sprite sprite; |
ColorSweet |
用于糖果的“着色”。使得预制体的糖果的图片可以改变。 |
变量: |
ColorSprite[] colorSprites;//用于储存该糖果可以转变的 Sprite Dictionary<ColorType,Sprite> colorSpriteDict;//用于查找sprite SpriteRenderer sprite;//渲染器 ColorType color; Int numColor; |
函数: |
Awake();//用于给sprite赋值,给字典赋值 SetColor(ColorType newColor);//更改图片 |
ClearSweet |
//消除甜品类,用于播放消除动画和声音并且计算得分 |
变量: |
AnimationClip clearAnimation; bool isClearing;//判断是否正在销毁 AudioClip destoryAudio; GameSweet sweet; |
函数: |
Awake();//获糖果sweet Clear();//设置正在清除,开启协程 IEnumerator ClearCoroutine();//播放动画,增加分数,播放声音,播放完动画后消除物体。 yield return new WaitForSeconds(clearAnimation.length); |
ClearLine:ClearSweet |
//继承于ClearSweet,用于行消除和列消除 |
变量: |
Bool isRow;//英语判断是否是行消除 |
函数 |
override void Clear();//用于调用gameManager的行消除和列消除的函数 |
ClearColorSweet :ClearSweet |
//继承于ClearSweet,用于消除同颜色的甜品 |
变量: |
ColorSweet.ColorType clearColor;//标记所要删除的颜色 |
函数: |
public override void Clear();//用于调用gameManager的ClearColor方法。 |
Struct SweetPrefabs |
public SweetType type; public GameObject prefab; |
GameManager |
//游戏主处理类,用于处理游戏的逻辑调用。 |
变量: |
//单例 private static GameManager _instance;
int xColumn;//游戏面板的行列数 int yRow; GameObject gridPrefab;//面板背景的巧克力预制体
Dictionary<SweetType,GameObject> sweetPrefadDict; //甜品预制字典 SweetPrefabs[] sweetPrefabs;//用于放置甜品结构体,以便后面对字典赋值 GameSweet[,] sweets;//用于装载面板上的所有甜品的gameSweet脚本。
GameSweet pressedSweet;//甜品交换的前一个甜品对象 GameSweet enterSweet;//后一个甜品
//有关时间的UI显示 public Text timeText; private float gameTime = 60; private bool gameOver; public int playerScore; public Text PlayerScoreText; private float addScoreTime; private float currentScore; public GameObject gameOverPanel; public Text finalScoreText; |
函数: |
Awake();//初始化时给单例赋值 Start() { //实例化网格内的背景巧克力,实例化甜品字典,将空的甜品实例化至网格,之后再进行填充算法
} Vector3 CorrectPosition(int x,int y); //传入在面板中的相对位置,用于计算实际甜品的位置,用于实例化 { //实际需要巧克力的位置的X坐标=gamemanager的x坐标-大网格长度的一半+行列对应的x坐标 ////实际需要巧克力的位置的y坐标=gamemanager的y坐标+大网格长度的一半-行列对应的y坐标(从左上角开始) } //产生甜品的方法 public GameSweet CreateNewSweet(int x,int y,SweetType type) { //实例化甜品,设置其父物体,将其GameSweet脚本放入sweets[x,y]数组中并初始化。 }
//交换甜品 public void PressSweet(GameSweet sweet);//获取第一个甜品 public void EnterSweet(GameSweet sweet);//获取第二个甜品 public void ReleaseSweet();//判断是否相邻,并进入交换方法 private void ExchangeSweets(GameSweet sweet1, GameSweet sweet2)//交换甜品方法 { //判断是否都可以移动 //交换数组中的甜品
//调用匹配方法MatchSweets,判断是否满足有物体需要销毁或者甜品有一个是消除颜色甜品 { //调用两个甜品的移动脚本 //如果其中有一个甜品是消除颜色,则调用甜品的ClearColorSweet()方法将另一个甜品的颜色传进去。删除该甜品 //如果是另一个总情况则调用ClearAllMatchSweet()消除所有匹配的甜品 //开启填充协程 } //不满足销毁则将数组中的两个甜品交换回来
ClearAllMatchSweets()//消除所有完成匹配的甜品,返回是否需要填充 { 一个个甜品遍历,如果可以清除,获取甜品的匹配列表。判断是否产生特殊甜品,如果等于四标记将产生行消除或者列消除甜品,如果>=5则标记产生颜色消除甜品。遍历匹配列表,调用消除甜品方法。在该处产生特殊甜品,并改变甜品的渲染贴图。 } List<GameSweet> MatchSweets(GameSweet sweet,int newX,int newY)//遍历甜品四周,查找匹配列表 { 判断该甜品是否可着色 进行行匹配,往左右遍历,若大于三,则对行匹配链表的甜品进行LT型匹配, 同样进行列匹配。 返回匹配链表 } bool IsFriend(GameSweet sweet1,GameSweet sweet2)//判断两个甜品是否是相邻 bool ClearSweet(int x, int y)//清除甜品列表 { 判断是会否可以消除,并且不是正在消除。 调用甜品的消除方法,在该处产生一个新的空甜品 调用销毁障碍的方法 ClearBarrier(x, y); }
void ClearBarrier(int x,int y)//是被消除掉的甜品的坐标 { //遍历被销毁甜品的上下左右看是否有障碍物类型的甜品,有吃的话消除。还需要做是否越界的安全校验 } IEnumerator AllFill(){ //全部填充协程。 在没有填充完全时,调用Fill()函数进行分部填充。 调用ClearAllMatchSweets()方法,用返回值控制是否继续调用Fill()方法 }
//分步填充 public bool Fill(){ 从倒数第二行开始遍历每个甜品正下方是否有空甜品,有的话进行移动填充(调用甜品移动方法,更改数组中的甜品,该处生成空甜品) 斜向填充。 和左下和右下是否有空类型的甜品,有的话判断该空甜品正上方是否有障碍物,若有则调用甜品移动的方法移动至该处,
}
void ClearRow(int row);//行消除甜品被消除时调用该方法,该方法用于消除row所以在行的所有甜品 void ClearColumn(int column)//作用如上 void ClearColor(ColorSweet.ColorType color);//消除颜色甜品被消除时调用,用于消除与color同颜色的甜品 |