目标:在creator做的 windows版游戏中 使用steam api
流程概要:
一 js与c++ 通信
二 c++ 集成steam api
三 js调用steam api
四 调试
五 请购买我的游戏支持我,我的游戏的黑科技是 手机体感遥控电脑游戏
注意:使用steam api 是一个 复杂的流程,需要完成以下所有步骤后 才能达到 执行exe 调试的目的. 所有流程缺一不可
具体:
一 js与c++ 通信
使用 jsb , 此处仅给出代码与简介 详细请去看creator 官方文档 搜索 jsb即可
首先,在 js 代码中,当我 想要 触发某个成就时,我就执行以下 js代码
try{ js_do_chengjiu (7) } catch(e){}
//增加个 try 避免网页调试时出问题, 其中的 参数7 是你想触发哪个成就的编号
然后打开 游戏引擎 生成的 c++ 项目中的 AppDelegate.cpp 文件 ,我懒,我所有代码都写在了这里, 你不懒你可以自己 新建类 或写在别的什么地方
在 AppDelegate.cpp 增加一个方法 代码如下
static bool js_do_chengjiu (se::State& s) // 此方法 接收 js发送来的 成就代号
{
const se::ValueArray& args = s.args();//这句不用理解,记住固定搭配就行了
int argc = (int)args.size();//这句不用理解,记住固定搭配就行了
int16_t arg1 = args[0].toInt16();//这句不用理解,记住固定搭配就行了
//这时arg1 就是你在js里发送来的数字参数 比如说上面的7
switch (arg1) { //根据参数 执行不同的内容…
case 0:
break;
case 7:
// 这里的具体代码 请看下面的 第三段落
cocos2d::log("I am javascritp 77777777 ");
break;
}
return true;
}
SE_BIND_FUNC(js_do_chengjiu); //这句话 字面意思是绑定 你建立的c++函数(js_do_chengjiu),具体作用就不用仔细追究了,就记住固定搭配就完了.
现在 我们建立好了 一个供js调用的函数.
然后 我们要去找到 游戏引擎生成的以下这个函数:
bool AppDelegate::applicationDidFinishLaunching()
这个函数的第一行 大概是
se::ScriptEngine * main_se = se::ScriptEngine::getInstance();
因为我自己改过这里所以我不记得 引擎生成原句子里 是不是 main_se 了
反正目的是 找到 main_se 这玩意
然后在 bool AppDelegate::applicationDidFinishLaunching() 函数的最后边 加入下面的代码
se::Object* globalObj = main_se /*看好了这就是main_se*/ ->getGlobalObject();
globalObj->defineFunction("js_do_chengjiu ", _SE(js_do_chengjiu));
//上面这两句话的意思就是 在js对象里定义一个 js_do_chengjiu函数并把这个函数与你刚才在c++定义的 js_do_chengjiu函数 连接起来
至此 你就能在 js里 执行 try{ js_do_chengjiu (7) } catch(e){} 了
二 c++ 集成steam api
1首先把从 steam 中 下载的 steam sdk 文件解压
2然后在里面找到 public 文件夹 再找到 steam文件夹
3把这个文件夹复制到你的项目所在的位置
4 打开vs中的 解决方案资源管理器 在里面添加你刚刚复制的steam文件夹
6 这时你就可以在c++代码中 引用头文件了
#include "steam/steam_api.h"
每个需要使用steam api的 .cpp 文件中都要引用头文件…这个不用说了把
然后 你就可以用下面的代码 初始化 你的steam api 了 , 初始化的代码要写在 整个程序的最初的入口处,原因后面说…
if (SteamAPI_RestartAppIfNecessary(你的steam app id))
{
cocos2d::log("______________________RestartApp no");
} else {
cocos2d::log("_____________________RestartApp ok");
}
if (!SteamAPI_Init())
{
cocos2d::log("__________SteamAPI_Init__erro__");
} else {
cocos2d::log("______init______ok");
}
SteamUserStats()->RequestCurrentStats();
7 这时还需要一个动作,你的exe文件才能执行, 那就是,把 steam sdk 文件中的 redistributable_bin 文件夹的 steam_api.lib , steam_api.dll 放入你的项目生成的文件夹中,例如 Debug.win32 或者 Release.win32 如果你的目标平台不是win32 , 那么就在redistributable_bin 文件夹找对应平台的文件并复制
8 最后,关键的大坑是, 初始化 steam 要放在整个程序的最前面,否则会有冲突(好像和 gl.h冲突),所以 我把它放在了 main.cpp 文件 中的
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
这个方法 的第一句.
三 js调用steam api
首去 steam 的后台 设置好成就,
进入应用管理员-统计与成就-成就-新成就
在 API 名称/进度状态 一栏中 自己编一个api名称,比如 我这里是
“cj_7”
填写好成就文字和图片,其他所有都保持默认 保存
Js代码:
try{ js_do_chengjiu (7) } catch(e){}
c++代码:
static bool js_do_chengjiu (se::State& s) // 此方法 接收 js发送来的 成就代号
{ const se::ValueArray& args = s.args(); //这句不用理解,记住固定搭配就行了
int argc = (int)args.size();//这句不用理解,记住固定搭配就行了
int16_t arg1 = args[0].toInt16(); //这句不用理解,记住固定搭配就行了
SteamUserStats()->RequestCurrentStats(); //初始化steam状态,(有可能这句话是steam排行榜用的,steam成就用不上,我不记得了)
switch (arg1) { //根据参数 执行不同的内容…
case 0:
break;
case 7:
SteamUserStats()->SetAchievement("cj_7"); //激活 di为 "cj_7" 的成就
break;
}
SteamUserStats()->StoreStats(); //更新成就,弹出右下角对话框
return true;
}
四调试
1打开steam客户端
2 参照 Steamworks API Overview (Steamworks Documentation) 创建 steam_appid.txt 并放入你的exe旁边.
3 打开你的exe程序
4看看成就出来没…
5 参照 Stats and Achievements (Steamworks Documentation) 在steam 控制台 输入
achievement_clear
reset_all_stats
命令 就 可以清除已经获得的成就
五
我的游戏名字叫 <音符之光传说>
所拥有的黑科技是 可以手机wifi 连接电脑,用手机当体感设备,体感玩这个音乐游戏…
价格是16 请购买 然后 赞叹 然后 好评 吧……