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

Отказ от ответственности: я новичок в 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, я получаю эту ошибку:

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. В классе, если я расширяю базовый класс И реализую интерфейс, он все еще не компилируется; работает только удаление расширения базового класса.

Ответы [ 2 ]

7 голосов
/ 25 ноября 2011

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

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

Вы поместили код в пакет верхнего уровня com.deengames. Могу поспорить, что ваш файл модуля GWT также находится в том же каталоге пакета, вероятно, что-то вроде com/deengames/MyGame.gwt.xml. Файл модуля GWT должен указывать каталоги sub -package для всего кода, который увидит 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=""/>

или

<source path="."/>

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

1 голос
/ 21 ноября 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());
    }

}
...