cocos2dx 3.3 適配(縮放距離, 不縮放圖片)

bool AppDelegate::applicationDidFinishLaunching() 中修改爲

Vec2 frameSize(1500, 300);  
Vec2 resolutionSize(960,640); 
bool AppDelegate::applicationDidFinishLaunching() {
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if(!glview) {
        glview = GLViewImpl::create("My Game");

		 glview->setFrameSize(frameSize.x, frameSize.y);  

        director->setOpenGLView(glview);

		float currentAspectRatio = director->getWinSize().width/director->getWinSize().height;  
		float originalAspectRatio = resolutionSize.x/resolutionSize.y;  

		if(currentAspectRatio>originalAspectRatio)//採用根據寬度自適應  
		{  
			glview->setDesignResolutionSize(resolutionSize.x,resolutionSize.y,kResolutionFixedHeight );  
		}  
		if(currentAspectRatio<=originalAspectRatio)// 採用根據長度自適應  
		{  
			glview->setDesignResolutionSize(resolutionSize.x,resolutionSize.y, kResolutionFixedWidth );  
		}  
    }

    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = HelloWorld::createScene();

    // run
    director->runWithScene(scene);

    return true;
}

修改CCGLView.h文件

添加 成員

public:
	Size getResolutionSize();
	float getCurrentAndOrignalRatioX();
	float getCurrentAndOrignalRatioY();
	Vec2 MyPoint(cocos2d::Vec2& pos);

修改CCGLView.cpp文件

添加實現

float GLView::getCurrentAndOrignalRatioX()
{
	return m_currentAndOrignalRatioX;
}
float GLView::getCurrentAndOrignalRatioY()
{
	return m_currentAndOrignalRatioY;
}

Size GLView::getResolutionSize()
{
	return m_resolutionSize;
}

cocos2d::Vec2 GLView::MyPoint( cocos2d::Vec2& pos )
{
	Vec2 _point = pos-=m_resolutionSize/2;  

	Vec2 _offset;  
	switch (this->getResolutionPolicy())  
	{  
	case ResolutionPolicy::FIXED_HEIGHT:  
		{  
			_offset = Vec2 (_point.x/getCurrentAndOrignalRatioY()*getCurrentAndOrignalRatioX() ,_point.y );  
			break;  
		}  
	case ResolutionPolicy::FIXED_WIDTH:  
		{  
			_offset =Vec2 (_point.x ,_point.y/getCurrentAndOrignalRatioX()*getCurrentAndOrignalRatioY() );   
			break;  
		}  
	default:  
		break;  
	}  

	return (Vec2(m_resolutionSize/2) +_offset );  
}  
修改函數定義

void GLView::setDesignResolutionSize(float width, float height, ResolutionPolicy resolutionPolicy)
{
    CCASSERT(resolutionPolicy != ResolutionPolicy::UNKNOWN, "should set resolutionPolicy");
    
    if (width == 0.0f || height == 0.0f)
    {
        return;
    }

    _designResolutionSize.setSize(width, height);
	m_resolutionSize = _designResolutionSize;
    _resolutionPolicy = resolutionPolicy;
    
    updateDesignResolutionSize();
 }

void GLView::updateDesignResolutionSize()
{
    if (_screenSize.width > 0 && _screenSize.height > 0
        && _designResolutionSize.width > 0 && _designResolutionSize.height > 0)
    {
        m_currentAndOrignalRatioX =  _scaleX = (float)_screenSize.width / _designResolutionSize.width;
        m_currentAndOrignalRatioY = _scaleY = (float)_screenSize.height / _designResolutionSize.height;
        
        if (_resolutionPolicy == ResolutionPolicy::NO_BORDER)
        {
            _scaleX = _scaleY = MAX(_scaleX, _scaleY);
        }
        
        else if (_resolutionPolicy == ResolutionPolicy::SHOW_ALL)
        {
            _scaleX = _scaleY = MIN(_scaleX, _scaleY);
        }
        
        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_HEIGHT) {
            _scaleX = _scaleY;
            _designResolutionSize.width = ceilf(_screenSize.width/_scaleX);
        }
        
        else if ( _resolutionPolicy == ResolutionPolicy::FIXED_WIDTH) {
            _scaleY = _scaleX;
            _designResolutionSize.height = ceilf(_screenSize.height/_scaleY);
        }
        
        // calculate the rect of viewport
        float viewPortW = _designResolutionSize.width * _scaleX;
        float viewPortH = _designResolutionSize.height * _scaleY;
        
        _viewPortRect.setRect((_screenSize.width - viewPortW) / 2, (_screenSize.height - viewPortH) / 2, viewPortW, viewPortH);
        
        // reset director's member variables to fit visible rect
        auto director = Director::getInstance();
        director->_winSizeInPoints = getDesignResolutionSize();
        director->createStatsLabel();
        director->setGLDefaultValues();
    }
}


發佈了215 篇原創文章 · 獲贊 8 · 訪問量 68萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章