Ejemplo n.º 1
0
void VisibleRect::lazyInit() {
	if (s_visibleRect.size.width == 0.0f && s_visibleRect.size.height == 0.0f) {
		CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
		s_visibleRect.origin = pEGLView->getVisibleOrigin();
		s_visibleRect.size = pEGLView->getVisibleSize();
	}
}
Ejemplo n.º 2
0
// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    CCSize size = CCDirector::sharedDirector()->getWinSize();

    CCSprite* pBackground = CCSprite::create("background.png");
    pBackground->setPosition(ccp(size.width / 2, size.height / 2));
    addChild(pBackground);
    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    CCEGLView* pEGLView = CCEGLView::sharedOpenGLView();
    CCPoint posBR = ccp(pEGLView->getVisibleOrigin().x + pEGLView->getVisibleSize().width, pEGLView->getVisibleOrigin().y);
    CCPoint posTL = ccp(pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y + pEGLView->getVisibleSize().height);

    // add a "close" icon to exit the progress. it's an autorelease object
    CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
                                        "CloseNormal.png",
                                        "CloseSelected.png",
                                        this,
                                        menu_selector(HelloWorld::menuCloseCallback) );
    pCloseItem->setPosition( ccp(posBR.x - 20, posBR.y + 20) );

    // create menu, it's an autorelease object
    CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
    pMenu->setPosition( CCPointZero );
    this->addChild(pMenu, 1);

    CCPoint posStep = ccp(220, -150);
    CCPoint beginPos = ccpAdd(posTL, ccpMult(posStep, 0.5f));
    int line = 0;
    int row = 0;
    for (int i = 0; i < sizeof(s_EventMenuItem)/sizeof(s_EventMenuItem[0]); i++) {
    	CCMenuItemImage* pMenuItem = CCMenuItemImage::create(s_EventMenuItem[i].id.c_str(), s_EventMenuItem[i].id.c_str(),
    			this, menu_selector(HelloWorld::eventMenuCallback));
        pMenu->addChild(pMenuItem, 0, s_EventMenuItem[i].tag);

        CCPoint pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
        CCSize itemSize = pMenuItem->getContentSize();
        if ((pos.x + itemSize.width / 2) > posBR.x)
		{
			line += 1;
			row = 0;
			pos = ccpAdd(beginPos, ccp(posStep.x * row, posStep.y * line));
		}
        row += 1;
        pMenuItem->setPosition(pos);
    }

    CCLabelTTF* label = CCLabelTTF::create("reload all plugins", "Arial", 24);
    CCMenuItemLabel* pMenuItem = CCMenuItemLabel::create(label, this, menu_selector(HelloWorld::reloadPluginMenuCallback));
    pMenuItem->setAnchorPoint(ccp(0.5f, 0));
    pMenu->addChild(pMenuItem, 0);
    pMenuItem->setPosition( ccp(size.width / 2, 0));

    return true;
}
Ejemplo n.º 3
0
///////////////////////////////////////////
//@android: for test only
void dumpCocos2dx()
{
	string strLine = "@@------------------------------------------------------------{{\r\n";
	char szInfo[1024] = "";

	CCLog( strLine.c_str() );
	__flog( strLine.c_str());

	// dump NDDirector & CCDirector
	{
		sprintf( szInfo,
			"[CCDirector] size in Points  (%d, %d)\r\n"
			"[CCDirector] size in Pixels  (%d, %d)\r\n"
			"[CCDirector] content scale = %.1f\r\n",

			(int)CCDirector::sharedDirector()->getWinSize().width,
			(int)CCDirector::sharedDirector()->getWinSize().height,

			(int)CCDirector::sharedDirector()->getWinSizeInPixels().width,
			(int)CCDirector::sharedDirector()->getWinSizeInPixels().height,

			CCDirector::sharedDirector()->getContentScaleFactor()
			);

		CCLog( szInfo );
		__flog( szInfo );
	}

	// dump EGL view
	{
		CCEGLView* pkEglView = CCDirector::sharedDirector()->getOpenGLView();
		if (pkEglView)
		{
			sprintf( szInfo, 
				"\r\n"
				"[EGLVIEW] frame     size (%d, %d)\t\t[AKA: Screen Size]\r\n"
				"[EGLVIEW] designed  size (%d, %d)\r\n"
				"[EGLVIEW] scale          (%.2f, %.2f)\r\n"
				"\r\n"
				"[EGLVIEW] viewport  org  (%d, %d)\r\n"
				"[EGLVIEW] viewport  size (%d, %d)\r\n"
				"\r\n"
				"[EGLVIEW] visible   org  (%d, %d)\r\n"
				"[EGLVIEW] visible   size (%d, %d)\r\n"
				"\r\n"
				"[EGLVIEW] retina enabled (%d)\r\n"
				//"[EGLVIEW] resolution policy (%d)\r\n"
				,
				/*frame*/	(int)pkEglView->getFrameSize().width,			(int)pkEglView->getFrameSize().height, 
				/*designed*/(int)pkEglView->getSize().width,				(int)pkEglView->getSize().height, 
				/*scale*/	pkEglView->getScaleX(), pkEglView->getScaleY(),

				/*viewport*/(int)pkEglView->getViewPortRect().origin.x,	(int)pkEglView->getViewPortRect().origin.y,
				/*viewport*/(int)pkEglView->getViewPortRect().size.width,	(int)pkEglView->getViewPortRect().size.height,

				/*vis org*/	(int)pkEglView->getVisibleOrigin().x,			(int)pkEglView->getVisibleOrigin().y,
				/*vis size*/(int)pkEglView->getVisibleSize().width,		(int)pkEglView->getVisibleSize().height,
				
				/*retina*/	(int)pkEglView->isRetinaEnabled()
				///*policy*/	(int)eglView->m_eResolutionPolicy
				);

			CCLog( szInfo );
			__flog( szInfo );
		}
	}

	strLine = "@@------------------------------------------------------------}}\r\n";
	CCLog( strLine.c_str());
	__flog_flush( strLine.c_str());
}
Ejemplo n.º 4
0
bool Assets::enableMutliResolutionSupport()
{
    /// Multi resolution support BEFORE cocos2d-x 2.0.4
    /// The correct resolution is enableds using setResourceDirectory which set the resource directory for the current device's resolution
    /// Shared/common images to all resolutions are stored in the root resources (Resources/GameResources/textures)
    /// See http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Mechanism_of_loading_resources

    /****************************************************************************************************************
     *
     *     Since 2.0.4, cocos2d-x introduced a new multi-resolution support
     *     http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Multi_resolution_support
     *     http://www.cocos2d-x.org/wiki/Detailed_explanation_of_Cocos2d-x_Multi-resolution_adaptation
     *
     *     Set the design resolution: width, height and policy
     *
     *    - kResolutionExactFit -
     *    The entire application is visible in the specified area without trying to preserve the original aspect ratio.
     *    Distortion can occur, and the application may appear stretched or compressed.
     *
     *    - kResolutionNoBorder -
     *    The entire application fills the specified area, without distortion but possibly with some cropping,
     *    while maintaining the original aspect ratio of the application.
     *
     *    - kResolutionShowAll -
     *    The entire application is visible in the specified area without distortion while maintaining the original
     *    aspect ratio of the application. Borders can appear on two sides of the application.
     ****************************************************************************************************************/

    CCDirector* pDirector = CCDirector::sharedDirector();
    CCEGLView* pEGLView = pDirector->getOpenGLView();
    CCFileUtils &fileUtils = *CCFileUtils::sharedFileUtils();

    pEGLView->setDesignResolutionSize(designResolutionSize.width, designResolutionSize.height, kResolutionExactFit);
    CCSize frameSize = pEGLView->getFrameSize();

    /// We select resource according to the frame's height.
    /// If the resource size is different from design resolution size, you need to set contentScaleFactor.
    /// We use the ratio of resource's height to the height of design resolution,
    /// this can make sure that the resource's height could fit for the height of design resolution.

    std::vector<std::string> resOrder = fileUtils.getSearchResolutionsOrder();

    /// GPU max texture size
    GLint maxTextureSize = 0;
    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxTextureSize);
    CCLOG("GPU max texture size: %d", maxTextureSize);

    bool scaledGraphics = false;

    /// set the contentScaleFactor based on the ratio of WIDTH
    if (frameSize.width > mediumResource.size.width && maxTextureSize >= 2048) {
        CCLOG("Select LARGE (ipadhd) resource...");
        resOrder.insert(resOrder.begin(), largeResource.directory);
        /// pDirector->setContentScaleFactor(largeResource.size.width/designResolutionSize.width);
        pDirector->setContentScaleFactor(4.f);
    }
    // if the frame's height is larger than the height of small resource size, select medium resource.
    else if (frameSize.width > smallResource.size.width  && maxTextureSize >= 1024) {
        CCLOG("Select MEDIUM (hd) resource...");
        resOrder.insert(resOrder.begin(), mediumResource.directory);
        /// pDirector->setContentScaleFactor(mediumResource.size.width/designResolutionSize.width);
        pDirector->setContentScaleFactor(2.f);
        scaledGraphics = frameSize.width > mediumResource.size.width; // have scale down because of max texture size too small?
    }
    // if the frame's height is smaller than the height of medium resource size, select small resource.
    else {
        CCLOG("Select SMALL (sd) resource...");
        resOrder.insert(resOrder.begin(), smallResource.directory);
        /// pDirector->setContentScaleFactor(smallResource.size.width/designResolutionSize.width);
        pDirector->setContentScaleFactor(1.f);
        scaledGraphics = frameSize.width > smallResource.size.width; // have scale down because of max texture size too small?
    }

    /// Show an error message if we scaled down the graphics or the max texture size is too small
    if (scaledGraphics || maxTextureSize < 512) {
        CCLOGERROR("Unsupported max texture size: %d",maxTextureSize);
        CCMessageBox("We detected graphics limitation which might prevent the app to work properly or to use HD graphics (max texture too small)", "ERROR");
    }

    /// Bug fix: the resolution directory must have a trailing slash (e.g. hd/ or sd/) or
    /// CCFileUtils::getFullPathForDirectoryAndFilename() will not work correclty on iOS if
    /// both search paths and resolution order are defined (missing slash between directory and filename).
    /// We now use setSearchResolutionsOrder instead of addSearchResolutionsOrder because
    /// addSearchResolutionsOrder simply add the string to the list of the resolution order without adding the trailing slash.
    /// setSearchResolutionOrder takes care of adding the trailing slash if missing.
    /// See. http://discuss.cocos2d-x.org/t/search-paths-and-resolutions-order-issue-on-ios/14424
    fileUtils.setSearchResolutionsOrder(resOrder);

    /// Set the font sizes
    for (int i = 0; i < 4; i++)
        smFontsSize[i]  *= designResolutionSize.width / smallResource.size.width;

    ////////////////// Trace settings... /////////////////
#if COCOS2D_DEBUG > 0

    /// Redirect standard output and error stream to file
    //freopen(fileUtils.getWritablePath().append("cocos2d.log").c_str(), "a+", stdout);
    //freopen(fileUtils.getWritablePath().append("cocos2d.log").c_str(), "a+", stderr);

    /// In debug mode we change the default search path to the following.
    std::vector<std::string> paths;
    paths.push_back(fileUtils.getWritablePath()); /// First we search the writable path root for assets download on-the-fly (see command.h/cpp)
    paths.push_back(fileUtils.getWritablePath().append("lua")); /// Secondly we search in the lua folder below the writable root for lua script
    paths.push_back(""); /// Finally we look in the default resource path (empty string)

    fileUtils.setSearchPaths(paths);

    TargetPlatform platform = CCApplication::sharedApplication()->getTargetPlatform();
    if (platform == kTargetAndroid || platform == kTargetIpad || platform == kTargetIphone) {
        /// Purge the writable folder
        CCLOG("Removing files from the assets staging area (writable path)...");
        /// TODO on mac getWritablePath is "/Users/lzubiaur/Library/Caches/".
        /// So it should not be wipe out but temporary assets should be written in a subfolder
        emptyFolder(fileUtils.getWritablePath());
    }

    CCLOG("Real screen size: %.0fx%.0f", pEGLView->getFrameSize().width, pEGLView->getFrameSize().height);
    CCLOG("Design resolution size: %.0fx%.0f", pEGLView->getDesignResolutionSize().width, pEGLView->getDesignResolutionSize().height);
    CCLOG("Content scale factor: %f", pDirector->getContentScaleFactor());
    CCLOG("Scale x:%f y:%f", pEGLView->getScaleX(), pEGLView->getScaleY());
    CCLOG("Visible origin: x:%.0f y:%.0f",pEGLView->getVisibleOrigin().x, pEGLView->getVisibleOrigin().y);
    CCLOG("Visible size: %.0fx%.0f", pEGLView->getVisibleSize().width, pEGLView->getVisibleSize().height);

    /// Log the search paths
    std::string searchPath;
    for (const std::string s : fileUtils.getSearchPaths())
        searchPath.append(' ' + s);
    CCLOG("Search path: %s", searchPath.c_str());

    /// Log the search resolution order
    std::string resolutionOrder;
    for (const std::string s : fileUtils.getSearchResolutionsOrder())
        resolutionOrder.append(' ' + s);
    CCLOG("Search resolution order: %s", resolutionOrder.c_str());
    CCLOG("Writeable path: %s", fileUtils.getWritablePath().c_str());
    CCLOG("Lua version: %s",LUA_VERSION);

    /// CCLOG("Websocket version %s",lws_get_library_version());

    /*
     d("top:         %f %f", CVisibleRect::top().x,          CVisibleRect::top().y           );
     d("rightTop:    %f %f", CVisibleRect::rightTop().x,     CVisibleRect::rightTop().y      );
     d("leftTop:     %f %f", CVisibleRect::leftTop().x,      CVisibleRect::leftTop().y       );
     d("left:        %f %f", CVisibleRect::left().x,         CVisibleRect::left().y          );
     d("right:       %f %f", CVisibleRect::right().x,        CVisibleRect::right().y         );
     d("leftBottom:  %f %f", CVisibleRect::leftBottom().x,   CVisibleRect::leftBottom().y    );
     d("rightBottom: %f %f", CVisibleRect::rightBottom().x,  CVisibleRect::rightBottom().y   );
     d("center:      %f %f", CVisibleRect::center().x,       CVisibleRect::center().y        );
     d("bottom:      %f %f", CVisibleRect::bottom().x,       CVisibleRect::bottom().y        );
     */
#endif

    return true;
}