51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1971|回复: 2
打印 上一主题 下一主题

lua 与游戏测试 (二)

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-3-9 13:13:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文主要还是基于客户端的,服务端其实也可以用lua,可以了解下云风的skynet框架,已经开源。
与简悦合作的陌陌其中的游戏部门就是使用了这套框架在开发MMO,这里就不多介绍了,
有兴趣的可以自行前往查看。

题外话:最近在验收一些项目时,发现一些数据交互独立的地方,进行了拆分业务,这个没错,
但拆分方式导致了同步问题,怪物和英雄分别在2个端计算不同的逻辑,然后战斗数据包单包转发,
传输过程中不拆包,一些问题还是产生在业务层面上。
回归正文,任何语言和测试的关系,首先测试读懂代码,了解语言的优势,这是第一步也是最基
础的,lua标准库是第二步。

实现C/C++对Lua脚本的调用 LuaScript.h

markdown里没有lua,先用ruby代替
  1. #ifndef __LUA_SCRIPT_H__
  2. #define __LUA_SCRIPT_H__

  3. #include "GameDef.h"

  4. class CLuaScript
  5. {
  6. public:
  7.     CLuaScript();
  8.     ~CLuaScript();

  9. public:
  10.      bool    LoadScript(const char* szFileName);     
  11.      bool    CallFunction(char* cFuncName, int nResults, char* cFormat, va_list vlist);
  12.      bool    CallFunction(const char* cFuncName, int nResults, char* cFormat, ...);

  13. private:
  14.     void    RegisterLuaLib();  --注册lua各种基础库
  15.     bool    RegisterFunctions(TLua_Funcs Funcs[], int n); --将游戏接口注册到lua脚本

  16. private:
  17.     lua_State*  m_LuaState;   --state 脚本和C\C++交互
  18.     bool        m_IsLoadScript;
  19. };
  20. #endif
复制代码
这段是给做介绍的是公共的。

公共库有很多段,还需要注册lua标准库和c++脚本接口

介绍下lua的类型有8个 Nil Booleans Strings Functions...

今天介绍nil,nil 用于区分数据和没有数据的值
测试中比较留意的界面层级的测试 CCLayer 用nil判断事件。
Nil 判断 touch事件

  1. function createMaskLayer( priority,touchRect ,touchCallback, layerOpacity,highRect)
  2.     local layer = CCLayer:create()
  3.     layer:setPosition(ccp(0, 0))
  4.     layer:setAnchorPoint(ccp(0, 0))
  5.     layer:setTouchEnabled(true)
  6.     layer:setTouchPriority(priority or -1024)  --默认权限 -1024
  7.     layer:registerScriptTouchHandler(function ( eventType,x,y )
  8.         if(eventType == "began") then
  9.             if(touchRect == nil) then
  10.                 if(touchCallback ~= nil) then   --判断事件状态,如果没有取到,则回调屏蔽层touch
  11.                     touchCallback()
  12.                 end
  13.                 return true
  14.             else
  15.                 if(touchRect:containsPoint(ccp(x,y))) then
  16.                     return false
  17.                 else
  18.                     if(touchCallback ~= nil) then
  19.                         touchCallback()   
  20.                     end
  21.                     return true
  22.                 end
  23.             end
  24.         end
  25.         print(eventType)
  26. end,false, priority or -1024, true)
复制代码
循环体还是很简单的,部分解释器可以检查,这里可以改变touchCallback ~= nil把 ~= nil去掉,就可
以验证事件,至于层级会产生触摸抛错,不是这段可以解释的。

Nil 用于 函数的默认 没有数据的值
默认情况下,lua里所有的变量都指向nil
ChatSence 聊天场景
  1. require "script/network/RequestCenter"
  2. require "script/network/Network"
  3. require "script/libs/LuaCCLabel"

  4. local IMG_PATH = "images/chat/"             -- 图片主路径

  5. local m_layerSize = CCSizeMake(620,700)
  6. local m_chatGmLayer
  7. local m_chatGmLayerBg =nil  --可以写nil也可以不写
复制代码
这里没有nil不会产生bug,local是局部变量,但如果在tables初始化后的其他地方定义了nil,就会导
致bug。

关键测试点,lua所有未定义的变量使用起来都会返回nil,发现变量是需要被使用的,但出现了以下
就是bug。

lua:xx行: bad argument #参数 to '函数' (string expected, got nil)
实际测试中看到抛错和读都不吃力,要写出来,还是整理思绪了一些时间。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情

    2019-12-27 13:32
  • 签到天数: 15 天

    连续签到: 1 天

    [LV.4]测试营长

    2#
    发表于 2018-4-2 14:26:50 | 只看该作者
    这个文章。。怎么那么熟悉。。
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-9 00:33 , Processed in 0.059249 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表