Ошибка компилятора GWT: отсутствуют методы интерфейса в подклассе (PlayN HTML)

Отказ от ответственности: я новичок в GWT/PlayN, так что это может быть очевидной ошибкой, которую я совершаю.

Когда у меня есть базовый (стартовый) проект PlayN, мой метод класса BlahGame реализует интерфейс Game, для которого требуются три метода: init, paint и update. Стартовый класс выглядит примерно так:

public class BlahGame implements Game { 
  public void init() { ... }
  public void paint(float alpha) { ... }
  public void update(float alpha) { ... }
}

Я создал класс BaseGame для реализации игры, например:

public class BaseGame implements Game { 
  public void init() { ... }
  public void paint(float alpha) { ... }
  public void update(float alpha) { ... }
}

Затем мой основной игровой класс стал подклассом BaseGame вот так:

public class BlahGame extends BaseGame {
  public void init() { ... base.init(); ... }
}

Все компилируется и работает с Java. Но когда я пытаюсь GWT-компилировать HTML-версию моей игры, я получаю эту ошибку:

com.google.gwt.dev.jjs.InternalCompilerException: Failed to get JNode
    at com.google.gwt.dev.jjs.impl.TypeMap.get(TypeMap.java:140)
    at com.google.gwt.dev.jjs.impl.TypeMap.get(TypeMap.java:71)
    at com.google.gwt.dev.jjs.impl.BuildTypeMap.getType(BuildTypeMap.java:730)

...


      [ERROR] <no source info>: public class com.deengames.BaseGame
    extends java.lang.Object
    implements : playn.core.Game
/*   methods   */
public void <init>() 
public void init() 
[unresolved] public void paint(float) 
[unresolved] public void update(float) 
[unresolved] public int updateRate() 

Я не уверен, что мне здесь не хватает. Нужно ли обновлять некоторые классы GWT? Или что-то еще? Я ожидал, что версия HTML будет скомпилирована, так как версия Java скомпилирована; подписи классов не должны меняться от подклассов.

Редактировать: я использую совершенно новый шаблонный проект PlayN. В классе, если я расширяю базовый класс И реализую интерфейс, он все равно не компилируется; работает только удаление расширения базового класса.


person ashes999    schedule 21.11.2011    source источник


Ответы (2)


Это ваша проблема прямо здесь:

  [ERROR] <no source info>: public class com.deengames.BaseGame

Вы поместили код в пакет верхнего уровня com.deengames. Бьюсь об заклад, что файл вашего модуля GWT также находится в том же каталоге пакета, возможно, что-то вроде com/deengames/MyGame.gwt.xml. В файле модуля GWT должны быть указаны каталоги под-пакетов для всего кода, который будет видеть GWT.

Когда вы создаете проект с использованием архетипа PlayN Maven, он имеет следующую структуру:

core/src/main/java/com/foozle/core/Barzle.java
core/src/main/java/com/foozle/resources/images/bg.png
html/src/main/java/com/foozle/Barzle.gwt.xml
html/src/main/java/com/foozle/html/BarzleHtml.java

Весь код игры находится в пакете com.foozle.core, а ресурсы — в пакете com.foozle.resources. Если вы посмотрите на сгенерированный файл Barzle.gwt.xml, вы увидите:

<module rename-to='barzle'>
  <inherits name='playn.PlayN'/>
  <source path='core'/>
  <source path='html'/>
  <public path="resources" />
  <entry-point class='com.foozle.html.BarzleHtml'/>
</module>

Две строки <source> явно добавляют подпакеты com.foozle.core и com.foozle.html в проект GWT. Все, что не указано явно в этом файле модуля GWT, будет игнорироваться GWT. Из-за того, как GWT указывает эти пакеты, невозможно добавить пакет верхнего уровня в ваш проект GWT. Вы не можете использовать:

<source path=""/>

or:

<source path="."/>

Вы должны поместить весь свой код в подпакеты, которые явно перечислены в вашем файле модуля GWT.

person samskivert    schedule 25.11.2011
comment
Бинго. Два дополнительных вопроса: 1) Какой хороший учебник по GWT для нас, новичков в GWT? и 2) Как создать новый модуль? (обычно я выделяю некоторые вспомогательные/каркасные классы в отдельный модуль) - person ashes999; 26.11.2011
comment
На этой странице представлен хороший обзор анатомии проекта GWT. Вы не получите большой пользы от стандартного учебника, потому что в большинстве случаев вы не будете использовать GWT напрямую. Создать модуль легко, просто создайте SomeName.gwt.xml в дереве исходного кода, который вы хотите сделать доступным для GWT/PlayN, и добавьте записи <source path="pkg"/> для подпакетов, которые будут использоваться GWT/PlayN. Вам необходимо включить файлы .java (и файл .gwt.xml), если вы упаковываете указанный код в виде jar-файла для использования в своей игре. - person samskivert; 27.11.2011

Я предполагаю, что проблема связана с включением файлов BlahGame.gwt.xml. Убедитесь, что все каталоги включены в этот файл как источники. Структура должна быть похожа на:

<module rename-to='blah'>
  <inherits name='playn.PlayN' />

    <source path='core'/>
    <source path='common'/>
     ... etc ...
    <source path='html'/>

    <public path="resources" />

    <entry-point class='full.namespace.BlahGameHtml' />

</module>

Кроме того, ваш класс BlahGameHtml.java должен выглядеть примерно так:

public class BlahGameHtml extends HtmlGame
{

    @Override
    public void start()
    {
        HtmlAssetManager assets = HtmlPlatform.register().assetManager();
        assets.setPathPrefix("blah/");
        PlayN.run(new BlahGame());
    }

}
person prageeths    schedule 21.11.2011
comment
Мой код, как вы говорите. Но он не компилируется. Даже если я добавлю отсутствующие методы в свой класс BlahGame с аннотацией @Override, он не скомпилируется. Даже реализация интерфейса и расширение базового класса не компилируются. - person ashes999; 21.11.2011
comment
В этом случае, если вы можете опубликовать код, я могу быстро взглянуть и попробовать запустить его. Если это невозможно, то все, что я могу сказать, это то, что компилятор GWT не видит BaseClass. Кроме того, я заметил две вещи: вы не реализовали метод updateRate(), а также он должен быть super.init() вместо base.init(), но это может быть не проблема, с которой вы столкнулись. - person prageeths; 21.11.2011
comment
Также убедитесь, что файл gwt.xml находится в каталоге над классами; чтобы классы находились в подкаталогах. Это позволит вам включить имя исходного каталога в тег «источник» в файле gwt.xml. Судя по предоставленному вами сообщению об ошибке, компилятор GWT не видит исходный файл для класса java. GWT требует исходный код для преобразования кода в javascript. Надеюсь, это поможет. - person prageeths; 21.11.2011
comment
Хорошо, вечером выложу код. Это стандартный шаблонный код, поэтому, если вы спешите, вы можете создать новый проект и посмотреть его самостоятельно — я опубликую комментарий, когда загружу его куда-нибудь. - person ashes999; 21.11.2011
comment
Я сдам экзамен через два дня, так что нет времени делать его с нуля, но если код уже есть, то я могу быстро взглянуть :) хорошо, тогда я продолжу проверять загруженный код. - person prageeths; 21.11.2011
comment
Просто интересно, удалось ли вам заставить это работать или вы все еще хотите, чтобы я взглянул на него? Я свободен на пару дней, так что, возможно, я мог бы взглянуть, если хочешь. - person prageeths; 24.11.2011
comment
если бы вы могли взглянуть, это было бы действительно очень ценно. Я наткнулся на блокпост на этом - person ashes999; 24.11.2011
comment
Кстати, это универсально для расширения ЛЮБОГО базового класса для игры. - person ashes999; 25.11.2011
comment
Думаю, объяснение самскиверта было понятнее моего. : PI упомянул это в более раннем комментарии, но это было больше похоже на однострочный ответ (ха-ха) - (Также убедитесь, что файл gwt.xml находится в каталоге над классами, чтобы классы находились в подкаталогах. Это позволит вы включаете имя исходного каталога в тег «источник» в файле gwt.xml.) В любом случае, рад, что вы решили эту проблему! Ваше здоровье! :) - person prageeths; 26.11.2011