Адаптация под все мониторы

Статус
В этой теме нельзя размещать новые ответы.
Версия Minecraft
1.6.4
54
1
0
Сделал кастомный прицел с помощью тесселятора, учитываю Scale Factor монитора из настроек и разрешения, в итоге в полноэкранном режиме все хорошо, а в маленьком окошке и другом разрешении экрана все косо.Что я делаю не так? разрешение в котором все было хорошо 1280х720 , поставил 1920х1080 и усе..

Код:
 int w = event.resolution.getScaledWidth();
 int h = event.resolution.getScaledHeight();
int sf = event.resolution.getScaleFactor();

int texSizeX = 1024;
int texSizeY = 1024;
float scale1 = 0.4F * sf;


double gPosX1 = (w + 26 * scale1) / scale1;
 double gPosY1 = (h - 18 * scale1) / scale1;

 GL11.glPushMatrix();
 GL11.glEnable(GL11.GL_BLEND);
 GL11.glScalef(scale, scale, 1);
 SMRenderHelper.drawTextureCustomSize(gPosX1, gPosY1, 1, 48, 739, 128, 128, texSizeX, texSizeY);
 GL11.glDisable(GL11.GL_BLEND);
 GL11.glPopMatrix();
Код:
public class SMRenderHelper {
    public static void drawTextureCustomSize(double posX, double posY, double posZ, double startPixX, double startPixY, double pieceSizeX, double pieceSizeY, float sizeTextureX, float sizeTextureY)
    {
        float f4 = 1.0F / sizeTextureX;
        float f5 = 1.0F / sizeTextureY;
        Tessellator tessellator = Tessellator.instance;
        tessellator.startDrawingQuads();
        tessellator.addVertexWithUV((double)posX, (double)(posY + pieceSizeY), posZ, (double)(startPixX * f4), (double)((startPixY + (float)pieceSizeY) * f5));
        tessellator.addVertexWithUV((double)(posX + pieceSizeX), (double)(posY + pieceSizeY), posZ, (double)((startPixX + (float)pieceSizeX) * f4), (double)((startPixY + (float)pieceSizeY) * f5));
        tessellator.addVertexWithUV((double)(posX + pieceSizeX), (double)posY, posZ, (double)((startPixX + (float)pieceSizeX) * f4), (double)(startPixY * f5));
        tessellator.addVertexWithUV((double)posX, (double)posY, posZ, (double)(startPixX * f4), (double)(startPixY * f5));
        tessellator.draw();
    }
 

Вложения

  • полный экран.png
    полный экран.png
    81.5 KB · Просмотры: 17
  • в окне.png
    в окне.png
    10.9 KB · Просмотры: 15
  • 1920x1080 полный.png
    1920x1080 полный.png
    67.6 KB · Просмотры: 13
Решение
Dahaka написал(а):
Да, я даже не вникал особо, что там в коде. Просто я вижу, что человек не знает, как центровать. Написал кучу магических чисел и удивляется, почему не работает.
Я и написал "ширина/высота прицела"

Если бы было все так просто. Здесь я просто делю на два ширину и высоту монитора, и по идеи положение в котором сейчас находится прицел будет одинаково смотреться на любых разрешениях. Но, он не по центру.

double gPosX1 = w  /2;

double gPosY1 = h /2;
608
5
15
Dahaka написал(а):
Нигде не вижу подобного кода
(Ширина/высота экрана - ширина/высота прицела) / 2

Дело в том, что при растяжении текстуры glScaleF она смещается, соответственно если мы растягиваем 1 пиксель на 1.5, то и отнимать надо же не пиксели*1, а пиксели*1,5
 
2,505
81
397
Да, я даже не вникал особо, что там в коде. Просто я вижу, что человек не знает, как центровать. Написал кучу магических чисел и удивляется, почему не работает.
Я и написал "ширина/высота прицела"
 
54
1
0
Dahaka написал(а):
Да, я даже не вникал особо, что там в коде. Просто я вижу, что человек не знает, как центровать. Написал кучу магических чисел и удивляется, почему не работает.
Я и написал "ширина/высота прицела"

Если бы было все так просто. Здесь я просто делю на два ширину и высоту монитора, и по идеи положение в котором сейчас находится прицел будет одинаково смотреться на любых разрешениях. Но, он не по центру.

double gPosX1 = w  /2;

double gPosY1 = h /2;
 

Вложения

  • Screenshot_2.png
    Screenshot_2.png
    162.9 KB · Просмотры: 27
1,239
2
24
Код:
@SubscribeEvent
    @SideOnly(Side.CLIENT)
    public void onRenderGameOverlay(RenderGameOverlayEvent event) {
        if(event.type == RenderGameOverlayEvent.ElementType.CHAT) {
            event.setCanceled(true);
            drawCrosshair( event.resolution.getScaledWidth(), event.resolution.getScaledHeight());
        }
    }


    public static void drawCrosshair( int k, int l) {

        ResourceLocation guiTexture = new ResourceLocation("modid", "textures/.png");
        TextureManager engine = Minecraft.getMinecraft().renderEngine;
        int h = 12;
        GL11.glPushMatrix();
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
        int par1 = k / 2 - h, par2 = l / 2 - h;
        Minecraft.getMinecraft().getTextureManager().bindTexture(guiTexture);
        Tessellator t = Tessellator.instance;
        t.startDrawingQuads();
        t.setColorRGBA(22, 145, 76, 255);
        t.addVertexWithUV(par1 + 0, par2 + 2*h, -90, 0, 1);
        t.addVertexWithUV(par1 + 2*h, par2 + 2*h, -90, 1, 1);
        t.addVertexWithUV(par1 + 2*h, par2 + 0, -90, 1, 0);
        t.addVertexWithUV(par1 + 0, par2 + 0, -90, 0, 0);
        t.draw();
       GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
        GL11.glColor4f(1.0F, 0.5F, 0.0F, 0.7F);
        GL11.glPopMatrix();
        engine.bindTexture(Gui.icons);
    }
 
2,505
81
397
Зачем какие-то drawTextureCustomSize или рукописные способы (как выше), если есть стандартный метод в Gui, по крайней мере в 1.7.10.
Если у тебя прицел не одинаково смотрятся, то, наверное, дело в этом
 
608
5
15
Dahaka написал(а):
Зачем какие-то drawTextureCustomSize или рукописные способы (как выше), если есть стандартный метод в Gui, по крайней мере в 1.7.10.
Если у тебя прицел не одинаково смотрятся, то, наверное, дело в этом
Этот стандартный метод расчитан под 256х256, разве не?


Agravaine написал(а):
Код:
float scale = 1.5F;
int width = (int)(e.resolution.getScaledWidth() / scale);
int height = (int)(e.resolution.getScaledHeight() / scale);
Вот. И относительно ширины/высоты отталкивайся.
Это тоже бред же. Центр экрана будет в центре экрана, вне зависимости от scale, зачем ещё делить на scale?

Другое дело, что при glScaleF текстура увеличивается в 1,5 раза при glScaleF, а так-как обычно рендерят с верхнего правого угла на юго-восток, то и увеличиваться она будет на юго-восток, а соответственно, надо делать приблизительно так:

x = (w - textureSizeX*scale)/2 (отступаем уже не 10 пикселей, а 15, так-как текстура растянулась на 10+5 пикселей)


Я это в самом начале ещё писал...
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху