在之前的版本中,玩家还只能通过反复按键来让方块移动或加速下落,这节通过设置按键检测间隔时间,来让游戏支持连续按键,同时当方块快到顶部时,让方块从顶部非可见区域开始下落。 &nbs...

    在之前的版本中,玩家还只能通过反复按键来让方块移动或加速下落,这节通过设置按键检测间隔时间,来让游戏支持连续按键,同时当方块快到顶部时,让方块从顶部非可见区域开始下落。

    下载地址:http://pan.baidu.com/share/link?shareid=396056&uk=940392313 (百度共享链接地址),进入zengl俄罗斯方块共享文件夹,在该文件夹中有个version_10_tetris.rar的压缩包就是v10版本的代码包,里面有个版本10说明.txt文件,包含了该版本的相关说明:

    该版本是俄罗斯方块的第十个测试版本,该版本为了方便玩家的按键操作,添加了连续按键检测,例如当玩家按着下键不松手的时候,方块就会一直处于加速下落状 态,当按着左右键不松手时,方块会往左右两边连续移动,不用像以前的版本那样反复按键了,另外当方块累积到顶部区域时,方块会从顶部以上的非可见区域开始 下落,这样玩家就还有翻身的机会,在没累积到顶部前,都是从默认的第一行开始下落的,按ESC键可以随时退出游戏,按P键可以暂停游戏。

    该版本是zengl编程语言v1.0.5开发的完整可玩的版本。

    如果是linux用户,在成功编译了zengl v1.0.5或更高版本的程序后(注意编译需要root权限,因为需要将.so动态链接库拷贝到/usr/lib中),可以将 version_10_tetris.rar里的version_10_tetris文件夹拷贝到zengl根目录中,最后运行./zenglrun version_10_tetris/tetris.zl -n 即可,如果要调试脚本,可以加个-d参数(参数的含义请参考"zengl编程语言"栏目,其中的"zengl编程语言v1.0.5 编译,执行,源码调试一体化,开发俄罗斯方块"这篇文章,或者通过-h参数来查看帮助)。

    在该版本的tetris.zl脚本的第426行:

screen = sdlCreateWin(WinWidth,WinHeight,32,0,250); //创建窗口,最后一个参数250用来设置检测连续按键的间隔为250ms,这样按上下左右键时,就可以按着不动,例如按着下键不松手,则方块会一直加速,不用像以前那样反复按下键了。

    通过给sdlCreateWin脚本函数提供最后一个可选参数,就可以设置连续按键的检测间隔了,SDL开发库默认是关闭了连续按键检测的,所以需要根据需要进行设置。

    在tetris.zl的myTetrisMove函数中会根据需要将方块设置到非可见区域中:

fun myTetrisMove()

    .........................  //省略N行代码

    if(myCollisionDetect()) //如果主游戏区域累积到了顶部区域,则将运动方块vy设为-4,这样,可以给玩家一个翻身的机会。虽然机会不大,呵呵。
        tetris.xy.vy = -4;
    endif

    .........................  //省略N行代码

endfun

    因为方块可能会出现在顶部以上的非可见区域中,所以在脚本中还添加了myGameMainBgOccupyDetect自定义函数,用于对方块索引进行有效性检查:

/*
    当判断某方格是否被占用时,需要对其索引进行检查,如果不进行检查,那么当索引超出范围或小于0时,虚拟机都会输出运行时错误。
*/

fun myGameMainBgOccupyDetect(index)
    global gameMainBg;
    clsGameMainBg gameMainBg;
    if(index < 0 || index >= gameMainBg.count) //如果超出范围,则返回TRUE,这样方块就不会左右移动或者不会切换状态。
        return TRUE;
    elif(gameMainBg.fix_tetris[index].occupy) //占用状态返回TRUE
        return TRUE;
    else
        return FALSE; //返回FALSE表示该索引的方格没被占用。
    endif
endfun

    之前的版本在切换旋转状态时,只会简单的判断是否超出了左右边界,而没去判断左右是否有固定方块挡住了去路,所以会出现旋转BUG。在本版本中通过添加myEdgeDetectForKeyUp函数来修复该BUG:

/*
    如果按了上方向键,那么在切换状态前,需要进行检测,以判断是否可以进行旋转来切换状态
*/

fun myEdgeDetectForKeyUp()
    global tetris,gameMainBg;
    clsTetris tetris; clsGameMainBg gameMainBg;
    start = tetris.startindex * 16 + tetris.state * 4;
    count = start + 4;
    for(i = start ; i<count ; i++) //循环对四个小方块进行边界判断。
        vx = tetris.xy.vx + tetris.members[i].vx;
        vy = tetris.xy.vy + tetris.members[i].vy;
        if(vx < 0) //如果超过了主游戏区的最左边界,则返回TRUE,表示不可以切换状态
            return TRUE;
        elif(vx >= GameMainWidthNum) //如果超过了主游戏区域的最右边,则返回TRUE , 表示不可以切换状态
            return TRUE;
        elif(vy < 0) //如果vy < 0 ,即运动小方块在主游戏区的上方非可见区域则跳过。
            continue;
        elif(myGameMainBgOccupyDetect(vx + vy * GameMainWidthNum)) //判断该小方块是否被主游戏区域的小方块占用,如果被占用了,返回TRUE,表示不可以切换状态
            return TRUE;
        endif
    endfor
    return FALSE; //返回FALSE,表示当前可以切换状态
endfun

    该版本的游戏运行截图如下:

    可以看到最顶部的蓝色垂直俄罗斯方块只有三个小方块可见,还有一个小方块在上面非可见区域中,所以看不到,该垂直方块是从非可见区域开始下落的。

    OK,等zengl编程语言v1.0.6版本出来,再发布v11版本,不过v10版本已经具备所有功能,休息,休息一下 O(∩_∩)O~

上下篇

下一篇: zengl俄罗斯方块v11 使用zengl v1.0.6新语法

上一篇: zengl俄罗斯方块v9 添加下一次出现方块的预览功能

相关文章

zengl俄罗斯方块v3 添加按键功能

zengl俄罗斯方块v2 初始化七种形状

zengl俄罗斯方块v4 堆砌碰撞过的方块

zengl俄罗斯方块v6 传统消行法

zengl俄罗斯方块v9 添加下一次出现方块的预览功能

zengl俄罗斯方块v5 简单消行法