【问题标题】:game displayed in the bottom-left quarter of my screen in SDL2游戏显示在 SDL2 屏幕的左下角
【发布时间】:2020-04-25 07:49:40
【问题描述】:

我最近更新了我的 mac,正常运行的代码停止运行。 当我现在运行我的程序(游戏)时,窗口仍然具有正确的尺寸,但元素显示在屏幕的左下角。

我不明白它是从哪里来的。

这是我在示例中使用的 .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

【问题讨论】:

  • @ÖöTiib 完成,抱歉不知道!
  • 在 Mac 上使用 Retina 显示器时查看与高 DPI 差异相关的内容:wiki.libsdl.org/SDL_GL_GetDrawableSize。将 SDL_WINDOW_ALLOW_HIGHDPI 标志传递给 SDL_CreateWindow,并查看 SDL_Render API 是否正确。如果没有,请使用 SDL_GL_GetDrawableSize 获取大小并将该信息作为第四个参数传递给 SDL_RenderCopy,然后查看它的作用。相关:stackoverflow.com/questions/18544881/sdl-2-0-retina-mac
  • @rationalcoder 第一个选项有效!非常感谢您的帮助 ! :D

标签: c++ macos sdl hidpi


【解决方案1】:

在 Mac 上使用 Retina 显示器时查看与高 DPI 差异相关的内容:SDL_GL_GetDrawableSize。将SDL_WINDOW_ALLOW_HIGHDPI 标志传递给SDL_CreateWindow,SDL_Render API 应该会做正确的事情。

问题在于,如果不启用高 DPI,SDL_Window 的实际宽度和高度对应的像素比您传递给 SDL_CreateWindow 的像素多(在本例中为 2X 宽度和高度)。貌似SDL_RenderCopy还是认为目标framebuffer是400x300,在DPI缩放因子为1的情况下是正确的。绘制图像时,只覆盖了1/4的物理空间。

如果不读取 SDL2 源,我无法准确告诉您缩放问题发生在哪里,因为它可能发生在内部帧缓冲区或最终 blit 期间,但问题是假设 DPI 缩放因子为 1。在窗口创建期间传递 SDL_WINDOW_ALLOW_HIGHDPI 标志告诉 SDL 查询要使用的实际监视器 DPI。

相关问题:SDL 2.0 retina mac

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 2014-12-14
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多