cocos2d-x从手机游戏到PC端游 (win全屏)

http://fengmm521.blog.163.com/blog/static/2509135820141262838913/


   这几天一直在想,cocos2d-x跨平台这么牛X,为什么没有人用cocos2d-x来作PC的端游呢,如果用cocos2d-x作2D的端游,那岂不是windows,linux,Mac,ios,android全平台通吃了。当然了,这只是cocos2d-x,但是如果我们使用的是cocos3d那岂不是,一个游戏引擎,可以在任何平台上运行,所有平台通吃。并且是2D游戏,3D游戏都通吃的游戏引擎,而且还使用的是GPU渲染的游戏,而且游戏运行的性能大家就可想而知了。

       想到这里,自已便开始兴奋的快要跳起来了。

       我们先来分析一下理论上的可行性。

       1.用过cocos2d-x的人都知道,cocos2d-x是使用的标准c++语法写成。所以c++本身就是windows,linux,mac通行的。

       2.然后,我要说一下游戏使用的图形渲染引擎,cocos2d-x使用的是OpenGL ES,之所以使用从OpenGL裁剪的OpenGL ES是因为手机端使用完全的OpenGL性能有问题,但让我们高兴的是OpenGL ES的代码可以完全运行与OpenGL显卡。而且性能不比手机的GPU差。还有一个更好的消息就是OpenGL和OpenGL ES的协议正在被OpenGL组织设法合并为一个协议。

      3.支持windows系统的显卡硬件提供商因为受到微软的软件协议管控,不能自行开发性能更高的显示硬件,所以一般显卡的生产商都会全力支持OpenGL协议,以显示他们新硬件的性能。所以,几乎所有可以跑windows系统的显卡都可以找到OpenGL驱动。换句话说,就是windwos,linux,mac都支持OpenGL硬件协议。

   结合上边的三条分析,我们没有理由不相信cocos2d-x或者cocos3d-x不会成为所有平台通吃的游戏开发引擎。

  下边是对cocos2d-x引擎全屏显示的一些修改。linux和Mac应该也会很方便。因为你可以看到cocos2dx的cocos2dx\platform目录下有很多操作系统相关的文件夹。如下图:

cocos2d-x从手机游戏到PC端游 - ♂苹果 - 眼睛想旅行
还有一些我不认识的系统。
    经过我一个上午的调试和找资料,我把vs2010下的一个cocos2d-x游戏项目调成在windows上全屏显示了。
要全屏显示,要改以下三个地方:
1.cocos2dx\platform\win32目录下的CCEGLView.cpp文件中的"bool CCEGLView::initGL()"前边加入以下代码:

HWND    hDesk;      RECT    rc;      hDesk   =    GetDesktopWindow();      GetWindowRect(    hDesk,   &rc    );      SetWindowLong(    m_hWnd,    GWL_STYLE,    WS_BORDER    );        SetWindowPos( m_hWnd,    HWND_TOPMOST,0,0, rc.right, rc.bottom,SWP_SHOWWINDOW);

 ShowWindow(hDesk,SW_SHOWMAXIMIZED);

加入后的样子如下图:(记得改完了,要再把cocos2dlib项目再编译一下)
cocos2d-x从手机游戏到PC端游 - ♂苹果 - 眼睛想旅行
2.再修改你自已的cocos2d-x项目中的main.cpp:
把原来代码中的
eglView->setFrameSize(480, 320);
改成下边代码

RECT rcWindow;  HWND xxtmp = eglView->getHWnd();  GetWindowRect(xxtmp,&rcWindow);  int w = (int)rcWindow.right;  int h = (int)rcWindow.bottom;  eglView->setFrameSize(w, h);

改过之后的效果如下图:
  
  
cocos2d-x从手机游戏到PC端游 - ♂苹果 - 眼睛想旅行
3.第三个要改地方是为了让我们的项目能动自适应显示器的分辨率而没有黑边。要改的地方是在我们的AppDelegate.cpp中修改方法AppDelegate::applicationDidFinishLaunching()加入设置EGLView显示方式的代码。如下图

pEGLView->setDesignResolutionSize(480,320, kResolutionExactFit);

kResolutionExactFit:这个参数表示自动拉申以适合屏幕大小。
还有几个别的参数,这里就不写了,有要了解的,大家去网上搜,一搜一大把。
好了,这样设置完之后,我们的cocos2d-x游戏项目就在windows系统下变成像端游一样的全屏显示了。接下来的事情就要看大家的主观能动性和想象力了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 參考了一下NeHe 的教程, 在 cocos2d-x 2.0 上可以做點小手腳在 Windows 上全屏顯示! 主要修改兩個檔案: CCEGLView.h CCEGLView.cpp 它們在工程里的位置是 libcocos2d->platform->win32 先打開 CCEGLView.h 在 public: 底下加上一個新功能: void setFullScreen(bool flag); 另外在 private: 里加上一個新變數: bool m_bFullScreen; 接下來是 CCEGLView.cpp: 在 Constructor 加上 m_bFullScreen 的初始值: CCEGLView::CCEGLView() : m_bCaptured(false) , m_hWnd(NULL) , m_hDC(NULL) , m_hRC(NULL) , m_lpfnAccelerometerKeyHook(NULL) , m_bFullScreen(false) 再加上我們的 setFullScreen(): void CCEGLView::setFullScreen(bool flag) { m_bFullScreen = flag; } 然後在 Create() 里, 把CreateWindowEx() 那段改成下邊這樣: /////////////// FULLSCREEN HACK - BEGIN DWORD dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE; // Window Extended Style DWORD dwStyle = WS_CAPTION | WS_POPUPWINDOW | WS_MINIMIZEBOX; // Window Style if (m_bFullScreen) { DEVMODE dmScreenSettings; // Device Mode memset(&dmScreenSettings;,0,sizeof(dmScreenSettings)); // Makes Sure Memory's Cleared dmScreenSettings.dmSize=sizeof(dmScreenSettings); // Size Of The Devmode Structure dmScreenSettings.dmPelsWidth = w; // Selected Screen Width dmScreenSettings.dmPelsHeight = h; // Selected Screen Height dmScreenSettings.dmBitsPerPel = 32; // Selected Bits Per Pixel dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT; // Try To Set Selected Mode And Get Results. NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar. if (ChangeDisplaySettings(&dmScreenSettings;,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL) { // If The Mode Fails, Offer Two Options. Quit Or Use Windowed Mode. if (MessageBox(NULL, L"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?",L"cocos2d-x",MB_YESNO|MB_ICONEXCLAMATION)==IDYES) { setFullScreen(false); // back to windowed mode } else { // Pop Up A Message Box Letting User Know The Program Is Closing. MessageBox(NULL,L"Program Will Now Close.",L"ERROR",MB_OK|MB_ICONSTOP); return FALSE; // Return FALSE } } else // yeah! we are in fullscreen { dwExStyle = WS_EX_APPWINDOW; dwStyle=WS_POPUP | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; //ShowCursor(FALSE); RECT rect; rect.left=(long)0; // Set Left Value To 0 rect.right=(long)w; // Set Right Value To Requested Width rect.top=(long)0; // Set Top Value To 0 rect.bottom=(long)h; // Set Bottom Value To Requested Height AdjustWindowRectEx(▭, dwStyle, FALSE, dwExStyle); // Adjust To True Requested Size } } /////////////// FULLSCREEN HACK - END // create window m_hWnd = CreateWindowEx( dwExStyle, // Extended Style For The Window kWindowClassName, // Class Name wszBuf, // Window Title dwStyle, // Defined Window Style 0, 0, // Window Position 0, // Window Width 0, // Window Height NULL, // No Parent Window NULL, // No Menu hInstance, // Instance NULL ); CC_BREAK_IF(! m_hWnd); 基本上這樣已搞定. 最後在我們自己項目的 main.cpp 里選擇全屏即可: AppDelegate app; CCEGLView& eglView = CCEGLView::sharedOpenGLView(); eglView.setFullScreen(true); eglView.setViewName("Hello Tests"); eglView.setFrameSize(1920, 1080); 要注意事項: - eglView.setFullScreen(true) 一定要在 eglView.setViewName("xxx") 前面. - eglView.setFrameSize(1920, 1080) 設定的大小, 一定要是顯卡可以支持的. - 不能再用CCDirector::sharedDirector()->enableRetinaDisplay(true)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值