前言
一款遊戲除了遊戲內容,"社群"也是可以加進遊戲重要元素之一。現在大多登入都會綁上臉書或是g+,而這篇簡單介紹使用臉書登入與cocos2dx作一個結合的實作。網路上有人介紹EzSocial[1],而我在對EzSocial銜接時,及使是他本身的sample也無法執行。最後還是回到一開始,直接facebook sdk 3.0 結合Android JNI搭起對底層遊戲的橋梁。製作過程容易失敗且過程中會有很多煩雜的事情,至成功登入其實需要有一點耐心。實作上的遇到的問題也會一一列在本文。

實作結果
開啟各位的HelloCpp吧,我們要開始實做了喔!
開發環境
作業系統:windows 7
開發工具:Visual C++ Express,Eclipse 4.2.1
cocos2dx版本:2.2.0
facebook sdk版本:3.0
步驟1. 取得與安裝facebook sdk
稍微google一下"facebook developer",就可以看到Facebook Developers的連結。點選文件(圖2)>Android Developers(圖3)>Download the SDK(圖4)進行sdk的下載。完成下載之後,sdk是一個.zip的解壓縮,解壓縮至你習慣的位置就可以了(圖5,本範例放至D:)。

圖2 臉書開發者頁面

圖3 臉書開發者頁面

圖4 臉書開發者界面

圖5 解壓縮sdk
步驟2. 載入Android Facebook SDK
這步驟基本上可以參考臉書的教學(圖6),如果沒有英文障礙的話裡面應該講的都很清楚。這部分就不詳細說明,簡單的帶過步驟。我們跳過執行sample,若想體驗一下sample的朋友可以至官網文件參考。

圖6 教學連結
開啟Eclipse,開一個新workspace,完成之後點選File>Import進行Facebook SDK的載入(圖7)。

圖7 Eclipse import FacebookSDK的操作
在載入自己遊戲專案之前,請記得也要先import cocos2dx的java喔,全部import進來後,Eclipse左側Package Explorer會有三個package分別是FacebookSDK、libcocos2dx以及自己的由細專案(圖8)。

圖8 Eclipse 的 Package Explorer
步驟3. Facebook端,建立一個App
在上方藍色工具列中點選應用程式,會下拉一個選項叫"製作新應用程式"。繼續點選後會出現Create a New App的視窗,填寫專案內容後按下建立應用程式(圖9),等待一下就會進入專案畫面(圖10)。應用程式編號後面會在Eclipse用到,左邊標籤點選"設定"會進入設定頁(圖11)。包裝名稱與班級名稱要回到Eclipse中去查詢(圖12)。

圖9 臉書開發者頁面

圖10 臉書開發專案畫面

圖11 臉書開發專案設定頁

圖12 Eclipse,對應圖11之說明
步驟4. 編輯Eclipse,設定篇
回到Eclipse,進入我們遊戲的專案。首先開啟res>values>string.xml 這個檔案(圖13),點選Add..按鈕,開啟視窗後點選(S)String,再點選OK關閉視窗。此時會產生新的項目,點一下新的項目,右邊會顯示內容。Name請填寫 app_id (一字不差,請勿亂動)。Value請填入臉書的應用程式編號(請參考圖10綠色框框)。

圖13 Eclipse畫面
開啟AndroidManifest.xml檔案,點選Permissions標籤(圖14),按下Add..按鈕,開新視窗後點選(U)Uses Permission後點OK關閉視窗。左邊點選新出來的項目,右邊內容選擇android.permission.INTERNET。

圖14 Eclipse
點選Application標籤(圖15),下方Application Nodes區塊新增一些內容,按下Add..按鈕,開啟新視窗後點選(M)Meta Data後點OK關閉視窗。左邊出現新選項點選一下,右方會出現內容。Name:com.facebook.sdk.ApplicationId,Value:@string/app_id。

圖15 Eclipse畫面
接下來還要新增一個類別的Node(圖16),同一區塊點選Add..按鈕,彈跳視窗點選(C)Activity後按OK關閉。左方新項目點一下,右方內容...Name:com.facebook.LoginActivity,Theme:@android:style/Theme.Translucent.NoTitleBar。

圖16 Eclipse畫面
步驟5. 編輯Eclipse,程式篇(1),取得編碼KeyHash
開啟主程式部分,修改HelloCpp.java,最上方一定要include facebook sdk的內容(碼1)。
import com.facebook.*; import com.facebook.model.*;
碼1 include facebook sdk
編輯onCreate(..),增加顯示64位元的編碼Key的程式(碼2)
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mInstance = HelloCpp.this;
// Add code to print out the key hash
try {
PackageInfo info = getPackageManager().getPackageInfo(
"idv.shutgun.bombcrash",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d(TAG,"KeyHash: "+Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
}
碼2 onCreate(..)
執行一下遊戲,看一下LogCat(圖17),複製取得KeyHash。回到臉書的專案設定頁(圖11,綠框),將KeyHash貼到Key Hashs欄位中。

步驟6. 編輯Eclipse,程式篇(2),設定Android端JNI通道
我採用的方式是開啟遊戲後,讓遊戲端(cocos2dx層)透過JNI去呼叫Android中類別HelloCpp的loginFB()方法。
回到Eclipse中(碼3),我在HelloCpp類別新增兩個方法分別為loginFB與initFB兩個方法,loginFB是static方法,連結JNI比較簡單,透過該方法去呼叫initFB()。初始與進行login的功能就寫在initFB()中。
public static void loginFB(){
Log.d(TAG,"login FB");
mInstance.initFB();
}
public void initFB(){
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (session.isOpened()) {
Log.i(TAG,"Session is open");
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
Log.e(TAG,"OH! onCompleted!!");
if (user != null) {
Log.e(TAG,"OH! user is null");
//TextView welcome = (TextView) findViewById(R.id.welcome);
//welcome.setText("Hello " + user.getName() + "!");
Log.i(TAG,"Hello, "+user.getId());
Toast.makeText(HelloCpp.this, "Hello, "+user.getName(), Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
碼3 Eclise,HelloCpp類別中的loginFB()與initFB()
步驟7. 編輯C++端,新增JNI窗口
啟動VC,開啟遊戲專案。我們在HelloWorldScene.h新增jni的include。
#include <jni.h>
開啟HelloWorldScene.cpp,新增一個function叫loginFB()
void HelloWorld::loginFB()
{
JniMethodInfo minfo;
bool isHave = false;
isHave = JniHelper::getStaticMethodInfo(minfo,"idv/shutgun/bombcrash/HelloCpp","loginFB","()V");
if(isHave)
{
CCLog("showNativeIAP is Live");
minfo.env->CallStaticObjectMethod(minfo.classID,minfo.methodID);
}
else
CCLog("Call Function fail!!");
}
碼4 VC,JNI連結Android端設計
第6列, getStaticMethodInfo(..)就是用來取得HelloCpp.loginFB()的門票。回傳的值只要為true,接下來就使用CallStaticObjectMethod(..)去執行HelloCpp.loginFB()。
步驟8. 執行
程式寫到這邊就要開始執行啦,第一次啟動時手機一定會彈跳出應用程式權限的同意視窗。按一下同意就可以成功登入嚕!



















留言列表
{{ article.title }}