天天看點

OpenXLive支援 Windows Phone上的SNS 分享

作者:馬甯

OpenXLive SDK 0.9.9下載下傳位址:

<a href="http://developer.openxlive.net/sdk/download/">http://developer.openxlive.net/sdk/download/</a>

現在,很多休閑遊戲都支援使用者将遊戲的精彩畫面分享到社交網絡中,這已經成為了最吸引使用者的新功能。但是開發者如果想實作這個功能,就必須在遊戲中内置不同社交網絡的SDK,還要通過漫長的稽核過程,這對于很多開發者來說,都是不堪重負的。

是以,OpenXLiveSDK 0.9.9.0版提供了SNS分享的功能,無需在軟體中内置各種各樣的社交網絡SDK,而且可以在不修改用戶端的情況下,增加新的SNS分享功能。

目前,我們在全球支援Facebook和Twitter分享,在中國支援新浪微網誌分享,後續還會陸續加入對于人人網和騰訊QQ的支援。

本文将介紹如何使用這一功能,并提供相應的示例代碼。

OpenXLive所有的示例代碼可以在OpenXLive SDK安裝目錄下的.\Sample檔案夾下找到(預設應該在C:\Program Files (x86)\Fulcrum Mobile Networks Inc\OpenXLiveSDK\Sample)。有關本主題的完整示例代碼在該檔案夾下的SNS.zip檔案中,你需要先将其解壓,然後再用Visual Studio 2010打開。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190949593830.png"></a>

該示例包含了在Silverlight和XNA下的詳細實作步驟。

我們首先來看一下,OpenXLive SNS分享的技術架構:用戶端隻需要嵌入OpenXLive SDK 0.9.9或以上版本,就可以實作SNS分享功能了,無需嵌入每一種需要支援的SNS SDK。使用者需要分享的内容會首先發送到OpenXLive的伺服器中,然後由OpenXLive伺服器進行分發,最後顯示在SNS中。需要注意的是,受到SNS網站政策限制。每條分享内容不能同時出現在多個SNS中。

這樣的好處是,當OpenXLive增加新的SNS時,無需修改用戶端的代碼。OpenXLive SNS分享的技術架構,如圖:

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950004287.png"></a>

OpenXLive SNS分享功能的操作步驟,大緻分為下列幾步:

1. 用戶端向OpenXLive伺服器請求目前可以支援的SNS清單;

2. 用戶端向OpenXLive伺服器發送分享内容,并指定發送到哪個SNS中;

3. OpenXLive伺服器首先将内容存儲到OpenXLive Cloud中;

4. 然後通過分發服務,将分享内容發送到指定的SNS中。

為了實作OpenXLive SNS分享功能時,需要使用者首先使用SNS帳号登入,或者使用OpenXLive帳号登入,然後綁定SNS帳号。如果您使用了Facebook帳号登入,也可以綁定Twitter帳号,然後直接在Twitter中發送分享内容。

在實際開發中,開發者需要實作下面的功能:

1. 實作螢幕截圖;

2. 讓使用者預覽釋出的圖檔;

3. 讓使用者能夠編輯自己的心得;

4. 讓使用者選擇釋出到哪個SNS中。

我們并未提供标準的SNS分享界面,隻是在示例代碼中實作了一個例子。這是因為,開發者需要實作與自己遊戲風格一緻的分享界面,可以直接調用API來實作這個界面,而不需要使用标準的SNS分享界面。

接下來,我們來看一下,如果實作SNS分享功能,需要哪些步驟來完成。流程圖如下所示:

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950013665.png"></a>

1. 首先在遊戲界面中實作截圖功能,一般是在界面上有一個拍照按鈕,使用者可以點選該按鈕實作截圖功能;

2. 進入分享界面,将現在可供分享的SNS類别列在界面上;

3. 如果使用者選擇了一個SNS分享遊戲内容,則判斷該使用者是否已經與該SNS建立了連接配接;

4. 如果使用者選擇的SNS未與目前使用者建立連接配接,則彈出SNS連接配接界面,允許使用者連接配接該SNS帳号;

5. 如果使用者連接配接SNS帳号成功,則向伺服器端送出分享内容。

對于開發者來說,這裡有兩個類需要着重介紹一下:SNSProvider和SNSContract。SNSProvider代表的是可供分享的SNS類型,包括了名稱、圖示和連結等資訊;而SNSContract則代表了使用者與SNS之間的連接配接關系。

我們可以通過XLiveGameManager.CurrentSession.SNSProviders屬性,來擷取目前有效的SNS清單;也可以通過MyPlayer.SNSContracts屬性來擷取目前玩家綁定的所有SNS;也可以通過MyPlayer. GetSNSContract方法,根據SNSProvider來擷取對應的SNSContract,如果該使用者未綁定SNS,則傳回為空。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950013043.png"></a>

好了,到這裡,我們就将SNS分享的原理和技術架構介紹完了。接下來,我們來介紹,如果實作一個完整的SNS分享遊戲,包括Silverlight和XNA兩個版本。

打開Visual Studio 2010 ,建立一個OpenXLive Silverlight Game with Startup UI項目,項目名稱輸入OpenXLiveSilverlight,點選Ok,在選擇顯示語言對話框中,選擇預設顯示語言,點選OK。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950025103.png"></a>

首先你需要在App.cs中填入正确的Application Secret Key。

#error Please full your game Secret Key in below code

private string APISecretKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx";

擷取Secret Key的方法,請參考《在開發者網站上建立OpenXLive遊戲》,連結如下:

<a href="http://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx">http://wiki.openxlive.net/Tutorial-4-Create-OpenXLive-Game-in-website.ashx</a>

有關如何将OpenXLive的服務,加入到您已有的遊戲中去,請參考:

OpenXLive Silverlight 入門

OpenXLive XNA 入門

首先要添加幾張圖檔,右鍵項目 選擇 Add -&gt; Existing item…,找到示例代碼中的OpenXLiveSilverlight檔案夾下的Capture.png、GameBackPortrait.jpg、UpdateBackPortrait.jpg點選Ok。當然,你也可以使用自己的圖檔,并在後面的代碼中将圖檔名稱改為自己的圖檔。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950066.png"></a>

由于本次示例我們使用了ListPicker控件,是以需要先添加Microsoft.Phone.Controls.Toolkit.dll引用。

接着我們添加一個SNS分享頁面,右鍵項目 選擇 Add -&gt; New item…,選擇Windows Phone Portrait Page,命名為UpdateStatusPage.xaml。

接下來,我們要實作遊戲界面和螢幕截圖功能。首先我們要為遊戲界面提供一個截屏按鈕和相應的提示。打開MainPage.xaml,在适當的位置添加如下代碼:

所謂CapGrid,就是我們截圖的Grid區域,而ContentPanel則是用于放置截圖按鈕的Grid區域。

如果想檢視完整的示例代碼,請直接通路OpenXLiveSNS工程。MainPage界面如下:

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/20120719095008430.png"></a>

左上角為截圖的Button按鈕,玩家點選該按鈕進行截圖,并導航至UpdateStatusPage頁面。

然後,打開MainPage.xaml.cs代碼檔案,實作具體的截屏功能。

在這部分代碼中,我們使用了WriteableBitmap對象,從CapGrid中擷取了需要截取的圖像。然後,調用SaveJpeg将其儲存到一個MemoryStream對象中,最後轉存到一個byte數組中。

請注意:if語句用來判斷目前是否有可用的SNSProvider ,隻有存在SNSProvider時才能進行SNS分享,是以這個判斷是必須的。

然後,我們需要調用UpdateStatus方法,将剛剛捕獲的圖像,傳遞給UpdateStatusPage頁面,并導航到該頁面,進行SNS分享。

到這一步MainPage中的功能就實作完畢。接下來需要完成分享頁面并實作相應邏輯。

在分享頁面中我們需要一個Image控件用于顯示目前分享的圖檔的縮略圖,一個TextBox用于輸入分享的文本内容,一個ListPicker控件用于使用者選擇要分享到哪個SNSProvider。

打開UpdateStatusPage.xaml檔案,添加如下代碼,完整代碼請檢視工程:

此時的分享界面應該如下圖所示:

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950096918.png"></a>

打開UpdateStatusPage.xaml.cs檔案,首先在檔案頂部添加如下引用:

然後,添加如下屬性,以表示要分享的圖檔。

然後将構造函數替換為如下代碼:

在頁面的構造函數中,我們可以通過XLiveGameManager.CurrentSession.SNSProviders屬性得到目前有效的SNS清單,并将其綁定到ListPicker控件中。

ShowPicture方法用于顯示分享圖檔的縮略圖。

根據SNS分享功能的原理,我們需要在分享SNS内容前,判斷使用者是否連接配接對應SNS帳号。

首先,我們從lisPickerSNS控件中擷取到使用者要釋出的SNS Provider對象;然後,擷取到目前使用者的MyPlayer對象;接下來,調用MyPlayer的GetSNSContract方法,傳回SNS對應的SNSContract對象。

如果能夠傳回SNSContract對象,說明目前使用者和SNS建立了連接配接關系,直接調用Share方法釋出資訊;如果傳回空,則說明目前使用者和SNS未建立連接配接,我們需要調用XLiveSLFormManager的ShowSocialConnect方法,來顯示SNS連接配接界面。

添加如下代碼用于處理分享按鈕的點選事件:

說明:隻有當使用者已經與選擇的SNSProvider連接配接才能成功分享。

首先通過MyPlayer的GetSNSContract方法擷取SNSContract,該方法有一個SNSProvider

的參數。如果傳回值不為null,則表示該使用者已與該SNSProvider連接配接,此時可以調用Share方法分享内容;如果傳回值為null,則表示該使用者未與該SNSprovider連接配接,此時應該調用XLiveSLFormManager的ShowSocialConnect靜态方法跳轉到連接配接頁面與該SNSprovider建立連接配接。

XLiveSLFormManager的靜态方法ShowSocialConnect如下:

XLiveSLFormManager.ShowSocialConnect(PhoneApplicationPage page, SNSProvider provider, EventHandler&lt;SocialConnectEventArgs&gt; connectCompleted)

該方法有三個參數:第一個表示目前的頁面,第二個參數為需要與該使用者建立連接配接的SNSProvider,第三個參數為連接配接頁面關閉并傳回時的處理函數。該處理函數如下:

在該處理函數中你應該判斷SocialConnectCompletedEventArgs參數中的Contract是否為null。如果為null,表示未連接配接;如果不為null,則表示使用者與SNS帳号連接配接成功了,我們就可以大膽的分享SNS消息了。

接下來,我們就要實作SNS分享的功能了。我們需要建立一個MyStatus對象,建立對象需要SNSContract參數,然後調用UpdateStatus方法來釋出SNS消息。

SNS消息的内容是由開發者自定義的,OpenXLive不會有任何限制。作為最佳實踐,我們建議您可以在SNS消息中增加遊戲的名稱和下載下傳連結,這樣有助于您的遊戲獲得更多使用者。

接着在UpdateStatusPage.xaml.cs檔案中添加如下方法:

說明: Share方法用于分享内容和圖檔。SNS分享時,你需要使用指定的SNSContract執行個體化一個MyStatus對象,并調用MyStatus的UpdateStatus方法,該方法有兩個重載:

MyStatus. UpdateStatus(string content)

将文本内容分享到指定的SNS。

MyStatus. UpdateStatus(string content, byte[] picture)

将圖檔和文本内容分享到指定的SNS。

在完整代碼中,我們還需要處理UpdateStatus方法的完成事件。添加status_SNSUpdateStatusCompleted 方法為MyStatus 的UpdateStatusCompleted事件處理程式,以在分享完成後進行處理。

現在,SNS分享功能就實作完畢,編譯并運作程式,我們來分享一張圖檔。

1. 運作程式點選New Game。

2. 點選左上角的截圖按鈕。

3. 輸入分享的内容,并選擇一個SNSProvider,此次我們選擇Twitter。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950102641.png"></a>

如果連接配接成功将會傳回到分享頁面并分享該圖檔到Twitter。

5. 登陸Twitter檢視剛才分享的圖檔。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/20120719095013425.png"></a>

打開Visual Studio 2010 ,建立一個OpenXLive Game with Startup UI項目,項目名稱輸入OpenXLiveXNA,點選Ok,在選擇顯示語言對話框中,選擇預設顯示語言,點選OK。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950143914.png"></a>

首先你需要在Game1.cs中填入正确的Application Secret Key。

然後注釋掉#error那行代碼,此時程式将能夠正常編譯。

接下來我們需要添加幾張圖檔,右鍵Content項目 選擇 Add -&gt; Existing item…,找到示例代碼中OpenXLiveXNAContent檔案夾下的ButtonChange_50.png、ButtonOk_50.png、 Capture.png、GameBackPortrait.jpg、GameBackLandscape.jpg、UpdateBackPortrait.jpg、UpdateBackLandScape.jpg點選Ok。當然,你也可以使用自己的圖檔,并在後面的代碼中将圖檔名稱改為自己的圖檔。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950152735.png"></a>

在遊戲中我們需要一個用于截圖的按鈕和一個分享圖檔的界面。當點選截圖按鈕後将跳轉到該分享界面,是以我們需要建立一個Button和一個XLiveForm,我們從示例代碼中添加這兩個類,右鍵遊戲項目選擇 Add -&gt; Existing item…,找到示例代碼中XNA遊戲項目檔案夾下的Button.cs和UpdateStatus.cs兩個檔案,點選OK。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950154273.png"></a>

我們先在Game1.cs中,實作遊戲截圖和分享界面對象的建立。

首先在.cs檔案頂部添加如下引用

然後在類中添加如下字段:

以上變量的作用是:button 為遊戲界面左上角的截圖按鈕;background 表示遊戲背景;_Capture用于判斷是否點選了截圖按鈕;captureImage用于儲存截圖。

在LoadContent方法中,加載背景圖檔,并建立Button對象:

在Game1.cs類中添加Button的事件處理方法:

button_Click方法為截圖按鈕的Click事件處理程式。如果使用者點選Button,則将_Capture變量設定為true,真正的圖檔捕捉則是在Update方法中完成的。

Capture方法用于遊戲截圖,具體的實作方法是,建立一個與螢幕大小相等的RenderTarget2D對象;然後通過GraphicsDevice的SetRenderTarget方法将RenderTarget2D對象設定為繪制表面,之後的所有操作都會繪制到新建立的RenderTarget2D對象中,在完成繪制後,我們還需要再次調用GraphicsDevice的SetRenderTarget方法,這次的參數為null,再次繪制時,效果就會出現在螢幕上了。

然後,建立一個MemoryStream對象,通過RenderTarget2D對象的SaveAsJpeg方法,将剛才儲存的對象,儲存到記憶體中。最後,再調用Texture2D的FromStream對象,将剛才的繪制結果儲存到一個Texture2D對象中。

最後,在 Draw方法中,除了正常的繪制代碼外,還要添加下面的代碼:

在Draw方法中,如果_Capture變量為true,則調用Capture方法來捕捉遊戲的目前畫面,然後建立UpdateStatus窗體的執行個體,并且調用Show方法來顯示該窗體。

然後,我們來看一下分享界面的實作,因為XNA中沒有窗體的概念,是以,我們使用了OpenXLive中的XLiveForm作為分享界面的基類。

UpdateStatus類派生自XLiveForm類,UpdateStatus類中 BeginUpdateStatus方法用于分享圖檔,代碼如下:

SNS分享時,你需要執行個體化一個MyStatus對象,并調用MyStatus的UpdateStatus方法,該方法有兩個重載:

MyStatus. UpdateStatus(string content

你需要注冊MyStatus 的UpdateStatusCompleted事件處理程式,以在分享完成後進行處理。

UpdateStatus類中分享按鈕的Click事件處理程式如下:

的參數。如果傳回值不為null,則表示該使用者已與該SNSProvider連接配接,此時可以調用BeginUpdateStatus方法分享内容;如果傳回值為null,則表示該使用者未與該SNSprovider連接配接,此時應該調用XLiveFormFactory的ShowSocialConnect方法跳轉到連接配接頁面與該SNSprovider建立連接配接。

XLiveFormFactory的ShowSocialConnect方法如下:

ShowSocialConnect(SNSProvider provider, EventHandler&lt;SoicalConnectCompletedArgs&gt; socialConnectCompleted)

該方法有兩個參數:第一個參數為需要與該使用者建立連接配接的SNSProvider,第二個參數為連接配接頁面關閉并傳回時的處理函數。該處理函數如下:

在該處理函數中你應該判斷SoicalConnectCompletedArgs參數中的Contract是否為null。如果為null,表示未連接配接;如果不為null,則表示使用者與SNS帳号連接配接成功了,我們就可以大膽的分享SNS消息了。

現在,XNA遊戲的SNS分享功能就實作完畢,編譯并運作程式,我們來分享一張圖檔。

1、運作程式點選New Game。

2、點選左上角的截圖按鈕。

3、輸入分享的内容,并選擇一個SNSProvider,此次我們選擇Twitter。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950173061.png"></a>

4、點選Share按鈕,此時将會跳轉到連接配接頁面,輸入你的Twitter賬号和密碼進行連接配接。

<a href="http://images.cnblogs.com/cnblogs_com/aawolf/201207/201207190950188469.png"></a>

我們介紹了OpenXLive的SNS分享功能,比起其他功能來說,OpenXLive SNS分享功能的操作和代碼是比較多的,是以我們盡可能詳細地給出了所有的描述和代碼。這樣做的主要原因,是希望使用者能夠編寫符合自己遊戲風格的SNS分享界面。

好了,趕緊把OpenXLive SNS分享功能加入到你的遊戲中去吧!更多的玩家正在等着呢!

本文轉自馬甯部落格園部落格,原文連結:http://www.cnblogs.com/aawolf/archive/2012/07/19/2598721.html,如需轉載請自行聯系原作者