独家提供给 testerhome,需要需引用,带上 testerhome 的链接,谢谢。
接上一篇, lua 与游戏测试(一)
上一篇介绍了下 lua 和 lua 里打 log 的方式。
本文主要还是基于客户端的,服务端其实也可以用 lua,可以了解下云风的 skynet 框架,已经开源。
与简悦合作的陌陌其中的游戏部门就是使用了这套框架在开发 MMO,这里就不多介绍了,
有兴趣的可以自行前往查看。
题外话:最近在验收一些项目时,发现一些数据交互独立的地方,进行了拆分业务,这个没错,但拆分方式导致了同步问题,怪物和英雄分别在 2 个端计算不同的逻辑,然后战斗数据包单包转发,传输过程中不拆包,一些问题还是产生在业务层面上。
实现 C/C++ 对 Lua 脚本的调用 LuaScript.h
markdown 里没有 lua,先用 ruby 代替
#ifndef __LUA_SCRIPT_H__
#define __LUA_SCRIPT_H__
#include "GameDef.h"
class CLuaScript
{
public:
CLuaScript();
~CLuaScript();
public:
bool LoadScript(const char* szFileName);
bool CallFunction(char* cFuncName, int nResults, char* cFormat, va_list vlist);
bool CallFunction(const char* cFuncName, int nResults, char* cFormat, ...);
private:
void RegisterLuaLib(); --注册lua各种基础库
bool RegisterFunctions(TLua_Funcs Funcs[], int n); --将游戏接口注册到lua脚本
private:
lua_State* m_LuaState; --state 脚本和C\C++交互
bool m_IsLoadScript;
};
#endif
这段是给做介绍的是公共的。
介绍下 lua 的类型有 8 个 Nil Booleans Strings Functions...
今天介绍 nil,nil 用于区分数据和没有数据的值
测试中比较留意的界面层级的测试 CCLayer 用 nil 判断事件。
Nil 判断 touch 事件
function createMaskLayer( priority,touchRect ,touchCallback, layerOpacity,highRect)
local layer = CCLayer:create()
layer:setPosition(ccp(0, 0))
layer:setAnchorPoint(ccp(0, 0))
layer:setTouchEnabled(true)
layer:setTouchPriority(priority or -1024) --默认权限 -1024
layer:registerScriptTouchHandler(function ( eventType,x,y )
if(eventType == "began") then
if(touchRect == nil) then
if(touchCallback ~= nil) then --判断事件状态,如果没有取到,则回调屏蔽层touch
touchCallback()
end
return true
else
if(touchRect:containsPoint(ccp(x,y))) then
return false
else
if(touchCallback ~= nil) then
touchCallback()
end
return true
end
end
end
print(eventType)
end,false, priority or -1024, true)
Nil 用于 函数的默认 没有数据的值
默认情况下,lua 里所有的变量都指向 nil
ChatSence 聊天场景
require "script/network/RequestCenter"
require "script/network/Network"
require "script/libs/LuaCCLabel"
local IMG_PATH = "images/chat/" -- 图片主路径
local m_layerSize = CCSizeMake(620,700)
local m_chatGmLayer
local m_chatGmLayerBg =nil --可以写nil也可以不写
这里没有 nil 不会产生 bug,local 是局部变量,但如果在 tables 初始化后的其他地方定义了 nil,就会导致 bug。
关键测试点,lua 所有未定义的变量使用起来都会返回 nil,发现变量是需要被使用的,但出现了以下就是 bug。
lua:xx行: bad argument #参数 to '函数' (string expected, got nil)
实际测试中看到抛错和读都不吃力,要写出来,还是整理思绪了一些时间。
看官可以去读下一些公司 lua 代码,本周就讲到这里,下周日 继续介绍函数类型 Booleans 这个容易发生问题的类型。