在很多俄罗斯方块游戏中,都可以预览下一次将会下落的方块信息,以便玩家可以更好的规划玩法。 下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=9...
在很多俄罗斯方块游戏中,都可以预览下一次将会下落的方块信息,以便玩家可以更好的规划玩法。
下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=940392313 (百度共享链接地址),进入zengl俄罗斯方块共享文件夹,在该文件夹中有个version_9_tetris.rar的压缩包就是v9版本的代码包,里面有个版本9说明.txt文件,包含了该版本的相关说明:
该版本是俄罗斯方块的第九个测试版本,该版本为了方便玩家进行预算,在游戏窗口的右侧将下一次会下落的俄罗斯方块的形状和旋转状态显示出来,按ESC键可以随时退出游戏,按P键可以暂停游戏。如果要玩完整版,可以查看"zengl编程语言"栏目,其中的"zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块"这篇文章里有俄罗斯方块正式发布版的下载地址。
如果是linux用户,在成功编译了zengl v1.0.5或更高版本的程序后(注意编译需要root权限,因为需要将.so动态链接库拷贝到/usr/lib中),可以将 version_9_tetris.rar里的version_9_tetris文件夹拷贝到zengl根目录中,最后运行./zenglrun version_9_tetris/tetris.zl -n 即可,如果要调试脚本,可以加个-d参数(参数的含义请参考上面提到的zengl v1.0.5的文章,或者通过-h参数来查看帮助)。
方块预览的截图如下:
在上图中,游戏窗口右上方红色Z形状的方块就是下一次会下落的方块样式。有了预览功能,玩家就可以及时调整当前的方块布局。
在该版本的tetris_def.zl脚本中添加了clsNextTetris类,该类包含了显示下一次会下落的方块的相关信息:
class clsNextTetris
startindex; //在游戏窗口右侧显示下一次将要下落的方块的形状样式索引
state; //在游戏窗口右侧显示下一次将要下落的方块的旋转状态
needDraw; //判断是否需要绘制
clsPosition pos; //下一次将要下落的方块在游戏窗口中的坐标信息
endcls
在tetris.zl中添加了myDrawNextTetris函数,用来绘制右侧下一次将显示的方块:
/*
在主屏幕右侧上方绘制下一次将要出现的俄罗斯方块,以方便玩家进行预算
*/
fun myDrawNextTetris()
global tetris , next_tetris , screen;
clsTetris tetris; clsNextTetris next_tetris;
sdlFillRect(screen,array(280,30,120,120),array(0, 0xFF, 0xFF)); //先将右上方区域清空
start = next_tetris.startindex * 16 + next_tetris.state * 4; //通过startindex和state得到俄罗斯方块在形状数组中的索引信息,一共是I,J,L等7类形状,每类形状还有四个state状态
count = start + 4; //得到需要绘制的方块数量,每种形状都由四个俄罗斯方块组成,所以是start + 4
for(i=start; i<count ; i++) //通过for循环将俄罗斯的四个方块通过sdlBlitImg这个sdl模块提供的脚本函数绘制到屏幕上。
sdlBlitImg(tetris.bgimg,
array(next_tetris.startindex * TetrisWidth,0,TetrisWidth,TetrisHeight),
screen,
array(TetrisWidth * tetris.members[i].vx + next_tetris.pos.x,
TetrisHeight * tetris.members[i].vy + next_tetris.pos.y,
TetrisWidth , TetrisHeight)
); //next_tetris和tetris共用同一套俄罗斯方块样式
endfor
endfun
另外next_tetris即下一次方块信息将由myGetRandomIndex函数生成:
/*
得到非重复的随机的方块样式
*/
fun myGetRandomIndex()
global next_tetris;
clsNextTetris next_tetris;
while(TRUE)
rand = bltRandom()%TetrisStyleNum;
if(rand != next_tetris.startindex) //如果随机值和上一次不是一种形状,则跳出循环,否则,继续获取随机值,直到与上一次的形状不同为止。
break;
endif
endwhile
next_tetris.startindex = rand; //设置startindex形状样式索引,这里设置的是next_tetris下一次要显示的方块样式。
endfun
而当前正在下落的俄罗斯方块的样式则由next_tetris来赋值:
fun myTetrisMove()
.................... //省略N行代码
tetris.startindex = next_tetris.startindex; //设置将显示的方块形状
tetris.state = next_tetris.state; //设置方块旋转状态
myGetRandomIndex(); //再随机生成下一次的方块形状,该形状将显示在主屏幕的右上方
next_tetris.state = bltRandom()%TetrisStateNum; //设置下一次的方块旋转状态
tetris.xy.vx = bltRandom()%(GameMainWidthNum - 3); //设置随机的水平初始虚拟坐标
tetris.xy.vy = 0; //重置vy虚拟坐标
.................... //省略N行代码
endfun
至于脚本中的其他代码都在重要的部分加了注释,可以结合注释和调试器进行分析。
OK,下节介绍v10的版本,休息,休息一下 O(∩_∩)O~