6

免责声明:我是 GWT/PlayN 的新手,所以这可能是我正在犯的一个明显错误。

当我有一个基本(入门)PlayN 项目时,我的BlahGame类方法实现了Game接口,这需要三个方法:initpaintupdate。入门类看起来像:

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 类?或者是别的什么?自 Java 版本编译以来,我一直期望 HTML 版本能够编译;类的签名不应该从子类化中改变。

编辑:我正在使用一个全新的样板 PlayN 项目。在类中,如果我扩展基类并实现接口,它仍然无法编译;仅删除基类扩展作品。

4

2 回答 2

7

这是您的问题:

  [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>行显式地将 thecom.foozle.corecom.foozle.htmlsub-packages 添加到 GWT 项目中。GWT 将忽略此 GWT 模块文件中未明确列出的任何内容。由于 GWT 指定这些包的方式,无法将顶级包添加到您的 GWT 项目中。您不能使用:

<source path=""/>

或者:

<source path="."/>

您必须将所有代码放在 GWT 模块文件中明确列举的子包中。

于 2011-11-25T17:03:28.960 回答
1

我认为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());
    }

}
于 2011-11-21T06:50:26.703 回答