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

C# Raylib碰撞检测报错:自定义Rectangle无法转为Raylib_cs.Rectangle

问题解决:自定义Rectangle无法转换为Raylib_cs.Rectangle

错误原因

你在Grunder命名空间下自定义了Rectangle类,而Raylib库本身包含Raylib_cs.Rectangle结构体。Raylib.CheckCollisionRecs方法要求传入库自带的Rectangle类型,但你传入的是自己定义的类——两者属于完全不同的类型,编译器无法自动转换,因此触发报错。

解决方案

两种简单处理方式,任选其一即可:

方式一:重命名自定义类(避免类型冲突)

把你自己的Rectangle类改成其他名称(比如GameRectangle),消除和Raylib类型的命名冲突。同时在类中添加方法,将自定义类的属性映射为Raylib的Rectangle结构体:

修改后的类定义:

public class GameRectangle
{
    public int posX;
    public int posY;
    public int length;
    public int width;
    Color color;

    // 保留原有成员和方法...

    // 新增转换方法
    public Raylib_cs.Rectangle ToRaylibRect()
    {
        return new Raylib_cs.Rectangle(posX, posY, length, width);
    }
}

调用碰撞检测时:

if (Raylib.CheckCollisionRecs(player01.ToRaylibRect(), floor01.ToRaylibRect()))
{
    Raylib.DrawText("Kollision", 100, 50, 50, Color.ORANGE);
}

方式二:在自定义类中添加Raylib Rectangle转换属性

如果不想修改类名,可在自定义Rectangle类中添加只读属性,直接返回对应的Raylib结构体实例:

在自定义Rectangle类中新增代码:

public Raylib_cs.Rectangle RaylibRectangle => new Raylib_cs.Rectangle(posX, posY, length, width);

调用碰撞检测时:

if (Raylib.CheckCollisionRecs(player01.RaylibRectangle, floor01.RaylibRectangle))
{
    Raylib.DrawText("Kollision", 100, 50, 50, Color.ORANGE);
}

完整修改后的代码示例(方式二)

using Raylib_cs;

namespace Grunder
{
    class Program
    {
        static void Main(string[] args)
        {
            Rectangle floor01 = new Rectangle(50, 500, 700, 50, Color.WHITE);
            Rectangle player01 = new Rectangle(300, 300, 50, 50, Color.DARKBLUE);

            Raylib.InitWindow(800, 600, "My Raylib Window");
            Raylib.SetTargetFPS(60);

            while (!Raylib.WindowShouldClose())
            {
                Raylib.BeginDrawing();
                Raylib.ClearBackground(Color.BEIGE);

                floor01.Draw();
                player01.Draw();
                player01.IsPlayer();

                Raylib.EndDrawing();

                // 修改碰撞检测的调用方式
                if (Raylib.CheckCollisionRecs(player01.RaylibRectangle, floor01.RaylibRectangle))
                {
                    Raylib.DrawText("Kollision", 100, 50, 50, Color.ORANGE);
                }
            }
        }
    }

    public class Rectangle
    {
        public int posX;
        public int posY;
        public int length;
        public int width;
        Color color;

        int playerSpeed = 5;
        bool collisionRight;
        bool collsiionLeft;
        bool collisionUp;
        bool collisionDown;

        // 新增转换属性
        public Raylib_cs.Rectangle RaylibRectangle => new Raylib_cs.Rectangle(posX, posY, length, width);

        public Rectangle(int _posX, int _posY, int _length, int _width, Color _color)
        {
            posX = _posX;
            posY = _posY;
            length = _length;
            width = _width;
            color = _color;
        }

        public void Draw()
        {
            Raylib.DrawRectangle(posX, posY, length, width, color);
        }

        public void IsPlayer()
        {
            if (Raylib.IsKeyDown(KeyboardKey.KEY_RIGHT))
            {
                posX += playerSpeed;
            }

            if (Raylib.IsKeyDown(KeyboardKey.KEY_LEFT))
            {
                posX -= playerSpeed;
            }

            if (Raylib.IsKeyDown(KeyboardKey.KEY_UP))
            {
                posY -= playerSpeed;
            }

            if (Raylib.IsKeyDown(KeyboardKey.KEY_DOWN))
            {
                posY += playerSpeed;
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 20:45:36