在 Cocos creator 中使用 steam api , steam 成就的方法

目标:在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 请购买 然后 赞叹 然后 好评 吧……

7赞

@1349363557

卧槽大神!!!太叼了芜湖
帮助非常巨大!!
!!!谢谢
这就去买

已经买了!也帮你联系一下引擎开发团队就是说

感谢购买 哦

以及…
你实际测试了没…
我这个都是以前弄得
现在是凭着回忆写得 流程…也不知道中间缺不缺 步骤

mark~