Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作

2023-11-15

最近也是换了份新工作.搞棋牌平台了...标新立异呵呵.哥哥使用node.js来开发这套东东..公司什么底子也没有.在西安就这样吧......

最近正在搞 扑克... 由于是服务器很多逻辑都是js的所以..希望cocos2d-x的客户端也可以js搞起..但是已经用c++写的很多了.怎么办呢......这就牵扯js和c++的交互问题了.


需求:

1.c++可以注册到javascript里面函数.

2.然后js可以调用这个函数.

3.并且能收到这个函数的返回值.

4.c++可以主动调用这个函数并传入参数.


呵呵.写到这块是不是感觉和Lua神似了...对呀.JS也是脚本..最近我的新宠. 回头TS也要准备支持Js的调试的.尽请期待.书归正传..先谈谈.cocos2d-x搞什么飞机了.让c++可以使用js的...答案是.spidermonkey这个东东...哦.火狐的js心脏啊..懂了吧..好了.这个蜘蛛猴子.被封装的很友好了.所以咱们直接可以用cocos2d-x的ScriptingCore::getInstance()来获取到有用的东东.当然注册函数这个cocos2d-x没给...还有好多函数是个 直接return 0 我去..看代码没把我笑死哈哈...


有图有真相...哥哥从来不骗人.!~好了.不说这个了..如果说写代码的时候感觉见鬼了..看看源码还是有好处的.


1.如果想在c++里面注册一个JS函数..需要使用JS_DefineFunction.这个函数是 蜘蛛猴的函数..咱们可以直接使用的.比如我想闹个叫TS_Out的函数.然后有n个参数.那么就可以这样写.

[cpp]  view plain copy
  1. void TSScriptJS::Init()  
  2. {  
  3.     ScriptingCore* sc = ScriptingCore::getInstance();  
  4.     JSFunction* pF = JS_DefineFunction(sc->getGlobalContext(), sc->getGlobalObject(), "TS_JSOut",  
  5.         TSScriptJS::TS_JSOut, 0, JSPROP_READONLY | JSPROP_PERMANENT);  
  6. }  

下面是回调:
[cpp]  view plain copy
  1. JSBool TSScriptJS::TS_JSOut( JSContext *cx, uint32_t argc, jsval *vp )  
  2. {  
  3.     if (argc > 0) {  
  4.         JSString *string = NULL;  
  5.         JS_ConvertArguments(cx, argc, JS_ARGV(cx, vp), "S", &string);  
  6.         if (string) {  
  7.             JSStringWrapper wrapper(string);  
  8.             //这块就有值了  
  9.         }  
  10.     }  
  11.     return JS_TRUE;  
  12. }  

然后JS里面就可以这样调用了.

[javascript]  view plain copy
  1. TS_JSOut("Timeshift This is Awesome Engine!");  
 
呵呵原谅我的自恋..... 
偷笑 
 

2.c++可以主动调用这个函数并传入参数.这个功能非常重要.因为c++为主要的开发中,主要是需要js的这种交互操作的.就是说..c++需要js里面的值

[cpp]  view plain copy
  1. jsval TSScriptJS::JSCallFuncName(const char *name, int count, ...)  
  2. {  
  3.     ScriptingCore* sc = ScriptingCore::getInstance();  
  4.     int argc = count;  
  5.     jsval res;  
  6.     jsval *argv = new jsval[count];  
  7.     va_list insvalist;  
  8.     va_start(insvalist,count);  
  9.     for (int i = 0; i < count; ++i)  
  10.     {  
  11.         argv[i] = std_string_to_jsval(sc->getGlobalContext(),std::string(va_arg(insvalist,const char *)));  
  12.     }  
  13.     va_end(insvalist) ;  
  14.     JS_CallFunctionName(sc->getGlobalContext(), sc->getGlobalObject(), name, argc, argv, &res);  
  15.     delete [] argv;  
  16.     return res ;  
  17. }  
这个帅的掉渣的函数意思就是说..哦 name就是函数名字了. count就是有几个参数.然后后面我为了方便都传入的字符串..您可以随心而乐的.如果不怕麻烦..呵呵.

然后会返回一个 jsval.这个是个非常强大结构..他可以是任何类型的东西.spidermonke给了很多函数.cocos2d-x也给了很多来转化这个类型到熟知的c++类型.

[cpp]  view plain copy
  1. jsval pR = TSScriptJS::GetSingleTon()->JSCallFuncName("TS_JSMain",3,"haha!","hoho!","heihei!");  
  2. JSString* pS = JS_ValueToString(ScriptingCore::getInstance()->getGlobalContext(), pR);  
  3. JSStringWrapper pW(pS);  
  4. CCLog(pW.get().c_str());  
好了现在定义这个叫做 TS_JSMain的函数在JS中吧.

[javascript]  view plain copy
  1. function TS_JSMain(v1,v2,v3) {  
  2.     try  
  3.     {  
  4.         cc.log(v1+v2+v3);  
  5.     }  
  6.     catch(e)  
  7.     {  
  8.         cc.log("出事了!!" + e);  
  9.         return;  
  10.     }  
  11.   
  12.     return "TimeShift is Awesome!";  
  13. }  

好了变量什么的读取和写值.请见下一节..!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作 的相关文章

随机推荐

  • 注册adobe账号成功访问被拒绝

    安装photoshop2020后需要登录adobe账号 登录adobe账号成功但提示访问被拒绝 出现这种情况建议换个邮箱重新注册 而且国家注意不要选中国
  • XO

    时钟信号是处理器电路开始工作的基本条件之一 在电路中有着非常重要的作用 当智能手机接上电源之后 电源电路两端就会产生3 7V的电压 这个电压直接为处理器内部的振荡器供电 随即时钟电路开始工作 为处理器芯片内部的微处理器电路中的开机模块提供所
  • SpringBoot项目创建报:java.lang.ClassNotFoundException: org.springframework.boot.SpringApplication错误的解决方案

    第一次创建SpringBoot项目结果出现了不少错误 其他错误都通过百度的方式得到解决 唯独这个错误困扰我很久了 而且百度上没有对于这种错误的解决方案 所以给出这种错误的解决方案 虽然明显知道是jar包问题 不管怎么clean怎么的还是没能
  • 数据结构 - 队列 && 环形队列(循环队列)

    文章目录 队列介绍 数组模拟队列设计思路 数组模拟队列代码实现 环形队列相关知识说明 队列长度公式推导 数组模拟环形队列代码实现 队列介绍 队列是一个有序列表 可以用数组或是链表来实现 遵循先入先出的原则 即 先存入队列的数据 要先取出 后
  • yum安装 ssh:Failed to download metadata for repo ‘AppStream‘

    通过yum安装ssh执行命令 yun install openssh openssh server openssh clients 会报错 Failed to download metadata for repo AppStream 各种尝
  • 升压稳压原理

    文章目录 降压稳压 升压稳压 芯片的作用 储能公式 降压稳压 降压稳压原理相对简单 将芯片当成一个 自动可变电阻 即可 这样就可以保证输出为恒定的电压值 不过需要注意的是 这块 自动可变电阻 有极限值 比如对于7805来说 降压差不可少于2
  • 基于mnist数据库的CNN卷积神经网络手写数字识别MATLAB仿真

    目录 一 理论基础 二 核心程序 三 仿真结论 一 理论基础 手写数字识别是计算机视觉领域的一个重要问题 它在很多应用中都有广泛的应用 如自动化识别 自然语言处理 人机交互等 基于MNIST数据库的CNN卷积神经网络手写数字识别是其中一种常
  • 谷歌开源图片压缩算法Guetzli实测体验报告

    作者 王亚军 编辑 宋秉金 王亚军 腾讯工程师 负责OMG无线新闻 腾讯视频图片服务等的业务运维工作 阅读原文 更多技术干货 请访问腾云阁 谷歌大神又出开源新技术啦 这次是对JPEG格式的图片采用全新算法重新编码 输出的图片还是JPEG但是
  • Docker入门笔记

    Docker 技术的三大核心概念 镜像 Image 容器 Container 仓库 Repository 在线练习docker https labs play with docker com URL 工具 curl 的用法指南 https
  • Ant Design Pro 关闭mock数据 改成使用服务器API

    Ant Design Pro中默认是使用了mock数据的 由于在做项目之前没有学习过react dva redux umi这些基础组成知识 对我这个新手来说确实比较辣手 首先修改config目录下config js的proxy属性 将我们的
  • [激光原理与应用-35]:《光电检测技术-2》- 光学测量基础 - 认识光源

    目录 一 对光源的基本要求 二 光源的定义 三 光源的分类 四 产生途径 五 电光效应发光 5 1 发展历史 5 2 发展前景 5 3 主要种类 一 对光源的基本要求 二 光源的定义 光源是一个物理学名词 能发出一定波长范围的电磁波 包括可
  • ffmpeg + x264+ x265 + libde265 + opengl es display

    这是手机直播推送流 https github com wangzuxing MyFFmpegH264H265YUVOpenGL https github com jacke121 MyFFmpegH264H265YUVOpenGL
  • 经典的数学问题,“天平称重问题”——java代码实现,原理及解析

    天平称重原理 首先 我们知道 一个数 N 的二进制表示中最高位的位数加一 就是 N 在二进制下的位数 也就是最高位是第几位 例如 如果 N 10 那么 N 的二进制表示是 1010 其中最高位是第四位 所以 N 在二进制下的位数为 4 接下
  • LeetCode 每日一题 2023/8/28-2023/9/3

    记录了初步解题思路 以及本地实现代码 并不一定为最优 也希望大家能一起探讨 一起进步 目录 8 28 57 插入区间 8 29 823 带因子的二叉树 8 30 1654 到家的最少跳跃次数 8 31 1761 一个图中连通三元组的最小度数
  • 利用Dom4j解析xml文档

    本次我将学习利用Dom4j中的SAXReader 还有个是DOMReader 来解析xml 文档 解析的xml为 test xml 源码如下 lt 学生名册 gt lt 学生 学号 1 gt lt 姓名 gt 张三 lt 性别 gt 男 l
  • but no declaration can be found for element 'aop:aspectj-autoproxy'.

    1 错误描述 Multiple annotations found at this line cvc complex type 2 4 c The matching wildcard is strict but no declaration
  • Java设计模式(25):责任链模式(职责链模式)

    25 责任链模式 25 1 问题引入 采购需求 采购员需要采购一批教学器材 对器材采购金额有分级审批权限 如果金额小于等于3000元 由教学主任审批 0 lt x lt 3000 如果金额小于等于10000元 由院长审批 3000 lt x
  • 服务器网站关联数据库,web服务器如何与数据库关联

    web服务器如何与数据库关联 内容精选 换一换 通过PostgreSQL客户端连接实例的方式有非SSL连接和SSL连接两种 其中SSL连接通过了加密功能 具有更高的安全性 登录弹性云服务器 创建并登录弹性云服务器 请参见 弹性云服务器快速入
  • 【Transformer】13、Augmented Shortcuts for Vision Transformers

    文章目录 一 背景 二 动机 三 方法 3 1 增强残差连接 3 2 使用循环映射进行高效实现 四 效果 论文链接 https arxiv org abs 2106 15941 代码链接 未开源 一 背景 Transformer 已经在计算
  • Cocos2d-x的SprideMonkey的JavaScript与C++的交互(一) - 函数操作

    最近也是换了份新工作 搞棋牌平台了 标新立异呵呵 哥哥使用node js来开发这套东东 公司什么底子也没有 在西安就这样吧 最近正在搞 扑克 由于是服务器很多逻辑都是js的所以 希望cocos2d x的客户端也可以js搞起 但是已经用c 写