zoukankan      html  css  js  c++  java
  • Cocos2d-x for Windows Phone 用法总结

    鉴于诺基亚(微软移动这个没人用的手机)开发者比较少,cocos2dx移植方面更是少的问题,总结一下WP8移植方面的资料,希望对大家有用,自己也当作笔记留念。 

    1、WP8方面有两种方式创建项目,HelloCpp和TestCpp就是这样,XAML方式和纯c++方式。最好选择xaml方式,因为你有可能会c++和c#进行交互。废话不说,有图有真相。

    2、说到c++c#交互,其实叫C++/CXC++/CX其实是微软在Win8开发平台下,对C++语言的一种扩展),下面就讲述其用法,概念可以去百度。

        a)  c++调用c#,比如我想获得该诺基亚的UniqueID,直接上代码吧,了解c#委托的童鞋应该不难理解,if...baidu...    

    ****************************************************************************
    
    //WP8DataManager.h
    #ifndef __WP8DataManager_H__
    #define __WP8DataManager_H__
    namespace PhoneDirect3DXamlAppComponent 
    {
        public delegate Platform::String^ GetUniqueIDDelegate();
    
        public ref class WP8DataManager sealed
        {
        public:
            WP8DataManager(void)
            {
    
            }
            ///DeviceInfo
            //此方法将在c#中调用
            void SetGetUniqueIDDelegate(GetUniqueIDDelegate^ del)
            {
                m_getUniqueIDDelegate = del;
            }
            //获得的id,c++直接调用
            Platform::String^ GetUniqueID()
            {            
                if(m_getUniqueIDDelegate)
                {
                    return m_getUniqueIDDelegate->Invoke();
                }
                return "";
            }
            ///DeviceInfo end
        private:
            property static GetUniqueIDDelegate^ m_getUniqueIDDelegate;
        };
    }
    #endif // __WP8DataManager_H__
    
    ****************************************************************************
    
    //MainPage.xaml.cs
    namespace PhoneDirect3DXamlAppInterop
    {
        public partial class MainPage : PhoneApplicationPage
        {
            // other demo...
            
            //datamanager
            private WP8DataManager m_dataManager = null;
    
            private void DrawingSurface_Loaded(object sender, RoutedEventArgs e)
            {
                if (m_d3dInterop == null)
                {
                    //demo ......
                }
    
                if (m_dataManager == null)
                {
                    m_dataManager = new WP8DataManager();
                    m_dataManager.SetGetUniqueIDDelegate(getUniqueID);
                }            
            }
            
            public String getUniqueID()
            {
                /*try {
                    byte[] uniqueIDbytes = (byte[])DeviceExtendedProperties.GetValue("DeviceUniqueId");
                    string uniqueID = System.Convert.ToBase64String(uniqueIDbytes);
                }catch(Exception ex){
                    MessageBox.Show(ex.Message, "Failed", MessageBoxButton.OK);
                }*/
                return "abc";
            }
        }
    }
    
    ****************************************************************************
    
    //your cpp demo
    PhoneDirect3DXamlAppComponent::WP8DataManager^ manager = ref new PhoneDirect3DXamlAppComponent::WP8DataManager();
    Platform::String^ id = manager->GetUniqueID();
    
    ****************************************************************************
    View Code

        b)  c#调用c++,比如自己添加了一个EditBox和一个Button,通过代码将EditBox中的值返回给c++中,详见Demo,我的例子是输入一个兑换码然后返回给c++部分

    ****************************************************************************
    
    //MainPage.xaml.cs
    //此处为c#调用,当button按键触发时
    m_d3dInterop.OnWP8RedeemResult(WP8RedeemEventType.WP8RedeemSuccess,"110");
    
    ****************************************************************************
    
    //Direct3DInterop.h
    void OnWP8RedeemResult(WP8RedeemEventType type,Platform::String^ code);
    //Direct3DInterop.cpp
    void Direct3DInterop::OnWP8RedeemResult(WP8RedeemEventType type,Platform::String^ code)
    {    
        std::lock_guard<std::mutex> guard(mMutex);
        std::shared_ptr<WP8RedeemEvent> e(new WP8RedeemEvent(type,code));
        mInputEvents.push(e);
    }
    
    ****************************************************************************
    
    //WP8DataEvent.h
    #ifndef __WP8DATA_EVENT__
    #define __WP8DATA_EVENT__
    
    #include <agile.h>
    #include "../InputEvent.h"
    
    ref class Cocos2dRenderer;
    
    namespace PhoneDirect3DXamlAppComponent
    {
        
    public enum class WP8RedeemEventType{
        WP8RedeemFailed,
        WP8RedeemSuccess
    };
    
    class WP8RedeemEvent: public InputEvent
    {    
    public:
        WP8RedeemEvent(WP8RedeemEventType type,Platform::String^ code);
        WP8RedeemEvent(WP8RedeemEventType type);
    
        virtual void execute(Cocos2dRenderer ^ renderer);
    
    private:
        Platform::Agile<Platform::String> m_code;
        WP8RedeemEventType m_type;
    };
    }
    #endif // #ifndef __WP8DATA_EVENT__
    
    ****************************************************************************
    
    //WP8DataEvent.cpp
    #include "WP8DataEvent.h"
    #include "../Cocos2dRenderer.h"
    
    namespace PhoneDirect3DXamlAppComponent
    {
        
    WP8RedeemEvent::WP8RedeemEvent(WP8RedeemEventType type,Platform::String^ code)
        :m_type(type),m_code(code)
    {
    
    }
    WP8RedeemEvent::WP8RedeemEvent(WP8RedeemEventType type)
        :m_type(type)
    {
    
    }
    void WP8RedeemEvent::execute(Cocos2dRenderer ^ renderer)
    {
        switch(m_type)
        {
        case WP8RedeemEventType::WP8RedeemSuccess:
            renderer->nativeRedeemSuccess(m_code.Get());
            break;
        case WP8RedeemEventType::WP8RedeemFailed:
            renderer->nativeRedeemFailed();
            break;
        default:
           
            break;      
        }
    }
    }
    
    ****************************************************************************
    
    //Cocos2dRenderer.h
    void nativeRedeemFailed();
    void nativeRedeemSuccess(Platform::String^ code);
    //Cocos2dRenderer.cpp
    void Cocos2dRenderer::nativeRedeemFailed()
    {
        //c++ code
        CCLog("nativeRedeemFailed");
    }
    void Cocos2dRenderer::nativeRedeemSuccess(Platform::String^ code)
    {
        //c++ code
        CCLog("nativeRedeemSuccess code=%s",cocos2d::WP8Tran::pstos(code).c_str());
    }
    ****************************************************************************
    View Code

    3、通常c#是用的字符串类型是Platform::String^,需要转换为std::string。以下的方法可以任意直接转化,是不是很方便呢

    ****************************************************************************
    
    NS_CC_BEGIN
    
    class CC_DLL WP8Tran
    {
    public:
        static std::string tranChina(const char * str);
    
        static Platform::String^ tranChinatops(std::string str);
    
        static std::wstring stows(std::string s);
     
        static Platform::String^ stops(std::string s);
     
        static std::string wstos(std::wstring ws);
     
        static std::string pstos(Platform::String^ ps);
    };
    
    NS_CC_END
    
    ****************************************************************************
    
    NS_CC_BEGIN
    
    #define MAX_LEN  (16*1024 + 1)
    
    std::string WP8Tran::tranChina(const char * pszFormat)
    {
        char szBuf[MAX_LEN];
        strcpy(szBuf,pszFormat);
    
        WCHAR wszBuf[MAX_LEN] = {0};
        MultiByteToWideChar(CP_UTF8, 0, szBuf, -1, wszBuf, sizeof(wszBuf));
        OutputDebugStringW(wszBuf);
        OutputDebugStringW(L"
    ");
    
        WideCharToMultiByte(CP_ACP, 0, wszBuf, sizeof(wszBuf), szBuf, sizeof(szBuf), NULL, FALSE);
    
        return szBuf;
    }
    
    Platform::String^ tranChinatops(std::string str)
    {
        //return ref new Platform::String(cocos2d::WP8Tran::stows(cocos2d::WP8Tran::tranChina(str.c_str())).c_str());
        return WP8Tran::stops(WP8Tran::tranChina(str.c_str()));
    }
    
    std::wstring WP8Tran::stows(std::string str)
    {
        setlocale(LC_ALL, "chs"); 
        const char* _Source = str.c_str();
        size_t _Dsize = str.size() + 1;
        wchar_t *_Dest = new wchar_t[_Dsize];
        wmemset(_Dest, 0, _Dsize);
        mbstowcs(_Dest,_Source,_Dsize);
        std::wstring result = _Dest;
        delete []_Dest;
        setlocale(LC_ALL, "C");
        return result;
    }
     
    Platform::String^ WP8Tran::stops(std::string s)
    {
        return ref new Platform::String(stows(s).c_str());
    }
     
    std::string WP8Tran::wstos(std::wstring ws)
    {
        std::string s;
        s.assign(ws.begin(), ws.end());
        return s;
    }
     
    std::string WP8Tran::pstos(Platform::String^ ps)
    {
        return wstos(std::wstring(ps->Data()));
    }
    
    NS_CC_END
    
    ****************************************************************************
    View Code

    4、我把WP8DataManager全部贴出来,方便在代码中直接使用,你可以直接引用到项目的根目录,如图。

        WP8DataManager.h   

    #ifndef __WP8DataManager_H__
    #define __WP8DataManager_H__
    
    #include "cocos2d.h"
    
    namespace PhoneDirect3DXamlAppComponent 
    {
        public delegate Platform::String^ GetUniqueIDDelegate();
    
        public delegate void ToastWP8Delegate(Platform::String^ msg);
    
        public ref class WP8DataManager sealed
        {
        public:
            WP8DataManager(void)
            {
    
            }
            ///DeviceInfo
            void SetGetUniqueIDDelegate(GetUniqueIDDelegate^ del)
            {
                m_getUniqueIDDelegate = del;
            }
    
            Platform::String^ GetUniqueID()
            {            
                if(m_getUniqueIDDelegate)
                {
                    return m_getUniqueIDDelegate->Invoke();
                }
                return "";
            }
    
            void SetToastWP8Delegate(ToastWP8Delegate^ del)
            {
                m_toastWP8Delegate = del;
            }
    
            void ToastWP8(Platform::String^ msg)
            {
                if(m_toastWP8Delegate)
                {
                    m_toastWP8Delegate->Invoke(msg);
                }
            }
            ///DeviceInfo end
    
    
        private:
            property static GetUniqueIDDelegate^ m_getUniqueIDDelegate;
            property static ToastWP8Delegate^ m_toastWP8Delegate;
        };
    }
    
    NS_CC_BEGIN
    
    class CC_DLL WP8Tran
    {
    public:
        static std::string tranChina(const char * str);
    
        static Platform::String^ tranChinatops(std::string str);
    
        static std::wstring stows(std::string s);
     
        static Platform::String^ stops(std::string s);
     
        static std::string wstos(std::wstring ws);
     
        static std::string pstos(Platform::String^ ps);
    };
    
    NS_CC_END
    
    class WP8DataHelper
    {    
    public:
        WP8DataHelper();
        virtual ~WP8DataHelper();
    
        static PhoneDirect3DXamlAppComponent::WP8DataManager^ sharedWP8DataManager();
        static void purgeWP8Data();
    };
    #endif // __WP8DataManager_H__
    View Code

        WP8DataManager.cpp

    #include "WP8DataManager.h"
    
    NS_CC_BEGIN
    
    #define MAX_LEN  (16*1024 + 1)
    
    std::string WP8Tran::tranChina(const char * pszFormat)
    {
        char szBuf[MAX_LEN];
        strcpy(szBuf,pszFormat);
    
        WCHAR wszBuf[MAX_LEN] = {0};
        MultiByteToWideChar(CP_UTF8, 0, szBuf, -1, wszBuf, sizeof(wszBuf));
        OutputDebugStringW(wszBuf);
        OutputDebugStringW(L"
    ");
    
        WideCharToMultiByte(CP_ACP, 0, wszBuf, sizeof(wszBuf), szBuf, sizeof(szBuf), NULL, FALSE);
    
        return szBuf;
    }
    
    Platform::String^ tranChinatops(std::string str)
    {
        //return ref new Platform::String(cocos2d::WP8Tran::stows(cocos2d::WP8Tran::tranChina(str.c_str())).c_str());
        return WP8Tran::stops(WP8Tran::tranChina(str.c_str()));
    }
    
    std::wstring WP8Tran::stows(std::string str)
    {
        setlocale(LC_ALL, "chs"); 
        const char* _Source = str.c_str();
        size_t _Dsize = str.size() + 1;
        wchar_t *_Dest = new wchar_t[_Dsize];
        wmemset(_Dest, 0, _Dsize);
        mbstowcs(_Dest,_Source,_Dsize);
        std::wstring result = _Dest;
        delete []_Dest;
        setlocale(LC_ALL, "C");
        return result;
    }
     
    Platform::String^ WP8Tran::stops(std::string s)
    {
        return ref new Platform::String(stows(s).c_str());
    }
     
    std::string WP8Tran::wstos(std::wstring ws)
    {
        std::string s;
        s.assign(ws.begin(), ws.end());
        return s;
    }
     
    std::string WP8Tran::pstos(Platform::String^ ps)
    {
        return wstos(std::wstring(ps->Data()));
    }
    
    NS_CC_END
    
    static PhoneDirect3DXamlAppComponent::WP8DataManager^ m_wp8dataManager = ref new PhoneDirect3DXamlAppComponent::WP8DataManager();
    
    WP8DataHelper::WP8DataHelper()
    {
    
    }
    
    WP8DataHelper:: ~WP8DataHelper()
    {
    
    }
    
    PhoneDirect3DXamlAppComponent::WP8DataManager^ WP8DataHelper::sharedWP8DataManager()
    {
        return m_wp8dataManager;
    }
    
    void WP8DataHelper::purgeWP8Data()
    {
        //delete m_wp8dataManager;
    }
    View Code


    5、下一篇会讲一下常见的错误。

             

    github地址:https://github.com/eoeuou/wp8-xaml欢迎来喷

       

  • 相关阅读:
    《数据结构》C++代码 线性表
    《数据结构》C++代码 Splay
    《数据结构》C++代码 前言
    蓝桥杯- 算法提高 最大乘积
    HDU-1241 Oil Deposits
    一个简单的网站计数器
    编写一个jsp页面,输出九九乘法表。
    Sum It Up
    历届试题 剪格子
    历届试题 分糖果
  • 原文地址:https://www.cnblogs.com/huazaizai/p/3716221.html
Copyright © 2011-2022 走看看