如何在客户端-服务器 PlayN 游戏中处理 RPC?

2023-11-25

我想使用 PlayN 创建客户端/服务器纸牌游戏,例如心。虽然我主要关注 HTML5 输出,但我希望与输出平台无关,以防我将来决定制作 Android 客户端。我应该如何处理RPC机制?

这些是我想到的选项:

  1. 通过 get()/post() 方法将 JSON 用于 RPC - 编写一个接受/返回 JSON 的 servlet,并使所有版本的客户端代码都使用它。这似乎可行,但我担心 JSON 的冗长。一旦我让红心大战开始工作,我想转向更复杂的游戏,并且我担心 JSON 会导致大量超出必要的消息在客户端和服务器之间来回传递。我实际上不知道如何在 Java 中使用 JSON,但我认为这是可行的。我的假设符合吗? Java 与 JSON 的配合如何?
  2. 继续使用 GWT-RPC。我可以通过在核心(与平台无关)构造函数中采用异步服务接口来实现此目的,并在 HTML main() 中传入由GWT.create(MyService.class)(或者至少有一个包装纸)。我不知道这对于非 HTML 版本来说效果如何。我可以直接从客户端 Java 代码使用 GWT-RPC 吗?
  3. 使用其他形式的 RPC。有什么建议么?

对于Java和Android平台上的GWT RPC,我目前正在尝试使用gwt-syncproxy来提供Java客户端对GWT RPC方法的访问,并且我在各自的目标平台上使用Guice,Gin和RoboGuice来注入实例化 Game 对象的适当异步服务实例。

在 PlayN 项目的 core/pom.xml 中,我包含以下依赖项坐标以根据需要支持来自 Gin/Guice/RoboGuice 的 DI:

<dependency>
  <groupId>javax.inject</groupId>
  <artifactId>javax.inject</artifactId>
  <version>1</version>
</dependency>

然后我将 @Inject 注释添加到具体 Game 实现内的任何字段:

public class TestGame implements Game {

    @Inject
    TestServiceAsync _testService;

    ...

}

在 html/pom.xml 中,我包含了 Gin 的依赖坐标:

<dependency>
  <groupId>com.google.gwt.inject</groupId>
  <artifactId>gin</artifactId>
  <version>1.5.0</version>
</dependency>

我创建 TestGameGinjector 和 TestGameModule 类:

TestGameGinjector.java

@GinModules(TestGameModule.class)
public interface TestGameGinjector extends Ginjector {
    TestGame getGame();
}

测试游戏模块.java

public class TestGameModule extends AbstractGinModule {
    @Override
    protected void configure() {
    }
}

由于目前我只注入 TestServiceAsync 接口,因此不需要在 TestGameModule.configure() 方法中添加任何实现; Gin 通过 GWT.create() 为我管理 AsyncServices 的实例化。

然后我将以下内容添加到 TestGame.gwt.xml

<inherits name='com.google.gwt.inject.Inject'/>

最后,我对 TestGameHtml.java 进行了以下更改

public class TestGameHtml extends HtmlGame {

    private final TestGameGinjector _injector = GWT.create(TestGameGinjector.class);

    @Override
    public void start() {
        HtmlPlatform platform = HtmlPlatform.register();
        platform.assetManager().setPathPrefix("test/");
        PlayN.run(_injector.getGame());
    }
}

这几乎涵盖了 PlayN 的 HTML5 平台。

对于 Java 平台,我将以下依赖项坐标添加到 java/pom.xml 中:

<dependency>
  <groupId>com.gdevelop.gwt.syncrpc</groupId>
  <artifactId>gwt-syncproxy</artifactId>
  <version>0.4-SNAPSHOT</version>
</dependency>

<dependency>
  <groupId>com.google.inject</groupId>
  <artifactId>guice</artifactId>
  <version>3.0-rc2</version>
</dependency>

请注意,Google Code 上的 gwt-syncproxy 项目不包含 pom.xml。我有一个成熟化的gwt-syncproxy 版本已分叉并可通过 git 获取https://bitbucket.org/hatboyzero/gwt-syncproxy.git。你应该能够克隆它,运行mvn 干净的软件包安装将其放入本地 Maven 存储库。

不管怎样,我为Java平台创建了一个TestGameModule.java,如下所示:

public class TestGameModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(TestServiceAsync.class).toProvider(TestServiceProvider.class);
    }

    public static class TestServiceProvider implements Provider<TestServiceAsync> {
        public TestServiceAsync get() {
            return (TestServiceAsync) SyncProxy.newProxyInstance(
                TestServiceAsync.class,
                Deployment.gwtWebPath(),  // URL to webapp -- http://127.0.0.1:8888/testgame
                "test"
            );
        }
    }
}

我修改了TestGameJava.java如下:

public class TestGameJava {

    public static void main(String[] args) {
        Injector _injector = Guice.createInjector(new TestGameModule());

        JavaPlatform platform = JavaPlatform.register();
        platform.assetManager().setPathPrefix("test/images");
        PlayN.run(_injector.getInstance(TestGame.class));
    }
}

我在 Android 平台和 RoboGuice 上进行了类似的练习——没有详细介绍,相关的更改/片段如下:

pom.xml 依赖项

<dependency>
  <groupId>com.gdevelop.gwt.syncrpc</groupId>
  <artifactId>gwt-syncproxy</artifactId>
  <version>0.4-SNAPSHOT</version>
</dependency>

<dependency>
  <groupId>org.roboguice</groupId>
  <artifactId>roboguice</artifactId>
  <version>1.1.2</version>
</dependency>

<dependency>
  <groupId>com.google.inject</groupId>
  <artifactId>guice</artifactId>
  <version>3.0-rc2</version>
  <classifier>no_aop</classifier>
</dependency>

测试游戏应用程序.java

public class TestGameApplication extends RoboApplication {
    @Override
    protected void addApplicationModules(List<Module> modules) {
        modules.add(new TestGameModule());
    }
}

测试游戏模块.java

public class TestGameModule extends AbstractModule {

    @Override
    protected void configure() {
        bind(TestServiceAsync.class).toProvider(TestServiceProvider.class);
    }

    public static class TestServiceProvider implements Provider<TestServiceAsync> {
        public TestServiceAsync get() {
            return (TestServiceAsync) SyncProxy.newProxyInstance(
                TestServiceAsync.class,
                Deployment.gwtWebPath(),  // URL to webapp -- http://127.0.0.1:8888/testgame
                "test"
            );
        }
    }
}

测试游戏活动.java

public class TestGameActivity extends GameActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
    final Injector injector = ((RoboApplication) getApplication()).getInjector();
        injector.injectMembers(this);
        super.onCreate(savedInstanceState);
    }

    @Override
    public void main(){
        platform().assetManager().setPathPrefix("test/images");
        final Injector injector = ((RoboApplication) getApplication()).getInjector();
        PlayN.run(injector.getInstance(TestGame.class));
    }
}

这是我如何让 Gin/Guice/RoboGuice + GWT 在我的项目中工作的快速简述,并且我已经验证它在 Java 和 HTML 平台上都能完美运行。

不管怎样,GWT 方法可以向多个 PlayN 平台提供 RPC 调用:)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在客户端-服务器 PlayN 游戏中处理 RPC? 的相关文章

随机推荐

  • 如何以编程方式保存网页?

    我想以编程方式保存网页 我的意思不仅仅是保存 HTML 我还希望自动存储所有关联的文件 图像 CSS 文件 可能嵌入的 SWF 等 并希望重写本地浏览的链接 预期用途是个人书签应用程序 其中缓存链接内容 以防原始副本被删除 看一眼wget
  • 批量删除除指定文件和目录之外的所有文件和目录[重复]

    这个问题在这里已经有答案了 我正在尝试使用该目录中的 bat 文件删除特定目录中的所有文件和目录 我见过这在 Linux 上完成没有问题 但在 Windows 命令环境中这似乎是一件苦差事 示例 temp 1 bat 保留 temp 特殊文
  • 我应该使用枚举作为鉴别器吗?

    枚举什么时候会崩溃 为了支持现有系统中的新功能 我只是考虑对数据库模式中的实体表实现某种形式的鉴别器 为了从做最少的事情开始 我首先决定在业务实体层使用整数列和 C 枚举 以提高可读性 这将提供穷人的多态性 最终可能发展为实际的多态性 并可
  • 如何将 cv::Mat 转换为 pcl::pointcloud

    如何从 opencv Mat 点云到 pcl pointcloud 颜色对我来说并不重要 重要的是点本身 你可以这样做 pcl PointCloud
  • 比 get_headers() 更快的东西

    我正在尝试制作一个 PHP 脚本来尽快检查网站的 HTTP 状态 我目前正在使用 get headers 并在 mysql 数据库中的 200 个随机 url 循环中运行它 检查全部 200 个 平均需要 2m 48s 我能做些什么来让它
  • Java中的运算符重载

    请问Ja va中是否可以重载运算符 如果它在 Java 中的任何地方使用 请告诉我 不 Java 不支持用户定义的运算符重载 Java 唯一接近 自定义 运算符重载的方面是对字符串的 处理 这会导致常量的编译时连接或使用 StringBui
  • 使用 SPARQL 查询查找最短路径

    我试图了解 SPARQL 查询的计算限制 并且我想知道如何编写一个查询来确定两个对象之间是否存在有向路径 我知道一种针对特定长度的路径执行此操作的方法 SELECT a b c d WHERE a
  • 未捕获的类型错误:当我尝试将数据发送到 url 时,无法读取未定义的属性“ajax”

    我创建了一个表单来获取用户的反馈 我只是尝试将表单数据发送到 url 但我收到此错误 未捕获的类型错误 无法读取未定义的属性 ajax function sendData ajax url www yashkjhsah php type P
  • 打印内核的页表条目

    具有 4 级页表的虚拟内存映射 0000000000000000 00007fffffffffff 47 bits user space different per mm ffff800000000000 ffff80ffffffffff
  • 如果数据库丢失,SQLite 连接失败? (已删除/移动)

    我里面有以下方法class DBConnection 我这样调用该方法 SQLiteConnection conn DBConnection OpenDB 当我想打开连接时 以便我可以执行查询 当我想关闭连接时 我可以调用类似的方法 方法
  • $locationProvider.html5Mode(true) 问题

    一直在处理一些我陷入困境的 locationProvider 问题 我有一个简单的单页页面 但我收到以下错误 TypeError Cannot read property replace of undefined at trimEmptyH
  • Geopy:检索英文国家/地区名称

    我正在尝试反转地理编码坐标并使用 geopy 检索相应的国家 地区代码 然而 Geopy似乎没有提供获取国家代码的方法 因此 我尝试先检索国家 地区名称 然后将它们转换为代码 不幸的是 我的代码给了我非英语的国家 地区名称 如何获取英文国家
  • RxJS Observables 的 Promise.all 行为?

    在 Angular 1 x 中 我有时需要制作多个http请求并对所有响应执行某些操作 我会将所有的承诺放入一个数组中并调用Promise all promises then function results Angular 2 最佳实践似
  • 由于 rJava 导致尝试在 R 中加载包时出现问题

    当我打字时require xlsx 为了加载包xlsx在 R 中 显示以下消息 gt require xlsx Loading required package xlsx Loading required package xlsxjars
  • 将 Python argparse.Namespace() 视为字典的正确方法是什么?

    如果我想使用的结果argparse ArgumentParser 这是一个Namespace对象 具有需要字典或类似映射的对象的方法 请参阅集合 映射 正确的做法是什么 C gt python Python 2 7 3 default Ap
  • Typescript 索引签名和方法

    为什么下面的代码给出ts 2411 error class Greeter key string string number greeting string constructor message string this greeting
  • 如何删除ListBox中的多个选定项?

    我的 Windows 窗体包含两个列表框 Listbox1 包含一些项目 listbox2 为空 当我按下表单上的按钮时 应将 listbox1 中的多个选定项目从 Listbox1 中删除并复制到 Listbox2 中 我尝试在 list
  • JavaScript WeakMap 不断引用经过 gc 处理的对象

    我正在经历 JavaScript 弱映射 在 google chrome 开发者控制台中尝试此代码后 使用 js flags expose gc 运行 我不明白为什么弱映射继续引用 a b 如果 a 是GC 编辑 var a listene
  • Java中Arraylist转Json的方法

    我有一个数组列表 数组列表包含一堆域对象 如下图所示 Domain domainId 19 name a dnsName a com type 0 flags 0 Domain domainId 20 name b dnsName b co
  • 如何在客户端-服务器 PlayN 游戏中处理 RPC?

    我想使用 PlayN 创建客户端 服务器纸牌游戏 例如心 虽然我主要关注 HTML5 输出 但我希望与输出平台无关 以防我将来决定制作 Android 客户端 我应该如何处理RPC机制 这些是我想到的选项 通过 get post 方法将 J