SDL使用具有多个视口的屏幕坐标在屏幕上绘制图像

时间:2017-07-30 16:56:18

标签: c++ image mouse viewport sdl-2

我目前在游戏中有两个视口。一个用于顶部的信息(健康,黄金,魔术等),另一个用于显示地图区域。我使用图像创建了自己的自定义鼠标光标,我就像显示任何其他图像一样,并根据鼠标光标位置更新位置。我唯一的问题是我只能在视口上绘制该图像。我把它设置在地图区域上,当我将鼠标移到顶部时;它不会在信息区域显示。它离开了窗户。所以我做的第一件事(我知道它不会工作,但无论如何都要测试)是在两个视口上绘制鼠标。但是当移动到屏幕顶部(LOL)时,它会显示两个鼠标光标。我的问题是如何使用视口外的屏幕(或窗口)坐标在屏幕上绘制鼠标图像。那有意义吗?我希望能够将鼠标移动到屏幕上的任何位置,这样我就可以点击地图视口中的项目以及信息视口。

我的视口类非常简单:

Viewport.h

#pragma once

#include <SDL.h>

class Viewport
{
public:
    Viewport(int x, int y, int width, int height);
    ~Viewport();

    SDL_Rect GetViewport();

private:
    SDL_Rect viewport;
};

Viewport.cpp

#include "Viewport.h"

Viewport::Viewport(int x, int y, int width, int height)
{
    viewport.x = x;
    viewport.y = y;
    viewport.w = width;
    viewport.h = height;
}

Viewport::~Viewport()
{

}

SDL_Rect Viewport::GetViewport()
{
    return viewport;
}

在我的Game类中,我为每个Viewport初始化两个变量

Viewport hud;
Viewport arena;

在构造函数中,我将它们初始化为适当的大小。然后在我的游戏绘图功能中,我相应地设置视口并在适当的视口中绘制。

// gfx is my Graphics class. Everything that has to do with drawing is inside that class; including setting the viewport for the render.
gfx.SetViewport(hud.GetViewport());
// This is where I would draw stuff on the hud viewport

gfx.SetViewport(arena.GetViewport());
// Where I draw the map, enemies, etc.

我的SetViewport功能设置如下:

void Graphics::SetViewport(SDL_Rect viewport)
{
    SDL_RenderSetViewport(renderer, &viewport);
}

如何绘制鼠标图像(视口不是相关的)。以下是我正在谈论的一些图片。

仅在竞技场上展示并且不会在hud上显示。 enter image description here

如果我在两个视口上绘制鼠标,则在两者上显示鼠标 enter image description here

编辑:我做了一个适用于此游戏的解决方法 我只是担心它会在越来越大的游戏中表现不佳

我创建了另一个与屏幕(窗口)一样大的视口,并且我将鼠标绘制到该视口。

1 个答案:

答案 0 :(得分:0)

超级迟到的答案,但现在是。调用SDL_RenderSetViewport(渲染器,NULL)会将视口重置为整个窗口。

您应该在调用SDL_PollEvent之前执行此操作,因为如果在视口处于活动状态时轮询鼠标事件,则鼠标移动事件坐标将相对于视口而不是主窗口。