игра отображается в нижней левой части моего экрана в SDL2 - PullRequest
1 голос
/ 07 января 2020

Я недавно обновил свою ма c, и код, который обычно работал, перестал работать. Когда я сейчас запускаю свою программу (игру), окно по-прежнему имеет правильные размеры, но элементы отображаются в левой нижней части моего экрана.

what I see

Я не знаю Я не понимаю, откуда это.

вот. cpp, который я использовал в примере:

#include "../../include/game.h"

int     main(int argc, char **argv)
{
    SDL_Window      *window;
    SDL_Renderer    *render;
    int             w;
    int             h;

    (void)argc;
    (void)argv;

    SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER);
    window = SDL_CreateWindow("lul", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, WINDOW_W, WINDOW_H, 0);
    render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
    SDL_GetWindowSize(window, &w, &h);

    SDL_Surface     *surface;
    SDL_Texture     *texture;

    surface = IMG_Load("FondHome2.jpg");
    texture = SDL_CreateTextureFromSurface(render, surface);

    SDL_Event   event;
    bool        close_requested = false;

    while (!close_requested)
    {
        while (SDL_PollEvent(&event))
        {
            if (event.type == SDL_QUIT)
            {
                close_requested = true;
            }
        }
        SDL_RenderCopy(render, texture, NULL, NULL);
        SDL_RenderPresent(render);
    }

    return(0);
}

, а вот используемый .h:

#ifndef GAME_H
# define GAME_H

# include <SDL2/SDL.h>
# include <SDL2/SDL_timer.h>
# include <SDL2/SDL_image.h>
# include <SDL2/SDL_ttf.h>

# include <fstream>
# include <iostream>
# include <string>
# include <vector>
# include <stdarg.h>
# include <math.h>

# define WINDOW_W 400
# define WINDOW_H 300

#endif

1 Ответ

5 голосов
/ 08 января 2020

См. Содержимое, относящееся к различиям с высоким разрешением при работе с дисплеями Retina на Ma c: SDL_GL_GetDrawableSize . Передайте флаг SDL_WINDOW_ALLOW_HIGHDPI в SDL_CreateWindow, и API SDL_Render должен сделать все правильно.

Проблема в том, что без включенного высокого DPI фактическая ширина и высота вашего SDL_Window соответствуют большему количеству пикселей чем вы передали SDL_CreateWindow (в этом случае 2X ширина и высота). Похоже, что SDL_RenderCopy все еще думает, что целевой кадровый буфер имеет размер 400x300, что правильно, когда масштабный коэффициент DPI равен 1. Когда изображение рисуется, покрывается только 1/4 физического пространства.

Я могу не скажу точно, где проблема масштабирования происходит без чтения источника SDL2, поскольку это может происходить с внутренним кадровым буфером или во время последнего бита, но проблема заключается в предположении, что коэффициент масштабирования DPI равен 1. Передача SDL_WINDOW_ALLOW_HIGHDPI флаг при создании окна указывает SDL запрашивать фактическое значение DPI монитора, которое будет использоваться.

Проблема, связанная с данной: SDL 2.0 retina ma c

...