namiachy's profilenamiachy's(王玉聪)PhotosBlogLists Tools Help

Blog


    打破循环的僵局

    goto语句仿佛只有在Basic和flash中出现过,但绝对是一种很直观的运行线索。
    这几天学习用Lua编写游戏脚本,他当然也不会有goto循环。
    Lua主要用于游戏编程,并可以Lua Player运行游戏于PSP中,在假设按键的被按下时写'pad:'按键名'()'(此前需要“pad = Controls.read()”来关注按键状态)。
    问题:很多时候按键被按下一次某个事件只需要被触发一次,不管按住它多久;另外一些时候按键被按下,if循环中的事件就一次次地被循环触发,直至松开它为止,如续力、行走、连射等。
    pad:"按键名"()属于后者,他可以使事件被持续循环触发,如何使按键按下时循环中的事件仅仅被触发一次?Lua教程的例程如下:
     
    首先在代码顶端的数据表之前添加此代码行:
    oldpad = Controls.read()
    其次将条件代码行
    if pad:'按键名'() then改为:
    if pad:'按键名'() and oldpad:'按键名'() ~= pad:'按键名'() then
    最后在"screen.flip()"和"end"之间添加代码行
    oldpad = pad
     
    当然这或许是最标致的方法。
     
    其他方式?引入一个类似Basic里面行号的参数,比如"d"。
     
    [例]在第1个页面下按cross键退出程序,按circle键进入第2个页面;在第2个页面时按cross返回第1个页面,按circle键进入第3个页面……
     
    [错误特征]错误循环代码片断:
    01 d = 0
    02
    03 if d == 0 then
    04 screen:print(0,0,page1)
    05 if pad:cross() then
    06 break
    07 end
    08 if pad:circle() then
    09 d = 1
    10 end
    11 end
    12
    13 if d == 1 then
    14 screen:print(0,0,page2)
    15 if pad:cross() then
    16 d = 0
    17 end
    18 if pad:circle() then
    19 d = 2
    20 end
    21 end
    22
    23 if d == 2 then
    24 screen:print(0,0,page3)
    25 end
     
    [问题分析]d=0时当按住circle键,d由第8~10行被赋值1并因为第13~14行进入页面2,但此时circle键还没来得及被松开,于是d又由第18~20行被赋值2并因未第23~24行进入了页面3,导致页面2实际上无法出现;另外,假使处于页面2,按住cross键后会因第15~16行将d赋值为0并因第3~4行进入页面1,但此时cross键还没来得及被松开,于是又由第5~6行直接退出了程序,导致页面1实际上无法返回。
     
    [解]
    d = 0
    if d == -0.5 and pad:cross() == false then
    d = 0
    end
    if d == 0 then
    screen:print(0,0,page1)
    if pad:cross() then
    break
    end
    if pad:circle() then
    d = 0.5
    end
    end
    if d == 0.5 and pad:circle() == false then
    d = 1
    end
    if d == 1 then
    screen:print(0,0,page2)
    if pad:cross() then
    d = -0.5
    end
    if pad:circle() then
    d = 2
    end
    end
    if d == 2 then
    screen:print(0,0,page3)
    end
     
    [说明]添加了d等于-0.5以及0.5的条件检索是否按键已经被松开并且直至按键松开才继续执行程序。
     
    "d"很类似Basic中的行号的概念。
     
    原创笔记/引用请注明出处,谢谢!

    访客须知

    第一款:任何人未在12小时前打电话预约并经得我的许可不准造访我公司,除非受到我主动邀请;
    第二款:任何访客不准在我公司吸烟(虽然我可以),除非我主动敬烟;
    第三款:任何访客未得到我的许可不准开启我公司的任何一台计算机,被允许的访客亦请遵守下述各项:
    1.请勿在任何一台计算机上浏览(本地计算机、LAN网以及互联网路的)音视频
    2.请勿在任何一台计算机上进行任何格式文档之下载及上传,这也就同时意味着严禁使用各种下载工具(含P2P)
    3.请勿在任何一台计算机上安装或卸载既有的任何计算机程式或插件程式
    4.请勿在任何一台计算机上更改任何计算机既有设置,不允许在任何一台计算机上留下任何使用痕迹
    5.请勿在任何一台计算机上运行任何游戏程式即便它看起来很诱人
    6.请勿在任何一台计算机上运行任何(包含Web版的)聊天程式以聊天,或发送、接收任何格式之文档
    7.请勿使用任何移动存储设备(亦包含行动电话、PSP等)连接至任何一台计算机,不允许将任何光盘插入任何一台计算机
    8.请勿开启任何一台计算机的音箱或应用摄像头、扫描仪什或打印机即便它们已然连接在那台计算机上,不允许将耳机连接至任何一台计算机
    9.请勿在任何一台计算机上变更硬体之连接,使用后务必立即关闭计算机,同时关闭显示器
    第四款:任何访客请勿擅自触碰我公司任何电器,如饮水机、电扇、空调、电视、冰箱、游戏机、电灯等,更不得触碰我公司的midi键盘、话筒、调音台等专业音响设备;
    第五款:任何访客不准擅自使用我公司任何一部固定电话机(含传真机),无论主叫、被叫或收发传真;
    第六款:任何访客不准擅自将任何随身携带之(手机充电器等)电器连接至我公司任何电源插座上,携带膝上型计算机的访客请勿使用我公司的网路环境;
    第七款:任何访客须维持我公司的环境,不得在公司内部进食零食,如经许可订餐餐后请清除垃圾(丢到楼层指定的垃圾箱而非公司内的任何垃圾桶)并整理擦拭桌面以及附近地面;
    第八款:任何访客不得擅自抽取我公司的卫生纸巾等,得到许可使用后须将废纸丢到楼层指定的垃圾箱而非公司内的任何垃圾桶;
    第九款:任何访客不得擅自品尝我公司储存之任何食物、饮料、烟水等,引用自带之饮料后须将饮料瓶丢到楼层指定的垃圾箱而非公司内的任何垃圾桶;
    第十款:任何访客不得擅自使用我公司的任何耗材,包括纸张、笔、橡皮、回形针等;
    第十一款:任何访客不得在我公司以行动电话、便携型影音播放设备、膝上型计算机播放出声音;
    第十二款:任何访客不得擅自在我公司主叫、被叫其行动电话,或应用其携带之任何WiFi、红外、蓝牙、GPRS、CDMA 1X等无线设备;
    第十三款:任何访客不得在我公司沙发、地板上卧倒休息;
    第十三款:任何访客不得在我公司赤膊或脱掉鞋、裤子,我们曾不止一次接待过这样的访客;
    第十四款:任何访客不得翻阅我公司陈列于任何地方之任何文件、图片、光盘、书籍、报纸、杂志、行事历等,不得擅自打开我公司抽屉、柜子拉门,经允许移动我公司的座椅等后要归位原处;
    第十五款:任何访客不得协同未经得我许可的同行者造访我公司。
     
    西元2008年6月11日订立·它可能被不定期修订