SDL2 屏幕左下角显示的游戏
game displayed in the bottom-left quarter of my screen in SDL2
我最近更新了我的 mac 并且通常 运行ning 的代码停止运行了。
当我现在 运行 我的程序(游戏)时 window 仍然具有正确的尺寸,但元素显示在屏幕的左下角。
我不明白它来自哪里。
这是我在示例中使用的 .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
在 Mac 上查看与高 DPI 差异相关的内容:Mac:SDL_GL_GetDrawableSize。将 SDL_WINDOW_ALLOW_HIGHDPI
标志传递给 SDL_CreateWindow
,SDL_Render API 应该做正确的事情。
问题是,如果没有启用高 DPI,您 SDL_Window
的实际宽度和高度对应的像素比您传递给 SDL_CreateWindow
的像素多(在本例中为 2 倍宽度和高度)。好像SDL_RenderCopy
还是认为目标framebuffer是400x300,在DPI缩放因子为1的情况下是正确的。绘制图像时,只覆盖了物理space的1/4。
如果不阅读 SDL2 源代码,我无法准确告诉您缩放问题发生在何处,因为它可能发生在内部帧缓冲区或最终 blit 期间,但问题是假设 DPI 缩放因子为1. 在 window 创建期间传递 SDL_WINDOW_ALLOW_HIGHDPI
标志告诉 SDL 查询要使用的实际显示器 DPI。
相关问题:SDL 2.0 retina mac
我最近更新了我的 mac 并且通常 运行ning 的代码停止运行了。 当我现在 运行 我的程序(游戏)时 window 仍然具有正确的尺寸,但元素显示在屏幕的左下角。
我不明白它来自哪里。
这是我在示例中使用的 .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
在 Mac 上查看与高 DPI 差异相关的内容:Mac:SDL_GL_GetDrawableSize。将 SDL_WINDOW_ALLOW_HIGHDPI
标志传递给 SDL_CreateWindow
,SDL_Render API 应该做正确的事情。
问题是,如果没有启用高 DPI,您 SDL_Window
的实际宽度和高度对应的像素比您传递给 SDL_CreateWindow
的像素多(在本例中为 2 倍宽度和高度)。好像SDL_RenderCopy
还是认为目标framebuffer是400x300,在DPI缩放因子为1的情况下是正确的。绘制图像时,只覆盖了物理space的1/4。
如果不阅读 SDL2 源代码,我无法准确告诉您缩放问题发生在何处,因为它可能发生在内部帧缓冲区或最终 blit 期间,但问题是假设 DPI 缩放因子为1. 在 window 创建期间传递 SDL_WINDOW_ALLOW_HIGHDPI
标志告诉 SDL 查询要使用的实际显示器 DPI。
相关问题:SDL 2.0 retina mac