俄罗斯方块游戏制作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

俄罗斯方块制作:
第一步,我们先来理一下俄罗斯方块的玩法及其功能:
1,游戏共有7种形状,每一种形状都由4个方块组成
2,游戏一开始或者每个形状落地之后都会在最上方生成一个新形状
3,形状在没落地之前每隔大约0.5秒会自动下落一个方块的距离
4,形状可以通过左右方向键向左右移动
5,按上键可以旋转形状,每点一下上键则逆时针(或者顺时针)旋转90°
6,每满一行,则这一行消失掉,上面的自动递补到下面
7,游戏带计分功能,没消掉一行加1分
8,游戏界面右上角显示下一个将要生成的形状
9,每一种形状都会随机赋予颜色
10,游戏有边界,如图左、右下蓝色砖块区域。所有形状不可以移动到边界以外,
形状在旋转的时候也不允许插到边界里面或者伸出边界。

第二部,思考游戏在unity3d中的大致实现方式
通过观察,很容易发现,每个形状里面都有一个核心方块,其他3个方块都围绕核心
方块来转动,同时也可以考虑到其他3个方块的下落、左右移动,也是随着核心方块
走的。根据这个思想,我们可以先实现一个方块的“生成”、“自动下落”、
“落地判断”这三个功能。
1,方块的生成
整个俄罗斯方块的游戏界面其实就可以想象成一个二维数组,row是行号,col是
列号,通过给数组元素赋值0、1来控制方块显示的位置,如:
Private Var row : int;
Private var col : int;
block[row,col]=1;可以理解为第row行col列位置的方块显示
可能又有同学在想:这只是在数组里面把这个位置的值置为1,怎么让他真正显示在
游戏场景里面呢?这个就可以用到GUI里面的GUI.Button或者GUI.DrawTexture,我
这里用的GUI.Button,当然,必须自定义一个GUISkin,不然GUI.Button画出来的
按钮将是untiry3d默认的按钮样式而不会是上图中的样子。
2,方块的自动下落
这个说白了就是改变数组里面的值,OnGUI函数里面一直在检测上面所说的那个二维
数组里面的值,如果为1就显示这个方块,如果为0就不显示。代码如下:
for(row=0;row<30;row++){
GUI.Button(Rect(200,row*20,20,20),blockpic,"cusblock01");//画右边
墙壁
GUI.Button(Rect(0,row*20,20,20),blockpic,"cusblock01";//画左边墙壁
}
for(col=0;col<11;col++){
GUI.Button(Rect(col*20,620,20,20),blockpic,"cusblock01");//画底部
墙壁
}
for(row=0;row<29;row++){
for(col=1;col<10;col++){
if(stateArray[row,col]==1){
GUI.Button(Rect(col*20,row*20,20,20),mainBlockpic[colorArry[row
,col]],"cusblock01");//刷新显示游戏界面的方块
}
}
}
3,碰撞检测
在start函数里面预定义墙壁位置的方块们对应数组元素的值为1,代码如下:
for(i=0;i<30;i++){
stateArry[i,0]=1;
stateArry[i,10]=1;
}
for(i=0;i<11;i++){
stateArry[

29,i]=1;
}
这样,如果按下左键向左移动的时候,就检测方块所处位置左边一个位置的值,如果
为0则移动方块,如果为1则说明左边有方块,不做任何动作。向下和向右的碰撞检测
同理。
4,砖块的移动
就拿按下方向键来说,按一下下方向键那么方块就下落一个方块的位置,我用到如下
代码:
Input.Getkey("down")&&pressInterval>=0.02;
这里的pressInterval一个按键间隔变量,控制按键的检测时间间隔,因为Getkey
函数用来实时检测按键的当前状态,所以如果不加这个时间间隔变量的话,将会出现
你按住向下键方块以极快的速度下落的景象。
(这里顺带说一下GetKey和GetKeyDown这两个函数的区别:Getkey用来实时检测按键
的状态,如果你一直按着某个按键的话,按键所对应的事件将会一直触发,一直到你
松开这个按键;GetKeyDown则不同,就算你一直按着某个键,这个键所对应的事件
也只会执行一次。)
在update里面让这个值跟随时间而增加,代码如下:
pressInterval+=1*Time.deltaTime;
向左、向右和向下移动是相同的,只是向左和向右需要检测左右边界的碰撞,向下
需要监测下边界碰撞,和上面讲的碰撞一样,按下相对应的按键之后,先监测是否
碰撞,如果碰撞则不做动作,如果不碰撞,则向对应方格移动一格。
5,方块的变形
这里和上面的移动不相同,先看代码:
Input.GetKeyDown("up");
这里用到的是GetKeyDown函数,移动用的则是GetKey函数,因为我们不想按住向上键
的时候方块在一直变形,当然,如果你思想足够YD的话可以使用GetKey加一个足够
小的时间间隔变量来满足你疯狂变形的欲望。。碰撞检测还是要的,原理还是一样,
监测变形之后的四个组成块的位置是否与边界有重叠,如果有则不变形。
6,提示下一个方块
从思想的角度,这个东西很容易做。。。做起来稍微有点复杂,其实原理很简单,就是
预先生成下一个方块,算法上具体怎么做则因人而异。

第三步,添加一些更炫更实用的功能
比如每个形状拥有随机的颜色(形状的四个组成块颜色相同),自然而然考虑到random
其实就是用random,定义一个textur2D[],里面放入所有颜色的方块,利用随机数,
随机出本次显示的形状使用哪个颜色的方块,具体实现靠你自己啦。
计分模块,比如消掉一行加一分,这个就一行代码,利用bel来显示。
还有好多功能,这里就看各位的自由发挥了。

相关文档
最新文档