代码之家  ›  专栏  ›  技术社区  ›  Buggieboy

Java和SDL_GetKeyState()

  •  1
  • Buggieboy  · 技术社区  · 16 年前

    我正在尝试将一些使用SDL的代码转换为Java。我正在使用sdljava绑定。

    sdljava使用SWIG作为C数据类型和Java之间的桥梁。得到相当于 SDL_GetKeyState() SWIG_SDLEvent.SDL_GetKeyState() SWIGTYPE_p_unsigned_char .

    当然,Java没有任何优势 unsigned char 类型,我不知道编译器认为这个SWIG类型实际上代表了Java的什么。正常使用 SDL_GetKeyState() 在C/C++中,类似于:

    Uint8 *ks = SDL_GetKeyState(NULL);
    if ( ks[SDLK_UP] ) { /* handle Up key */ }
    

    ... 其中,SDL键状态值(如SDLK_UP)索引到数组中。

    但是,以下Java代码:

    SWIGTYPE_p_unsigned_char ks = SWIG_SDLEvent.SDL_GetKeyState(null);
    if ( ks[SDLKeyValues.SDLK_UP] != 0) { /* handle Up key */ }
    

    导致编译器错误,“表达式的类型必须是数组类型,但解析为SWIGTYPE_p_unsigned_char。”

    我想知道的是,在调用SWIG_SDLEvent.SDL_GetKeyState()之后,如何使用它返回的内容来检查各个键的状态?

    2 回复  |  直到 16 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    是的,这是一个特例,和你的 other question . 起初我想 carrays.i arrays_java.i

    在这个特殊的例子中,SWIG有一个叫做 FillMeInAsSizeCannotBeDeterminedAutomatically 那可以解决你的问题。一般来说,它的使用是有限的,但是假设SDL_GetKeyState()的返回值指向的数组大小不变,就足够了。在文档和邮件列表中搜索它,仔细思考JavaSWIG文档的数组部分,前进的道路应该变得清晰。

        2
  •  0
  •   Buggieboy    16 年前

    我与负责SWIG Java支持的William Fulton进行了交谈,他回答说:

    SWIGTYPE_p_unsigned_char的存在表明包装器没有被很好地考虑,因为这个“类型包装器”类对于从Java访问不是很有用。

    http://www.swig.org/Doc1.3/Java.html 或者只需添加一个助手方法,然后可以从Java调用该方法:

    %inline %{
     Uint8 getValueFromArray(Uint8* array, size_t i) {
      return array[i];
     }
    %}