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

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

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

  • 写回答

23条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 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日