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
相关产品推荐
相关产品推荐

