Java и SDL_GetKeyState () - PullRequest
       17

Java и SDL_GetKeyState ()

1 голос
/ 06 октября 2009

Я пытаюсь преобразовать в Java некоторый код, который использует SDL. Я использую привязки sdljava.

sdljava использует SWIG в качестве моста между типами данных C и Java. Чтобы получить эквивалент SDL_GetKeyState(), sdljava предоставляет метод 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 ]

1 голос
/ 07 октября 2009

Да, это особый случай той же проблемы, что и ваш другой вопрос . Сначала я думал, что carrays.i или arrays_java.i могут помочь вам, но они не могут; ни SWIG, ни Java не знают, насколько большой массив, возвращаемый SDL_GetKeyState (), поэтому они не могут сгенерировать массив Java для вас.

В данном конкретном случае в SWIG есть что-то под названием FillMeInAsSizeCannotBeDeterminedAutomatically, которое может решить вашу проблему. В общем, он ограничен в использовании, но если предположить, что массив, на который указывает возвращаемое значение SDL_GetKeyState (), имеет постоянный размер, то этого достаточно Ищите его в документации и списках рассылки, медитируйте над разделами массива документов Java SWIG, и путь вперед должен стать ясным.

0 голосов
/ 08 октября 2009

Я говорил с Уильямом Фултоном, который отвечает за поддержку SWIG Java, и он ответил:

Наличие SWIGTYPE_p_unsigned_char указывает на то, что обертки не были хорошо продуманы, так как этот класс «обертки типа» не очень полезен для доступа из Java.

Пожалуйста, прочитайте главу Java для решений для массивов - http://www.swig.org/Doc1.3/Java.html или просто добавьте вспомогательный метод, который затем можно вызвать из Java:

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