[原创]
那么首先这是一个4*4的游戏,16个格子。左右上下移动方块,相同的方块销毁,生成一个新的方块。例如
0204
0222
0420
2444
像右移动后,变成了
0024
0024
0042
0248
整个游戏逻辑就是这样的。
所以我这里就简化成了1*4的游戏,4个格子,左右移动方块,当做到这点并理解了,那么扩展到4*4也就问题不大了。我之所以这样讲解,是希望和我一样的新手能一步一步的抽丝剥茧似的把整个逻辑弄懂,开窍了后这东西也就这么一回事。
那么游戏例子就变成这样了:
0222向右移动后0024或者2040向右移动后变成0024。
是吧,这很好理解。
所以1、在hierarchy下建立一个2D-Object-Sprite,把背景my2048拖进去,游戏背景总要有的。
2、在hierarchy下空的gameobject,改名为Gamemanager,然后给他ADD Component一个c#叫 gamemanager,这个就是游戏管理器了,我们的主要代码都在这里写的。
public enum GameState{
Playing,
Pause,
End
}
public class gmmanager : MonoBehaviour {
GameState state=GameState.Playing;
private int[] numArray=new int[4]{0,0,0,0};
public List go=new List ();
public GameObject bock;
void Start () {
CreateNum ();
CreateNum ();
}
void Update () {
switch (state) {
case GameState.Playing:
//move
MoveNum();
break;
case GameState.Pause:
break;
case GameState.End:
break;
}
}
3、好了,先把上面不重要的代码先讲了,GameState这个是枚举类型,控制游戏的状态,你可以在Update 看到,一开始我们定义了是playing状态,在这个状态下MoveNum()就开始作用了(这个函数后面会讲到)。
4、CreateNum (),马上会讲到的,这个是一开始的时候,游戏随机的产生两个数字
5、因为我们先测试的是1*4的方块。所以new int[4]{0,0,0,0};这个是理论上的,实际上要有放图片的地方所以要List go=new List ()(别忘了在inspector面板给go这个size填上4。),最后是public GameObject bock;我们把做好的预制件mBock拖到这个bock中。
那么接下来的要将怎么CreateNum ()了。
private void CreateNum(){
int randomBock = Random.Range (1,3);//这个仅仅是用来随机产生2或者4数字的大小,到时候会乘以2。
int randomNumx = -1;
int emptyNum = 0;
for (int x=0; x<4; x++) {
if (numArray [x] == 0)
emptyNum++;
}
if (emptyNum == 0)//上面我们知道numArray里面都是0,所以第一次emptyNum 肯定是4了。
return;
int randomNum = Random.Range (1, emptyNum + 1);//这个是随机的位置,所以随机数在1和4中产生(不包括最大数5)
int index = 0;//设计一个标记符,找到这个randomNum
for (int x=0; x<4; x++) {
if (numArray [x] == 0) {
index++;
if (index == randomNum) {
randomNumx = x;//找到了,就跳转到flag的这个位置去执行代码
goto flag;}
}
}
flag:
go[randomNumx]=(GameObject)Instantiate (bock,new Vector2(-132f+randomNumx*88f,132f),Quaternion.identity);//实例化
go[randomNumx].GetComponent ().changeText(2*randomBock);//实例化后,改成方块的数字,需要给预制件添加c#名为BockMove。
numArray[randomNumx]=2*randomBock;
}
6,之前忘了给prefab预制件mBock添加c#了。里面的函数比较简单不详细讲解了。
public class BockMove : MonoBehaviour {
public Text mtext;
public Vector3 newPos;
public bool needsetz=false;
void Start () {
newPos = transform.position;
}
void Update () {
transform.position=Vector3.MoveTowards(transform.position,newPos,25.0f);
}
public void changePos(int temIndex){
newPos.x = -132f + temIndex * 88f;
if(needsetz){
newPos.z = 1;
needsetz=false;
}
}
public void destroyBock(){
Destroy (this);
}
public void changeText(int mt){
mtext.text =mt.ToString();
}
}
转载请注明原文地址: https://ju.6miu.com/read-1302947.html