logo资料库

基于Unity GUI制作扫雷,贪吃蛇,俄罗斯方块.pdf

第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
资料共24页,剩余部分请下载后查看
俄罗斯方块
扫雷
贪吃蛇
五、每期教程 本期教程还是比较简卑癿,我们打算做一个 Unity3D 癿系列教程,至亍入门教程 请百度一下嗨嗨癿 Unity3D 入门教程。那个是规频癿,非常简卑。一看就懂,如果丌 懂,找坑豆腐撞死。 下面我们来看看本期教程,俄罗斯斱坑 …………….. =。=.. 俄罗斯方块 转自 http://u3dpro.com 作者 小晕晕 首先来看一下做完之后的效果图: 61
第一步,我们先来理一下俄罗斯方块的玩法及其功能: 1、 游戏共有 7 种形状,每一种形状都由 4 个方块组成 2、 游戏一开始或者每个形状落地之后都会在最上方生成一个新形状 3、 形状在没落地之前每隔大约 0.5 秒会自动下落一个方块的距离 4、 形状可以通过左右方向键向左右移动 5、 按上键可以旋转形状,每点一下上键则逆时针(我用的逆时针)旋 转 90° 6、 每满一行,则这一行消失掉,上面的自动递补到下面 7、 游戏带计分功能,每消掉一行加 1 分 8、 游戏界面右上角显示下一个将要生成的形状 9、 每一种形状都会随机赋予颜色 10、游戏有边界,如图左、右、下蓝色砖块区域。所有形状不可以移动 到边界以外,形状在旋转的时候也不允许插到边界里面或者伸出边界 第二步,思考游戏在 unity3d 中的大致实现方式 通过观察,很容易发现,每个形状里面都有一个核心方块,其他 3 个方 块都围绕核心方块来转动,同时也可以考虑到其他 3 个方块的下落、左 右移动,也是随着核心方块走的。根据这个思想,我们可以先实现一个 方块的“生成”、“自动下落”、“落地判断”这三个功能。 1、方块的生成 整个俄罗斯方块的游戏界面其实就可以想象成一个二维数组,row 是行 62
号,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 画出来的按钮将是 untiy3d 默 认的按钮样式而不会是上图中的样子。 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++){ 63
if(stateArry[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 函数用来实时监测按键的当前状态,所以如果不加这个时间 间隔变量的话,将会出现你按住向下键方块以极快的速度下落的景象。 64
(这里顺带说一下 GetKey 和 GetKeyDown 这两个函数的区别:GetKey 用来实时监测按键的状态,如果你一直按着某个按键的话,按键所对应 的事件将会一直触发,一直到你松开这个按键;GetKeyDown 则不同, 就算你一直按着某个键,这个按键所对应的事件也只会执行一次。)是 是 在 update 里面让这个值跟随时间而增加,代码如下: pressInterval+=1*Time.deltaTime; 向左、向右和向下移动是相同的,只是向左和向右需要监测左右边界的 碰撞,向下需要监测下边界碰撞,和上面讲的碰撞一样,按下相应的按 键之后,先监测是否碰撞,如果碰撞则不做动作,如果不碰撞,则向对 应方向移动一格。 5、方块的变形 这里和上面的移动不相同,先看代码: Input.GetKeyDown("up"); 这里用到的是 GetKeyDown 函数,移动用的则是 GetKey 函数,因为我 们不想按住向上键的时候方块在一直变形,当然,如果你思想足够 YD 的话可以使用 GetKey 加一个足够小的时间间隔变量来满足你疯狂变形 的欲望。。碰撞检测还是要的,原理还是一样,监测变形之后的四个组 成块所处的位置是否与边界有重叠,如果有则不变形。 6、提示下一个方块 从思想的角度,这个东西很容易做。。。做起来稍微有点复杂,其实原理 65
很简单,就是预先生成下一个方块,算法上具体怎么做则因人而异。 第三步,添加一些更炫更实用的功能 比如每个形状拥有随机的颜色(形状的四个组成块颜色相同),自然而 然考虑到 random,其实就是用 random,定义一个 textur2D[],里面放入 所有颜色的方块,利用随机数,来随机出本次显示的形状使用哪个颜色 的方块,具体实现靠你自己啦。 记分模块,比如消掉一行加一分,这个就一行代码,利用 GUI.Label 来 显示。 还有好多功能,这里就看各位的自由发挥了~ OK 俄罗斯方块到此为止,,但是我想了下, 干脆一不做二不休,吧其他两个教程也送上 来。买一送二晒。。。 同样转自 http://u3dpro.com/ 不过本次教程作者为 稻草 66
扫雷 编程工具:Unity3D 2.6 脚本种类:JavaScript 脚本 第一部分——开发思路: 首先思考扫雷游戏的特点。每个雷块周围 8 个区域都会相应的给出 雷个数的提示。左键点击空白处,立即会扫出大片空白区域(排空)。 右键设定是否为雷。 脚本初始,设置空白区域为 0,所有雷为 1。我们不妨设扫雷的区域为 5X5(用 for 语句来实现)。用 GUI 来显示 我们的 5X5 区域 。 如图: 雷区显示出来后,就该进行地雷的随机处理了,在这里留好地雷数 目的接口,以便更改雷数和游戏难度。 用 JavaScript 中的 Random 循环来随机雷数,确定范围(让地雷不能跑 出 5X5 的区域)。这里规定雷数为 5 个 ,由数字 1 表示。 如图: 67
为了进一步确定每次随机出来的雷数都在 5X5 的区域中。我们可以 在脚本中设置一个重置按钮(在这里格子区域留好接口变量,以便扩充 区域)。 如图: (游戏后期可将重置按钮变为笑脸图块) 接下来要做的是设定地雷周边 8 个土块的数字的确定。雷区外围边 界要留好位置(在这里要当心数组越界的问题)在雷区旁边画出 5X5 的雷区域(雷周边的数字)与之相对应。相应的定义出两个数组: //定义一个二维数组,包含扫雷区域 //定义一个数组,存放雷 //定义一个二维数组,包含地雷周围数字(此数字的值等于其周围 68
分享到:
收藏