求助40主线不绑定金任务学会绑定

&&Programing In Lua&&中学习了闭包,元表和lua的面向对象实现后,我被的元机制震撼了,果断体会到了如果把自己禁锢在C++的圈子里坐井观天是多么的可惜.来看看超轻量级对象绑定luna类的使用和实现吧.首先,它的使用比较简单(luna没实现继承,类型检查等,毕竟只是一个可供借鉴和学习的最基础实现而已),代码如下:
1 extern "C"
3 #include &lua.h&
4 #include &lualib.h&
5 #include &lauxlib.h&
7 #include &stdio.h&
8 #include "luna.h"
11 class LuaTest
13 public:
LuaTest(lua_State* L)
static const char className[];
static Luna&LuaTest&::RegType methods[];
20 public:
TestString(lua_State* L)
{ printf("hello!\n"); return 0; }
24 const char LuaTest::className[] = "LuaTest";
25 // Define the methods we will expose to Lua
26 #define method(class, name) {#name, &class::name}
27 Luna&LuaTest&::RegType LuaTest::methods[] =
method(LuaTest, TestString),
33 int main()
lua_State* L = luaL_newstate();
luaL_openlibs(L);
Luna&LuaTest&::Register(L);
luaL_dofile(L, "MyTest.lua");
lua_close(L);
MyTest.lua如下:
test = LuaTest()
test:TestString()
可以看到,luna使用是比较MISS法则的,让我比较不习惯的是对象不是在宿主程序里创建的,而是在lua脚本里.大家都知道lua的C函数导出是很简单的,直接luaL_register()就行,那么对象导出是怎么实现的呢?打开luna.h,发现其不过百来行,关键是Luna类的Register这个方法.学习了lua创始人的书后,咱底气足足的,就来剖析一下它的实现吧:
1 #ifndef _luna_h_
2 #define _luna_h_
* Taken directly from http://lua-users.org/wiki
7 /* Lua */
8 extern "C" {
9 #include &lua.h&
10 #include &lauxlib.h&
11 #include &lualib.h&
14 template &typename T& class Luna {
typedef struct { T *pT; } userdataT
16 public:
typedef int (T::*mfp)(lua_State *L);
typedef struct { const char * } RegT
static void Register(lua_State *L) {
//新建一个table,methods保存其栈索引,这个方法表就是用来保存要导出的成员函数
lua_newtable(L);
int methods = lua_gettop(L);
//在注册表中新建一个元表,metatable保存其栈索引.
//元表是模拟面向对象机制的关键.后面将会把该元表赋予fulluserdata(C++对象在lua中的映射对象).
luaL_newmetatable(L, T::className);
int metatable = lua_gettop(L);
//全局表[T::className]=methods表
lua_pushstring(L, T::className);
lua_pushvalue(L, methods);
lua_settable(L, LUA_GLOBALSINDEX);
//设置metatable元表的__metatable元事件
//作用是将元表封装起来,防止外部的获取和修改
lua_pushliteral(L, "__metatable");
lua_pushvalue(L, methods);
lua_settable(L, metatable);
// hide metatable from Lua getmetatable()
//设置metatable元表的__index元事件指向methods表
//该事件会在元表onwer被索引不存在成员时触发,这时就会去methods表中进行索引...
lua_pushliteral(L, "__index");
lua_pushvalue(L, methods);
lua_settable(L, metatable);
//设置元表的__tostring和__gc元事件
//前者是为了支持print(MyObj)这样的用法..
//后者是设置我们的lua对象被垃圾回收时的一个回调.
lua_pushliteral(L, "__tostring");
lua_pushcfunction(L, tostring_T);
lua_settable(L, metatable);
lua_pushliteral(L, "__gc");
lua_pushcfunction(L, gc_T);
lua_settable(L, metatable);
//下面一段代码干了这么些事:
//1.创建方法表的元表mt
//2.方法表.new = new_T
//3.设置mt的__call元事件.该事件会在lua执行到a()这样的函数调用形式时触发.
//这使得我们可以重写该事件使得能对table进行调用...如t()
lua_newtable(L);
// mt for method table
int mt = lua_gettop(L);
lua_pushliteral(L, "__call");
lua_pushcfunction(L, new_T);
lua_pushliteral(L, "new");
lua_pushvalue(L, -2);
// dup new_T function
lua_settable(L, methods);
// add new_T to method table
lua_settable(L, mt);
// mt.__call = new_T
lua_setmetatable(L, methods);
// fill method table with methods from class T
for (RegType *l = T:: l-& l++) {
lua_pushstring(L, l-&name);
lua_pushlightuserdata(L, (void*)l);
lua_pushcclosure(L, thunk, 1);
//创建闭包,附带数据为RegType项
lua_settable(L, methods);
//方法表[l-&name]=闭包
lua_pop(L, 2);
// drop metatable and method table
// get userdata from Lua stack and return pointer to T object
static T *check(lua_State *L, int narg) {
userdataType *ud =
static_cast&userdataType*&(luaL_checkudata(L, narg, T::className));
if(!ud) luaL_typerror(L, narg, T::className);
return ud-&pT;
// pointer to T object
92 private:
// hide default constructor
// member function dispatcher
static int thunk(lua_State *L) {
// stack has userdata, followed by method args
T *obj = check(L, 1);
// get 'self', or if you prefer, 'this'
lua_remove(L, 1);
// remove self so member function args start at index 1
// get member function from upvalue
RegType *l = static_cast&RegType*&(lua_touserdata(L, lua_upvalueindex(1)));
return (obj-&*(l-&mfunc))(L);
// call member function
// create a new T object and
// push onto the Lua stack a userdata containing a pointer to T object
static int new_T(lua_State *L) {
lua_remove(L, 1);
// use classname:new(), instead of classname.new()
T *obj = new T(L);
// call constructor for T objects
userdataType *ud =
static_cast&userdataType*&(lua_newuserdata(L, sizeof(userdataType)));
// store pointer to object in userdata
luaL_getmetatable(L, T::className);
// lookup metatable in Lua registry
lua_setmetatable(L, -2);
// userdata containing pointer to T object
// garbage collection metamethod
static int gc_T(lua_State *L) {
userdataType *ud = static_cast&userdataType*&(lua_touserdata(L, 1));
T *obj = ud-&pT;
// call destructor for T objects
static int tostring_T (lua_State *L) {
char buff[32];
userdataType *ud = static_cast&userdataType*&(lua_touserdata(L, 1));
T *obj = ud-&pT;
sprintf(buff, "%p", obj);
lua_pushfstring(L, "%s (%s)", T::className, buff);
135 #endif
读了&&Programing In Lua&&后,这里的语义理解是木有问题的.现在只需走一遍程序执行流程,就能把一切串起来了.
(1)在宿主程序中,执行了这句:
Luna&LuaTest&::Register(L);
这是静态的准备工作,我们继续往下看
(2)开始执行脚本:
luaL_dofile(L, "MyTest.lua");
脚本第一句为:
test = LuaTest()
执行LuaTest(),这会导致什么发生呢?一切必有源头,查看Luna::Register()中的这几句:
1 //全局表[T::className]=methods表
lua_pushstring(L, T::className);
lua_pushvalue(L, methods);
lua_settable(L, LUA_GLOBALSINDEX);
推出:LuaTest() =& methods table() .而对一个表使用调用语法,导致其元表的__call事件被触发,于是 =&& new_T函数就被执行了...
(3)new_T()中,new了C++对象,并创建了lua中对应的映射对象(fulluserdata),然后从注册表中取出元表与lua对象绑定(可以看出,所有的对象是共享一个元表的).最后返回lua对象.
回过神来体会脚本这句代码 test = LuaTest(),竟然语如其意,同时构造了C++对象和lua对象.
(4)执行脚本第二句:
test:TestString()
这只是一个语法糖,等价于
test.TestString(test)
这导致test对象被索引"TestString"方法,当然它作为一个userdata是没有key的,故而触发其元表的__index事件,然后在methods table中搜索到了"TestString"项,最终调用其闭包thunk.
(5)执行到闭包thunk了.这里有一个传入参数,位于栈索引1,即test对象自身.先进行了类型检查check(),即检查test对象元表的名称是否等于T::className,不等则报错.这是为了检查出不正确的对象方法调用,如用A类对象去调用B类对象的方法..接下来几句代码妥妥的了,取出闭包附带数据RegType,调用C++对象成员函数TestString()...
(6)脚本执行结束,lua对象被垃圾回收,其__gc元事件被触发,gc_T()调用,C++对象被delete.
(7)程序结束...  水落石出,源码面前,了无秘密啊.
这个例子lua构建的数据结构有这几个:
搞清楚了luna的对象绑定实现后,我自己稍微动手实现了C++对象的绑定到lua.因为上面说过了,luna只支持脚本中创建对象,而我想要的是在C++程序中创建对象后绑定到lua中.没研究过LuaBind等库的代码,思考了一下元表的利用,还是写出了这个功能.下面阐述下.
(1)绑定单个C++对象.所有代码与本文开头的一样,改动的是测试类的构造函数:
1 LuaTest::LuaTest()
SCRIPTNAMAGER.BindObjectToLua&LuaTest&("tester1", this);
1 //绑定对象到lua全局表(userdata)
template&class T&
BindObjectToLua(const Ogre::String& nameInLua, T* pObject)
Luna&T&::userdataType *ud = static_cast&Luna&T&::userdataType*&(lua_newuserdata(m_pLuaState, sizeof(Luna&T&::userdataType)));
assert(ud);
ud-&pT = pO
// store pointer to object in userdata
luaL_getmetatable(m_pLuaState, T::className);
// lookup metatable in Lua registry
lua_setmetatable(m_pLuaState, -2);
//拷贝栈顶userdata
lua_pushvalue(m_pLuaState, -1);
lua_setglobal(m_pLuaState, nameInLua.c_str());
1 tester1:fun()
&代码就不解释了,有困难,找lua手册妥妥的 :D
(2)在脚本中以数组形式通过ID来索引对象.改动的地方如下:
1 class LuaTest
LuaTest(const STRING& name, int objIndex);
LuaTest(lua_State* L) {}
fun(lua_State* L) { cout && m_name.c_str() && return 0; }
static const char className[];
static Luna&LuaTest&::RegType methods[];
1 LuaTest::LuaTest(const STRING& name, int objIndex)
2 :m_name(name)
SCRIPTNAMAGER.BindObjectToLua&LuaTest&("ObjTable", objIndex, this);
1 //绑定C++对象到lua的对象数组(table)中,如table Unit[0] = userdata0, Unit[1] = ...
template&class T&
BindObjectToLua(const STRING& tableName, int index, T* pObject)
Luna&T&::userdataType *ud = static_cast&Luna&T&::userdataType*&(lua_newuserdata(m_pLuaState, sizeof(Luna&T&::userdataType)));
assert(ud);
int userdata = lua_gettop(m_pLuaState);
ud-&pT = pO
// store pointer to object in userdata
luaL_getmetatable(m_pLuaState, T::className);
// lookup metatable in Lua registry
lua_setmetatable(m_pLuaState, userdata);
//获取对象table
lua_getglobal(m_pLuaState, tableName.c_str());
//没有则创建
if(lua_istable(m_pLuaState, -1) == 0)
lua_newtable(m_pLuaState);
lua_pushvalue(m_pLuaState, -1);
lua_setglobal(m_pLuaState, tableName.c_str());
int table = lua_gettop(m_pLuaState);
//将userdata放入表中
lua_pushnumber(m_pLuaState, index);
lua_pushvalue(m_pLuaState, userdata);
lua_settable(m_pLuaState, table);
LuaTest t1("t1", 0);
LuaTest t2("t2", 1);
ObjTable[0]:fun()
ObjTable[1]:fun()
同样就不解释了  :D
这里也贴上这两天无所事事收集到的资源链接:
&&&游戏编程精粹&&5,6中都有关于lua与脚本支持的相关文章.
阅读(...) 评论()查看: 248|回复: 8
跪求分析。新手POST,注册后账号不能和任务平台绑定。
阅读权限20
在线时间 小时
签到天数:3 天结帖率: (5/6)
我做好了游戏注册的,但是不能和任务平台的账号绑定在一起(手动在网页上再次注册,提示”不能重复绑定“)麻烦各位前辈帮忙分析下,小弟新人,研究了好几天了。 ...
以下是用Fiddler抓的包。由于新手,所以把整个过程抓了下来,有劳前辈们了!
在线等……有任何问题请短信我。。。
(1.25 MB, 下载次数: 14)
14:20 上传
点击文件名下载附件
乐豆啊 我前端时间写了个注册机绑定游戏
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限90
在线时间 小时
签到天数: 7 天结帖率: (7/7)
乐豆啊 我前端时间写了个注册机绑定游戏
热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!
您可以选择打赏方式支持他
阅读权限154
在线时间 小时
签到天数: 7 天结帖率: (22/23)
发包不如 把地址发出来
补充内容 ( 14:28):
而且你的Fiddler版本 跟我的不一样 好像不能读入
您可以选择打赏方式支持他
阅读权限20
在线时间 小时
签到天数: 3 天结帖率: (5/6)
发包不如 把地址发出来
补充内容 ( 14:28):
/qipai/info/85.html
您可以选择打赏方式支持他
阅读权限20
在线时间 小时
签到天数: 3 天结帖率: (5/6)
发包不如 把地址发出来
补充内容 ( 14:28):
有劳前辈了
您可以选择打赏方式支持他
阅读权限154
在线时间 小时
签到天数: 7 天结帖率: (22/23)
有劳前辈了
不知道你注册的时候&&带上cookie什么的了么
您可以选择打赏方式支持他
阅读权限120
在线时间 小时
签到天数: 8 天结帖率: (10/11)
这种注册一般最少有两个参数一个平台试玩id确定注册哪一期试玩和平台账号id游戏绑定平台账号
您可以选择打赏方式支持他
阅读权限154
在线时间 小时
签到天数: 7 天结帖率: (22/23)
Cookie:ASP.NET_SessionId=g0vb0zhc3fufmfll5o0 CNZZDATA=-http%253A%252F%%252F%7C; Hm_lvt_9a1d03fefc4fdf6f2ab608=,; Hm_lpvt_9a1d03fefc4fdf6f2ab608=
Host:
Origin:
Referer:/Extended/Register_NBA.aspx?ResourceID=2041&ResourceNote=183547复制代码注册的时候不知道你处理协yi头和cookie了么
您可以选择打赏方式支持他
阅读权限20
在线时间 小时
签到天数: 3 天结帖率: (5/6)
注册的时候不知道你处理协yi头和cookie了么
没有注意呢,请问是哪一步的包?还有,如果要POST,需要几处?
您可以选择打赏方式支持他
精易论坛 - 有你更精彩 /1
还在为某个APP无法抓取数据而烦恼?热门的APP快手,最新版登录数据无法抓取问题?
课程提供大量的技术和方法解决某些app无法抓取数据的问题。
还在为填表的繁琐而烦闷不已?还在为封包的速度和技巧无限纠结?
在post课程将学到QQ授权登录各类网页、QQ授权登录各类APP。JS跟踪、调试、解析等等。
海量实例,绝对物超所值!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
Powered by让你学会微营销的30个技巧---任务易像裤头这种污七八糟的妹汁,
跟妈妈学绑粽子的时候,
满脑子都是一些嘻嘻嘻的事情!
在各种SM的方法当中,
绳艺是裤头觉得最唯美的一种。
纷繁复杂的捆绑样式,
何止给性的过程增添了情趣,
称之为「艺术」都不为过。
今天裤头就来介绍一下,
绳艺的历史以及一些简单的绳艺样式!
叭叭叭~快上车!来不及解释了!
绳艺这种SM方式,源自日本江户时代的「捕绳术」。
当时捆绑犯人没有手铐的嘛,捆绑犯人就要用绑的。然而各地有各地不同的捆绑方法,针对犯人不同的身份、不同的性别、不同的年龄,捆绑的方式也有细致明确的区分方式。就和日本的茶道、花道一样,逐渐成为了一种里头有很多门道规则的艺术活儿。
明治维新之后,手铐代替了绳子,警察不再用绳缚来捆绑犯人了。但是绳艺在当时,确实已经带上了情色的意味——那个时候日本有个很有争议的画家,据说是日本昭和SM第一人,名字叫伊藤晴雨(日-日),他很精准地捕获了绳艺的唯美精髓,画了不少以绳缚为元素的作品:
除了画风精奇之外,他之所以「很有争议」,还因为他常常将他的妻子和情人捆绑起来,以她们为原型进行作画:
伊藤晴雨本人(左)与模特(右)
无论如何,绳缚术算是开始名扬天下了。现在我们去谷歌随便搜一下「shibari」(日语「縛り(しばり)」的罗马字),都可以搜出来绳缚术的各种资讯。就像群J的英语「Bukkake」一样,也是来自日语里的「ぶっかけ」,原意其实是轮流射J/颜she(我特么怎么懂这么多……扶额),也是从日本的AV文化当中引申出来的词语。
《独裁者》原班人马的新作《王牌贱谍》超好笑!
而例如英语维基上也直接将绳缚术写作「Japanese Bondage」(日式捆绑),很大部分原因,就是受了日本伊藤晴雨这批艺术家的作品的影响。
裤头之前在《BDSM:有本事你绑住我来啪呀!?(?)?》一文当中(哎呀这颜文字真是俏皮),有提到过为什么捆绑可以使人感觉到兴奋:
……BDSM之所以可以让人感觉到快乐,是因为人的身体在受到刺激之后可以产生内啡肽,类似我们跑步跑到最嗨的时候、慢慢缓下来时所感觉到的高潮快感,有的人可以从中感觉到愉悦。
在不对受缚M的身体造成伤害的前提下,通过制造可控范围内的紧缚感和痛苦,来增加性过程当中刺激、兴奋的情趣,这就是绳缚术。除了手与脚之外,绳缚也又可能会涉及身体的其它部分。而束缚的部位越多、样式越精巧,就越能给SM当中M的一方带去更多的耻辱感——这种耻辱感,则正是绳缚术的精髓所在。
绳艺对道具、特别是绳索的要求很高,不是随便什么绳子都可以用来捆绑的。特制的捆绑绳索,是不太可能会对被绑缚者的皮肤造成伤害的。每条绳子的长度女性在7米左右,男性在10米左右,原料各有不同,经过严格的制作方法,手感上一般都比较柔软。
SM中使用最普遍的就是麻绳,麻绳捆绑后不容易松动,但是和皮肤接触起来触感又比较特别。由于麻绳和M的皮肤贴合比较紧密,所以大家在选购的时候,一定要选择SM专用的麻绳,施工现场和杂货店里那种普通的麻绳并不能拿来玩捆绑。
棉绳比麻绳柔软,从视觉上看起来也温柔很多,如果刚开始尝试紧缚,又觉得麻绳看起来好可怕的话,可以先试试看用棉绳。不过棉绳的弊端在于:它比较容易滑动!所以就不太适合全身的束缚了,但只是绑下手手脚脚的话,选择棉绳还是蛮可以的。
如果只是想随便玩一玩,可以先试试看用丝袜、领带什么的工具,感受一下自己好不好绳缚这一口。而且一开始尝试一些普通的日常用品,道具看上去比较亲切,也能让M放松一些、更容易接受和感觉到快感。
而如果是使用绳子的话,可以先把绳子对折,对折后稳定性会比单根绳子更强一些,而且受力面积大了、单位面积内受力效果就相对更弱,对皮肤和身体造成的伤害也就更小。(物理满分!)
不过呢,捆绑的方法实在是太多了……
今天裤头就不一一介绍那么仔细辣!而且关注裤头的人当中,肯定也有比我更懂绳艺的~我就不班门弄斧咯,只介绍几个入门级别的简单捆绑方法,没有尝试过的人就学着玩玩看呗:
①双手束缚
②双脚束缚
③手脚束缚
司机的车是上了,要往那儿开就听你们自己的了……
不过要注意一点的是,针对身体不同部位的束缚,可能会对身体造成不同的伤害。比较轻的是留下勒痕以及导致血液流通不畅,严重一些的话可能对肺部以及周围的内脏造成压迫。束缚的过程中,本来人就比较兴奋,如果对肺部的压迫过强,很可能就会因此导致呼吸不畅、失去意识,甚至可能造成生命危险。
所以,在开始之前一定要约定好一个Give-up Sign(放弃的信号),一旦M做了这个动作、给了这个眼神或者说了这个词语,那么此时他的挣扎求生就是真实的、而非正在调情,这个时候S一定要立即停止。
建议束缚时间控制在40分钟之内,最好最好不要超过1个小时,否则发生杯具的可能性就会变得很大啦!
最后当然就是裤头答应大家的大礼包咯~今天我们来玩一个求赞小游戏:
绳缚术是SM的一种方式,也就是说它算是性癖好的一种。那么除了绳艺之外,你们还听说过什么性癖呢?或者你本人有哪一些性癖吗?越精彩越奇葩,一定就会越多赞!
大家在底部的留言板,把你们知道的、或者自己就有的癖好写下来,赞数最高的一位(截止时间为明天裤头推送时)可以获得礼物一份哦!
①只能精选50条留言,所以要回复要趁早!不然就不能显示出来求赞啦。
②尺度过大的留言(例如赤果果地描述性器官和性感受等),是不会被裤头精选出来的哦,因此大家描述的时候要注意措辞,简洁明了、情而不色、理智又动人就最好了。
③因为数量有限,今天不相关的留言裤头就尽量不选出来啦,请大家见谅~不过有想和我说的话或者问题,还是可以写在留言板上发给我的,我在后台可以看到哦!
④今天大家的留言仅作猎奇知识听听就算,大家不要看了今天的推送和留言板、过分追求刺激,贸贸然就陷入各种性癖怪圈哦!分分钟会有危险!乖乖地不要搞事啊!
奖品就是这个
SM毛绒皮革玩具10件套装
很适合新手哦!
好啦我去后台边吃粽子边看你们的留言了……
〖 裤 头 研 究 所 〗
研究非专业不靠谱的两性知识
信不信由你啦
长 按 下 图进 入 性 的 宇 宙 虫 洞
本文来自微信公众账号提交,由微讯啦收录,转载请注明出处。
微信扫码 分享文章

我要回帖

更多关于 求助 的文章

 

随机推荐