0

我目前正在使用 CppSharp,并为 SDL2 库生成了绑定。它几乎可以工作,但我无法使用库的事件部分。在 C 中,您只需像这样使用 API

SDL_Event event;
while(SDL_WaitEvent(&event))
{
    if(e.type = SDL_QUIT)
        exit(0);
}

但是在带有生成绑定的 C# 中,我做不到:

SDL.SDL_Event e = new SDL.SDL_Event();
while(SDL.SDL_WaitEvent(e))
{
    if(e.Type == (uint)SDL.SDL_EventType.SDL_QUIT)
        System.Environment.Exit(0);
}

它可以编译,但 e.Type 始终为零,这是不正确的,就像 C# 对象在内部永远不会改变。有没有办法让 C# 像 C 一样传递 SDL.SDL_Event 。

作为参考,这里是绑定(我不想更改它们,因为它们是由 CppSharp 生成的):

[SuppressUnmanagedCodeSecurity]
[DllImport("SDL2", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,EntryPoint="SDL_WaitEvent")]
internal static extern int SDL_WaitEvent(global::System.IntPtr @event);

public static int SDL_WaitEvent(global::SDL.SDL_Event @event)
{
    var ____arg0 = @event.__Instance;
    var __arg0 = new global::System.IntPtr(&____arg0);
    var __ret = __Internal.SDL_WaitEvent(__arg0);
    return __ret;
}

如何让事件循环在 C# 中工作?

编辑:SDL_Event 生成的结构

public unsafe partial struct SDL_Event
{
    [StructLayout(LayoutKind.Explicit, Size = 56)]
    public partial struct __Internal
    {
        [FieldOffset(0)]
        internal uint type;

        [FieldOffset(0)]
        internal global::SDL.SDL_CommonEvent.__Internal common;

        [FieldOffset(0)]
        internal global::SDL.SDL_WindowEvent.__Internal window;

        [FieldOffset(0)]
        internal global::SDL.SDL_KeyboardEvent.__Internal key;

        [FieldOffset(0)]
        internal global::SDL.SDL_TextEditingEvent.__Internal edit;

        [FieldOffset(0)]
        internal global::SDL.SDL_TextInputEvent.__Internal text;

        [FieldOffset(0)]
        internal global::SDL.SDL_MouseMotionEvent.__Internal motion;

        [FieldOffset(0)]
        internal global::SDL.SDL_MouseButtonEvent.__Internal button;

        [FieldOffset(0)]
        internal global::SDL.SDL_MouseWheelEvent.__Internal wheel;

        [FieldOffset(0)]
        internal global::SDL.SDL_JoyAxisEvent.__Internal jaxis;

        [FieldOffset(0)]
        internal global::SDL.SDL_JoyBallEvent.__Internal jball;

        [FieldOffset(0)]
        internal global::SDL.SDL_JoyHatEvent.__Internal jhat;

        [FieldOffset(0)]
        internal global::SDL.SDL_JoyButtonEvent.__Internal jbutton;

        [FieldOffset(0)]
        internal global::SDL.SDL_JoyDeviceEvent.__Internal jdevice;

        [FieldOffset(0)]
        internal global::SDL.SDL_ControllerAxisEvent.__Internal caxis;

        [FieldOffset(0)]
        internal global::SDL.SDL_ControllerButtonEvent.__Internal cbutton;

        [FieldOffset(0)]
        internal global::SDL.SDL_ControllerDeviceEvent.__Internal cdevice;

        [FieldOffset(0)]
        internal global::SDL.SDL_AudioDeviceEvent.__Internal adevice;

        [FieldOffset(0)]
        internal global::SDL.SDL_QuitEvent.__Internal quit;

        [FieldOffset(0)]
        internal global::SDL.SDL_UserEvent.__Internal user;

        [FieldOffset(0)]
        internal global::SDL.SDL_SysWMEvent.__Internal syswm;

        [FieldOffset(0)]
        internal global::SDL.SDL_TouchFingerEvent.__Internal tfinger;

        [FieldOffset(0)]
        internal global::SDL.SDL_MultiGestureEvent.__Internal mgesture;

        [FieldOffset(0)]
        internal global::SDL.SDL_DollarGestureEvent.__Internal dgesture;

        [FieldOffset(0)]
        internal global::SDL.SDL_DropEvent.__Internal drop;

        [FieldOffset(0)]
        internal fixed byte padding[56];

        [SuppressUnmanagedCodeSecurity]
        [DllImport("SDL", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
            EntryPoint="??0SDL_Event@@QEAA@AEBT0@@Z")]
        internal static extern global::System.IntPtr cctor(global::System.IntPtr instance, global::System.IntPtr _0);
    }
4

0 回答 0