使用Raylib开发类Minecraft游戏:屏幕中心像素颜色获取失败求助
问题分析与解决
你的代码存在两个核心问题,导致始终获取到黑色像素:
- RenderTexture未被正确使用:每次循环创建的
RenderTexture是空白状态,没有将当前帧的画面渲染进去,自然只能读取到默认的黑色像素。 - 资源泄漏:每次循环创建
RenderTexture却未释放,会持续占用内存。
修正后的代码
#include "raylib.h" #include <stdio.h> int main() { const int screenWidth = 800; const int screenHeight = 450; const int screenCenterX = screenWidth / 2; const int screenCenterY = screenHeight / 2; InitWindow(screenWidth, screenHeight, "raylib Minecraft-like Cursor Color"); // 提前创建RenderTexture,避免重复创建销毁 RenderTexture2D renderTexture = LoadRenderTexture(screenWidth, screenHeight); SetTargetFPS(60); while (!WindowShouldClose()) { // 第一步:将场景渲染到RenderTexture中 BeginTextureMode(renderTexture); ClearBackground(RAYWHITE); // 这里可添加你的3D场景渲染逻辑(比如方块、相机视角) // 示例:在屏幕中心绘制白色方块用于测试 DrawRectangle(screenCenterX-20, screenCenterY-20, 40, 40, WHITE); EndTextureMode(); // 第二步:从RenderTexture提取中心像素颜色 Image screenImage = LoadImageFromTexture(renderTexture.texture); // Raylib的RenderTexture Y轴是翻转的,需修正坐标 Color pixelColor = GetPixelColor(screenImage, screenCenterX, screenHeight - screenCenterY - 1); UnloadImage(screenImage); // 第三步:将纹理内容绘制到屏幕并显示颜色信息 BeginDrawing(); ClearBackground(RAYWHITE); // 处理纹理翻转,正常显示画面 DrawTexturePro(renderTexture.texture, (Rectangle){0, 0, screenWidth, -screenHeight}, (Rectangle){0, 0, screenWidth, screenHeight}, (Vector2){0, 0}, 0.0f, WHITE); char text[50]; sprintf(text, "R:%i G:%i B:%i", pixelColor.r, pixelColor.g, pixelColor.b); DrawText(text, 10, 10, 20, BLACK); EndDrawing(); } // 释放RenderTexture资源 UnloadRenderTexture(renderTexture); CloseWindow(); return 0; }
关键修正说明
- 复用RenderTexture:在循环外创建一次纹理,避免重复内存分配,循环结束后必须释放资源。
- 定向渲染到纹理:用
BeginTextureMode和EndTextureMode包裹场景渲染代码,让画面输出到目标纹理中。 - 修正Y轴坐标:Raylib的RenderTexture纹理Y轴是翻转的,所以需要用
screenHeight - screenCenterY - 1来匹配屏幕中心的实际位置。 - 正常显示纹理内容:通过
DrawTexturePro处理纹理翻转问题,确保渲染到屏幕的画面是正确方向。
内容的提问来源于stack exchange,提问作者Trinary
相关产品推荐
相关产品推荐

