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

