Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第1张

http://blog.csdn.net/alamiye010/article/details/6533096


最后還剩下游戲入口部分,Silverlight是客戶端插件,因此首選WCF作為它與服務器端數據庫的橋接。撇去UI方面華麗的動態角色創建與選擇不再多說,本節的重點便是在教程Demo的基礎上整合進基於WCF的注冊與登陸等操作,使之最終成為一款相對完整而五臟俱全的RPG作品。

依舊鍾情於LINQ,因此LINQ to SQL成為我操作數據庫的首選。強烈建議大家首先參考這篇文章:數據庫LINQ TO SQL在Silverlight中的應用(WCF) ,其中的所有細節都已闡述得相當詳細。如果你的電腦中存有之前的Demo源碼,那么接下來你可以按照下面的步驟跟着我一步步從零開始搭建游戲的登陸部分,真真切切的體會WCF技術在Silverlight中的常規應用。

第一步:依照游戲中角色注冊、創建、相關信息及登錄等需求設計數據庫,並編寫好相應可能會用到的增刪改查等存儲過程(本節Demo源碼中附帶了名為FS3.sql的數據庫文件,表和存儲過程都在其中)。

第二步:在Silverlight的寄主Web項目中右鍵->添加新項目->LINQ to SQL映射類,這里我取名為L2S.dbml:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第2张

第三步:打開VS視圖中的服務器資源管理器,右鍵添加SQL連接到FS3(SQL版本最好2005以上)后將其中的表和存儲過程等均拖到L2S.dbml的設計窗口中形成大家再熟悉不過的映射:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第3张

第四步:此時便可編寫WCF操作類了,在Silverlight的寄主Web項目中右鍵->添加WCF服務,取名為WCFService.svc:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第4张

需要特別注意的是帶返回類型的存儲過程需要修改其相應屬性為表實體,否則后面的邏輯查找不到:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第5张

第五步:編寫具體操作邏輯,搞過WCF開發的朋友此處可完全忽略,超級簡單;沒搞過的也很容易看懂,具體就不多說啦,直接列代碼:

    [ServiceContract(Namespace = "")]
    [AspNetCompatibilityRequirements(RequirementsMode 
= AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(IncludeExceptionDetailInFaults 
= true)]
    
public class WCFService {
        [OperationContract]
        
public void DoWork() { }

        
/// <summary>
        
/// 添加新用戶(添加過程中字符型超出限制長度則自動截取)
        
/// </summary>
        
/// <returns>新用戶的ID,0則表示失敗</returns>
        [OperationContract]
        
public long InsertUser(string userName, string password, string realName, string idCard, string eMail, string address) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return Convert.ToInt64(dc.p_InsertUser(userName, password, realName, idCard, eMail, address, """").ReturnValue);
            }
        }

        
/// <summary>
        
/// 用戶資料驗證
        
/// </summary>
        
/// <param name="userName">用戶名</param>
        
/// <returns>0表示不存在</returns>
        [OperationContract]
        
public int CheckUserExist(string userName) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_CheckUserExist(userName);
            }
        }

        
/// <summary>
        
/// 用戶登陸驗證
        
/// </summary>
        
/// <param name="userName">用戶名</param>
        
/// <param name="password">密碼</param>
        
/// <returns>0表示不匹配</returns>
        [OperationContract]
        
public int UserLogonValidate(string userName, string password) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_CheckUserLogon(userName, password);
            }
        }

        
/// <summary>
        
/// 檢查角色是否已存在
        
/// </summary>
        
/// <param name="name">角色名</param>
        
/// <returns>0表示不存在</returns>
        [OperationContract]
        
public int CheckRoleExist(string name) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_CheckRoleExist(name);
            }
        }

        
/// <summary>
        
/// 檢查用戶創建的角色數量
        
/// </summary>
        
/// <param name="userName">用戶名</param>
        
/// <returns>角色數</returns>
        [OperationContract]
        
public int GetUserRoleNum(string userName) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_GetUserRoleNum(userName);
            }
        }

        
/// <summary>
        
/// 添加新角色
        
/// </summary>
        
/// <returns>新角色的ID,0則表示失敗</returns>
        [OperationContract]
        
public long InsertRole(string userName, string name, byte avatar, byte sex, byte occupation, byte roleLevel, long experience, long mapID, string lastIP, string remarks) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return Convert.ToInt64(dc.p_InsertRole(userName, name, avatar, sex, occupation, roleLevel, experience, mapID, lastIP, "").ReturnValue);
            }
        }

        
/// <summary>
        
/// 根據用戶名獲取該用戶的所有角色
        
/// </summary>
        
/// <param name="userName">用戶名</param>
        
/// <returns>創建的所有角色</returns>
        [OperationContract]
        
public List<Role> GetRoleByUserName(string userName) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_GetRoleByUserName(userName).ToList<Role>();
            }
        }

        
/// <summary>
        
/// 刪除角色記錄
        
/// </summary>
        
/// <param name="roleName">角色名</param>
        
/// <returns>失敗0,成功1</returns>
        [OperationContract]
        
public int DeleteRole(string roleName) {
            
using (L2SDataContext dc = new L2SDataContext()) {
                
return dc.p_DeleteRole(roleName);
            }
        }

    }

 

第六步:也是最后一步,在RPGEffectsDemo項目中右鍵添加服務引用(Service References),然后檢索到WCFService.svc完成即可。接着發布網站,並在服務器端配置好IIS,整個流程到此結束。

參照如上步驟搭建的WCF框架,如果服務器(IIS)或數據庫相關數據參數發生變動則僅需修改以下兩個文件:ServiceReferences.ClientConfig和Web.config,具體位置如下,參數很好理解,尤其是搞過這方面開發的朋友更無須多說:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第6张

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第7张

一切OK后,以游戲登陸時輸入用戶名與密碼的窗體為例,我們可通過類似以下的代碼創建WCF連接以及處理相應邏輯:

                WCFServiceClient wcfServiceClient = new WCFServiceClient();
wcfServiceClient.UserLogonValidateAsync(userName.Text.Trim(), GlobalMethod.Encrypt(pwd.Password));
                wcfServiceClient.UserLogonValidateCompleted 
= (wcfs1, wcfe1) => {
                    
if (wcfe1.Result != 0) {
                        LoginManager.UserName 
= userName.Text.Trim();
                        
if (Login != null) { Login(thisnull); }
                    } 
else {
                        LoginManager.loading.Hide();
                        LoginManager.loginTip.Show(GetLanguagePackContent(
11), LoginTipMode.TipOnly);
                    }
                    wcfServiceClient.CloseAsync();
                };

與ASP.NET頁面設計類似,游戲中比如語言選擇、版本說明、登陸、注冊、角色創建、角色選擇、物品窗口、屬性窗口等每個窗體我們都可以單獨的控件類文件存在,並為它們內部的每個需要交互的按鈕設置對應的事件以實現與其他對象的交互消滅耦合:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第8张

另外,Demo使用了動態多國語言設計,眾所周知同一詞匯在不同語言書寫中存在長度差異,因此語言包中還應在需要的地方添加上Offset和FontSize參數以使得界面看上去更協調整潔:

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第9张

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第10张

Silverlight動態多國語言設計模式對於WebGame來說可輕松實現玩家跨國交互和競技,可謂真正能實現網游國際化的RIA技術;這才是Silverlight頁游即將為世界所締造的網游領域新的藍海!第四次游戲革命:網頁網游全球一體化。試想不同民族、不同國籍的玩家在一款游戲中同場競技或SNS中相互交流,尤其是亞洲,中、港、台、日、韓、越、泰等周邊國家的游戲玩家齊聚一堂,共享世紀網游大作,那將是一件多么偉大而具有划時代意義的歷史記憶!不遠了,多少前輩曾經為了這個夢想而奮斗青春,當微軟為了Silverlight能兼具更強勁的GPU而收購NVIDIA時,當Silverlight 5正式版浩瀚問世之時,那才是網游世界新的春天!

Silverlight 2.5D RPG游戲技巧與特效處理:(十九)基於WCF的注冊與登錄 -开发者知识库,第11张

XNA已成為Silverlight.XNA,無可厚非Silverlight必將成為微軟未來平台統一與兼容的首選~!兼具高開發效率、優秀用戶體驗及跨平台等諸多優勢最具潛力的RIA技術,未來將與HTML5共舞,優勢互補一統所有網絡應用。

本系列源碼請到目錄中下載

在線演示地址:http://silverfuture.cn


最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复