OGEngine之多分辨率支持策略和原理

對於AndEngine的屏幕適配,通常使用RatioResolutionPolicy來拉伸屏幕,但是當遊戲分辨率與手機分辨率的寬高比例不一致的時候,就不可避免的出現部分的黑色區域,影響遊戲體驗,目前OGengine開源引擎已經解決了該問題,可以達到滿屏自適應屏幕

遊戲設計分辨率:

我們自己定義遊戲的分辨率是多少(例如800×480),然後UI根據這個分辨率來進行繪圖

手機屏幕分辨率:手機自身屏幕的分辨率

期望分辨率=遊戲設計分辨率

實際分辨率=手機屏幕分辨率

首先確定是橫屏遊戲還是豎屏遊戲,假設手機是320×480,是豎屏遊戲,並且遊戲設計分辨率是480×800

舉例:以保持寬不變,高適配。假設UI給的圖是480×800

屏幕寬高比=實際分辨率寬(320)/實際分辨率高(480)=期望分辨率寬(480)/期望分辨率高

我們可以得到期望分辨率高等於720,因爲UI給圖的高是800,那麼空出來那80=800-720部分就是圖中沒有陰影的那一部分。


在手機顯示效果圖如下



以下是相關代碼

  1. @Override

  2. protectedPixelPerfectEngineOptions onCreatePixelPerfectEngineOptions() {

  3.         PixelPerfectEngineOptionspixelPerfectEngineOptions=

  4.                         new PixelPerfectEngineOptions(this,ZoomCamera.class);

  5.         pixelPerfectEngineOptions.setDesiredSize(800);

  6.         pixelPerfectEngineOptions

  7.                         .setScreenOrientation(ScreenOrientation.LANDSCAPE_FIXED);

  8.         pixelPerfectEngineOptions

  9.                         .setPixelPerfectMode(PixelPerfectMode.CHANGE_HEIGHT);

  10.         returnpixelPerfectEngineOptions;

  11. }

複製代碼

  1. public EngineOptions createEngineOptions() {

  2.         float[] screenSize = this.getScreenSize();

  3.         float screenWidth = screenSize[0];

  4.         float screenHeight = screenSize[1];

  5.         float screenRatio = screenWidth / screenHeight;

  6.         float cameraWidth = this.mDesiredSize;

  7.         float cameraHeight = this.mDesiredSize;

  8.         if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_WIDTH) {

  9.                 cameraWidth = this.mDesiredSize * screenRatio;

  10.         } else if (this.mPixelPerfectMode == PixelPerfectMode.CHANGE_HEIGHT) {

  11.                 cameraHeight = this.mDesiredSize / screenRatio;

  12.         }

  13.         Class<?>[] parameterTypes = { float.class, float.class, float.class,float.class };

  14.         Object[] argParam = { 0.0f, 0.0f, cameraWidth, cameraHeight };

  15.         Camera camera = ReflectionUtils.newInstance(this.mCameraCls,

  16.                 parameterTypes, argParam);

  17.         EngineOptions engineOptions = new EngineOptions(true,

  18.                 this.mScreenOrientation, new FillResolutionPolicy(), camera);

  19.         engineOptions.getTouchOptions().setNeedsMultiTouch(true);

  20.         engineOptions.getAudioOptions().setNeedsSound(true);

  21.         engineOptions.getAudioOptions().setNeedsMusic(true);

  22.         engineOptions.getRenderOptions().setDithering(true);

  23.         return engineOptions;

  24. }

複製代碼


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章