How to support multi-resolution?

Android have a lot of resolution.
(and if i support ios, i’ll meet more resolution)

I was resolve this problem when i use libgdx, i use camera’s viewport projection.

but i don’t know how to resolve this problem in cocos2d-x.

I did search many time, but i can’t find solution.

please help me.


by korean,

안드로이드에는 많은 해상도가 있습니다.
(만약에 ios도 지원한다면 더 많은 해상도를 지원해야하죠)
Libgdx 엔진을 썼을 때에는 이게 3d 게임엔진이였기 때문에 camera의 viewport projection을 이용하여 해결했었습니다.
하지만 cocos2d-x에서는 어떻게 이 문제를 해결해야 할지 모르겠습니다.
전 굉장이 많이 검색을 했지만 해결책을 찾지 못했습니다.
누가 제발 도와줘요!


by Korean

한국분이시군요~

cocos2d-x도 3d기반 엔진이죠~

모든 해상도를 지원하게 할 수 있어요

제가 사용한 방법을 공유 해드릴게요

// Util.h

#ifndef UTIL_H
#define UTIL_H

#include “cocos2d.h”

#define POS( x, y ) cocos2d::CCPointMake( g_nMargin_x + x, g_nMargin_y + y )

extern int g_nMargin_x;
extern int g_nMargin_y;

extern float g_fBaseImageWidth;
extern float g_fBaseImageHeight;

class Util
{
public:
static void setDefinition();
static void setScaleNode( cocos2d::CCNode **node );
public:
static float scaleX;
static float scaleY;
static float scaleX_reverse;
static float scaleY_reverse;
static float scaleRatio;
};
#endif // UTIL_H
/////////////////////
// Util.cpp
#include “Util.h”
using namespace cocos2d;
int g_nMargin_x = 0;
int g_nMargin_y = 0;
float g_fBaseImageWidth = 320.0f;
float g_fBaseImageHeight = 480.0f;
float Util::scaleX = 1.0f;
float Util::scaleY = 1.0f;
float Util::scaleX_reverse = 1.0f;
float Util::scaleY_reverse = 1.0f;
float Util::scaleRatio = 1.0f;
void Util::setDefinition
{
CCSize size = CCDirector::sharedDirector->getWinSize;
CCSize viewSize = CCDirector::sharedDirector->getOpenGLView->getSize;
// 사용하시는 이미지의 크기를 설정합니다. 보통 아이폰 해상도에 맞춰 320x480을 사용하죠, 320x480 이미지 셋들만 있으면 모든 해상도를 지원할수 있습니다.
g_fBaseImageWidth = 320.0f;
g_fBaseImageHeight = 480.0f;
g_nMargin_x = / 2;
g_nMargin_y = / 2;
}
void Util::setScaleNode
{
if
{
CCSize viewSize = CCDirector::sharedDirector~~>getOpenGLView~~>getSize;

if
{
Util::scaleY = viewSize.height / g_fBaseImageHeight;
Util::scaleY_reverse = g_fBaseImageHeight / viewSize.height;
}
if
{
Util::scaleX = viewSize.width / g_fBaseImageWidth;
Util::scaleX_reverse = g_fBaseImageWidth / viewSize.width;
}
node~~>setScaleX;
node~~>setScaleY;
Util::scaleRatio = / 2;
}
}
위 함수들을 이용해서 setDefinition 함수는 최초 어플이 실행될때 한번 해서 계산해주면 됩니다.
AppDelegate.cpp 에 bool AppDelegate::applicationDidFinishLaunching 에서 실행 해주면 되구요.
setScaleNode 함수는 Layer 마다 해주면 되요.
최상위 레이어에 한번 해주면 됩니다.
HelloWorld 라는 Layer가 있다면 HelloWorld::init 함수 안에서 Util::setScaleNode; 를 호출 해주시면 됩니다~
그리고 위와 같이 했을 경우 포지션 잡을 때 ccp 나 CCPointMake 대신 위에 정의 해준 POS () 를 이용해서 잡으시면 되요.

이유는 레이어를 확대/축소 하였을 때 중점 기준으로 확대/축소가 되기 때문에 그 차이 만큼 생긴 여백을 나중에 옮겨주기 때문이에요.

그리고 touch 이벤트에서 좌표를 받을 때도 계산을 다르게 해줘야 편해요.

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
CCTouch**touch;
CCPoint location;
CCPoint pConvertPos;

touch = (CCTouch**)pTouches~~>anyObject;
CCPoint touchLocation = touch~~>locationInView);
touchLocation = CCDirector::sharedDirector->convertToGL;
touchLocation.x**= Util::scaleX_reverse;
touchLocation.y *= Util::scaleY_reverse;
}

꼭 이렇게 안해도 되는데 아이폰/안드로이드 동시 개발할 때 편리하게 하기 위해서 하다보니 좀 복잡하게 됬네요~ㅎㅎ
—————————————————————————————————

감사합니디 ㅠㅠ 혹시 이메일 같은 거라도 좀 얻을 수 있을까요?