a2563639625 2024-04-13 17:43 采纳率: 0%
浏览 26
已结题

把全局悬浮窗改为局内悬浮窗

#需要把全局悬浮窗改为局内悬浮窗,包括绘图
#imgui的源码,aide来打包
成功300米

  • 写回答

24条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 17:43
    关注
    获得0.30元问题酬金

    引自免费微信小程序:皆我百晓生

    要将全局悬浮窗改为局内悬浮窗,并且包括绘图功能,可以按照以下步骤进行操作:

    1. 修改ImGui窗口设置: 在创建或更新ImGui窗口时,需要调整其定位方式和范围,使其局限于某个特定的游戏视口(或称局域)内。这通常涉及修改窗口的位置、大小及窗口边界限制。

      ImGui::SetNextWindowPos(ImVec2(windowX, windowY)); // 设置窗口左上角位置
      ImGui::SetNextWindowSize(ImVec2(windowWidth, windowHeight)); // 设置窗口大小
      ImGui::SetNextWindowConstraints(ImVec2(minWidth, minHeight), ImVec2(maxWidth, maxHeight)); // 可选:设置窗口尺寸约束
      
      ImGui::Begin("In-Game Overlay", &isOpen, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove); // 创建窗口,禁用用户手动移动和缩放
      

      这里windowX, windowY, windowWidth, windowHeight, minWidth, maxWidth, minHeight, maxHeight应根据实际需求设置为局域视口的相应坐标和尺寸。同时,通过ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove标志禁止用户手动调整窗口大小和位置。

    2. 与游戏视口同步: 为了确保悬浮窗始终位于游戏视口内并随其移动和缩放,你需要在每一帧更新前获取当前游戏视口的坐标和尺寸,并据此更新悬浮窗的位置和大小。这通常需要从游戏引擎中获取这些信息,具体实现取决于你所使用的引擎。

      void UpdateInGameOverlay()
      {
          // 获取当前游戏视口坐标和尺寸
          float viewportX, viewportY, viewportWidth, viewportHeight;
          GetViewportCoordinates(&viewportX, &viewportY, &viewportWidth, &viewportHeight);
      
          // 更新悬浮窗位置和大小
          ImGui::SetNextWindowPos(ImVec2(viewportX + offsetX, viewportY + offsetY));
          ImGui::SetNextWindowSize(ImVec2(viewportWidth * widthRatio, viewportHeight * heightRatio));
      
          // 绘制悬浮窗内容
          ImGui::Begin("In-Game Overlay", &isOpen, ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove);
          // ... 绘制内容代码 ...
          ImGui::End();
      }
      

      上述代码中的GetViewportCoordinates是一个假设存在的函数,用于从游戏引擎获取视口坐标和尺寸。offsetXoffsetYwidthRatioheightRatio是控制悬浮窗相对于视口位置和大小的比例偏移量,可以根据需要调整。

    3. 绘图功能: 使用ImGui提供的绘图API在悬浮窗内绘制所需内容。例如,可以使用ImGui::Image()显示图像,ImGui::PlotLines()绘制折线图,或直接使用ImDrawList API进行自定义绘图。

      ImDrawList* draw_list = ImGui::GetWindowDrawList();
      
      // 绘制矩形
      draw_list->AddRectFilled(ImVec2(rectX, rectY), ImVec2(rectX + rectWidth, rectY + rectHeight), IM_COL32(255, 64, 64, 255));
      
      // 绘制文本
      ImGui::Text("In-Game Overlay Text");
      
      // 显示图像
      ImGui::Image((void*)(intptr_t)textureID, ImVec2(imageWidth, imageHeight));
      

      具体绘图内容需根据实际需求编写。确保在ImGui::Begin()ImGui::End()之间进行绘图操作。

    综上所述,通过调整ImGui窗口设置、与游戏视口同步以及利用ImGui绘图功能,即可实现全局悬浮窗到局内悬浮窗的转换。请根据你的游戏引擎和项目具体情况调整上述代码。如果你需要更具体的帮助,如关于如何从特定游戏引擎获取视口信息等,可以提供更详细的信息,以便进一步指导。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月21日
  • 创建了问题 4月13日

悬赏问题

  • ¥20 ESP32使用MicroPyhon开发,怎么获取485温湿度的值,温湿度计使用的鞋子是Modbus RTU
  • ¥50 苹果MGIE项目部署缺少emb权重
  • ¥15 采用ansys进行机翼在特定路径下的打孔过程中的受力分析
  • ¥15 单片机adb主机连接手机,usb调试密钥无法保存
  • ¥15 已知X和Y有以下关系,求X和Y的关系式
  • ¥15 net core 同时编辑怎么防止数据多保存了
  • ¥15 matlab做ba模型让其在ba和er规则下生长
  • ¥15 请问Quartus的Verilog代码怎么写?
  • ¥100 Mac 版foxmail 收邮件问题
  • ¥15 QWebEngineView