You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Raylib C++调用IsMouseButtonPressed实现线段绘制触发死循环

raylib拖拽绘制线段问题排查与解决

问题成因

  • raylib的输入状态(包括IsMouseButtonPressed、GetMousePosition等接口的返回值)只会在每帧调用PollInputEvents()(或是封装了该接口的BeginDrawing()/EndDrawing()流程)时才会刷新。你写的独立while(1)死循环直接阻塞了raylib的正常帧循环流程,输入状态永远不会被更新,一旦进入循环就永远无法触发break条件,造成程序卡死。
  • 逻辑判断条件错误:IsMouseButtonPressed(MOUSE_LEFT_BUTTON)仅在左键被按下的单帧返回true,你当前的代码逻辑是「只要检测不到左键按下的单帧状态就break」,如果进入代码块时刚好是左键按下的帧,就会直接进入死循环,没有任何退出可能。
  • 「按下记录起点、释放记录终点」的交互逻辑不能用阻塞式循环实现,必须放到raylib的正常帧更新流程里逐帧判断状态。

解决方案

将交互逻辑嵌入raylib标准主循环中,逐帧检测鼠标按下/释放状态,代码示例如下:

#include "raylib.h"

int main(void)
{
    const int screenWidth = 800;
    const int screenHeight = 450;
    InitWindow(screenWidth, screenHeight, "raylib draw line on drag");

    Vector2 startPos = {0};
    Vector2 endPos = {0};
    bool isDragging = false;

    SetTargetFPS(60);
    while (!WindowShouldClose())
    {
        // 逐帧更新输入状态
        if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
        {
            startPos = GetMousePosition();
            isDragging = true;
        }
        if (IsMouseButtonReleased(MOUSE_LEFT_BUTTON) && isDragging)
        {
            endPos = GetMousePosition();
            isDragging = false;
            // 此处可添加线段绘制完成后的自定义逻辑
        }

        BeginDrawing();
        ClearBackground(RAYWHITE);

        // 绘制已确认的线段
        if (!isDragging && (startPos.x != 0 || startPos.y != 0) && (endPos.x != 0 || endPos.y != 0))
        {
            DrawLineV(startPos, endPos, RED);
        }
        // 绘制拖动过程中的预览线段
        if (isDragging)
        {
            DrawLineV(startPos, GetMousePosition(), LIGHTGRAY);
        }

        EndDrawing();
    }
    CloseWindow();
    return 0;
}

内容的提问来源于stack exchange,提问作者Rik Smits

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:08