Cocos2d для Android с поддержкой разных разрешений

Я пытаюсь создать игру, и мне было интересно, как можно поддерживать разные разрешения и размеры экрана. Для положения спрайта я реализовал базовую функцию, которая устанавливает положение в соответствии с определенным соотношением, которое я получаю, получая ширину и высоту экрана из метода winSize в sharedDirector.

Но этот подход не проверен, так как мне еще предстоит разработать что-то для расчета масштабного коэффициента для спрайтов в зависимости от разрешения устройства. Может ли кто-нибудь посоветовать мне какой-нибудь метод и советы, с помощью которых я могу правильно рассчитать масштабирование спрайтов и предложить систему, позволяющую избежать пикселизации спрайтов, если я применю какой-либо такой метод.

Я поискал в Google и обнаружил, что Cocos2d-x поддерживает разные разрешения и размеры, но я обязан использовать только Cocos2d.

РЕДАКТИРОВАТЬ: Я немного смущен, так как это моя первая игра. Пожалуйста, укажите на ошибки, которые я мог допустить.


person Parvaz Bhaskar    schedule 15.04.2013    source источник


Ответы (1)


Хорошо, я, наконец, сделал это, получив разрешение на отображение устройства, например

getResources().getResources().getDisplayMetrics().densityDpi

и на его основе я умножаю коэффициент PTM на 0,75,1,1,5,2,0 для ldpi, mdpi, hdpi и xhdpi соответственно.

Я также соответствующим образом меняю масштаб спрайтов. А для позиционирования я оставил 320X480 в качестве базового, а затем умножил его на отношение моих текущих x и y в пикселях к моим базовым пикселям.

РЕДАКТИРОВАТЬ: добавление кода для лучшего понимания:

public class MainLayer extends CCLayer()
{
CGsize size; //this is where we hold the size of current display
float scaleX,scaleY;//these are the ratios that we need to compute
public MainLayer()
{
  size = CCDirector.sharedDirector().winSize();
  scaleX = size.width/480f;//assuming that all my assets are available for a 320X480(landscape) resolution;
  scaleY = size.height/320f;

  CCSprite somesprite = CCSprite.sprite("some.png");
  //if you want to set scale without maintaining the aspect ratio of Sprite

  somesprite.setScaleX(scaleX);
  somesprite.setScaleY(scaleY);
  //to set position that is same for every resolution
  somesprite.setPosition(80f*scaleX,250f*scaleY);//these positions are according to 320X480 resolution.
  //if you want to maintain the aspect ratio Sprite then instead up above scale like this
  somesprite.setScale(aspect_Scale(somesprite,scaleX,scaleY));

}

public float aspect_Scale(CCSprite sprite, float scaleX , float scaleY)
    {
        float sourcewidth = sprite.getContentSize().width;
        float sourceheight = sprite.getContentSize().height;

        float targetwidth = sourcewidth*scaleX;
        float targetheight = sourceheight*scaleY;
        float scalex = (float)targetwidth/sourcewidth;
        float scaley = (float)targetheight/sourceheight;


        return Math.min(scalex,scaley);
    }
}
person Parvaz Bhaskar    schedule 17.04.2013
comment
Привет, я также работаю над Cocos2d-android. Я не понял, как обращаться с мультиразрешением в Android в cocos2d, потому что я работаю над игрой, поэтому xml не доступен для работы на CCLayer, и ВСЕ изображения, поступающие из папки «Активы». Не могли бы вы дать мне краткое описание? идея Как исправить это, когда я помещаю все изображения? подскажите, пожалуйста - person ishu; 08.06.2013
comment
вам нужно будет поместить все свои изображения только в активы, вам просто нужно масштабировать их в соответствии с разрешением экрана. Просто получите winsize от cocos2d, согласно ответу, я оставил 320X480 в качестве базового разрешения, поэтому все мои активы подходят для 320X480, что я делаю, так это получаю соотношение ширины экрана и ширины моего базового разрешения, поэтому это дает мне масштабный коэффициент X. Затем я применяю этот масштаб к каждому спрайту. Надеюсь, ты понял. - person Parvaz Bhaskar; 10.06.2013
comment
да, я понял, но мне нужно создать разные папки для всех размеров изображения? - person ishu; 10.06.2013
comment
Также я хотел бы добавить, что если вы устанавливаете свои позиции и хотите, чтобы они были одинаковыми для каждого разрешения, умножьте свою позицию на коэффициент масштаба x и коэффициент масштаба y, который вы рассчитали. - person Parvaz Bhaskar; 10.06.2013
comment
Что такое somesprite.setPosition(80fscaleX, 250fscaleY);? Как вы рассчитываете эти значения (80f и 250f)? - person nano; 24.10.2014