2012-01-28 36 views
9

Tôi muốn sử dụng PlayN để tạo trò chơi thẻ khách hàng/máy chủ, ví dụ: Trái tim. Trong khi tôi chủ yếu tập trung vào đầu ra HTML5, tôi lý tưởng muốn trở thành nền tảng đầu ra bất khả tri trong trường hợp tôi quyết định tạo một ứng dụng khách Android trong tương lai. Tôi nên tiếp cận cơ chế RPC như thế nào?Làm thế nào để xử lý RPC trong trò chơi PlayN client-server?

Đây là những lựa chọn Tôi đã nghĩ đến việc:

  1. Sử dụng JSON cho RPC với get()/bài() phương pháp - viết một servlet chấp nhận/trả về JSON, và làm cho tất cả các phiên bản của mã khách hàng dùng nó. Điều này có vẻ như có thể thực hiện được, nhưng tôi lo ngại về độ dài của JSON. Khi tôi làm việc cho Hearts, tôi muốn chuyển sang các trò chơi phức tạp hơn, và tôi lo lắng rằng JSON sẽ dẫn đến nhiều thông điệp lớn hơn nhiều so với thông tin cần thiết được truyền qua lại giữa máy khách và máy chủ. Tôi không thực sự biết làm thế nào để làm việc với JSON trong Java, nhưng tôi cho rằng điều này là có thể thực hiện được. Giả định của tôi có nằm trong dòng không? Java hoạt động tốt như thế nào với JSON?
  2. Tiếp tục sử dụng GWT-RPC. Tôi có thể làm điều này bằng cách lấy một giao diện dịch vụ không đồng bộ trong lõi (platform-agnostic) constructor của tôi, và trong main HTML của tôi() tôi vượt qua trong giao diện GWT Async được tạo bởi GWT.create(MyService.class) (hoặc ít nhất là một wrapper xung quanh nó). Tôi không có ý tưởng như thế nào tốt này sẽ làm việc cho các phiên bản không HTML mặc dù. Tôi có thể sử dụng GWT-RPC từ mã Java phía máy khách trực tiếp không?
  3. Sử dụng một số hình thức RPC khác. Bất kỳ đề xuất?
+1

Không phải là câu trả lời hoàn chỉnh, nhưng một chút: Java hoạt động tốt với Json, nhưng tất cả các thư viện Json tốt đều bị hỏng trong PlayN. Tôi vừa mới đăng câu hỏi ngày hôm nay, bởi vì chúng tôi đang xây dựng máy chủ của mình như một ứng dụng REST không trạng thái bằng cách sử dụng Jersey và một số thứ khác từ ngăn xếp EE. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn Điều này sẽ khuyến khích chúng tôi chia sẻ DTO và có các cuộc gọi lại an toàn và cách sử dụng Sử dụng phương pháp GWT của bạn phá vỡ xây dựng Java, và sau đó bạn chỉ có thể dính vào GWT và sử dụng một số khung làm việc cho nó. – iuiz

Trả lời

12

Đối với RPC GWT trên nền tảng Java và Android, Tôi hiện đang thử nghiệm với việc sử dụng gwt-syncproxy để cung cấp Java client access các phương pháp GWT RPC, và tôi đang sử dụng Guice, Gin, và RoboGuice trên nền tảng đích tương ứng của chúng để tiêm các cá thể dịch vụ không đồng bộ thích hợp cho đối tượng Game instantiated.

Trong lõi/pom.xml cho một dự án PlayN, tôi bao gồm các phụ thuộc sau phối để hỗ trợ DI từ Gin/Guice/RoboGuice khi cần thiết:

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

Sau đó, tôi thêm chú thích @Inject để bất kỳ lĩnh vực bên trong game thực hiện cụ thể:

public class TestGame implements Game { 

    @Inject 
    TestServiceAsync _testService; 

    ... 

} 

trong html/pom.xml, tôi bao gồm các phụ thuộc tọa độ cho Gin:

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

Và tôi tạo TestGameGinjector và TestGameModule lớp:

TestGameGinjector.java

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

TestGameModule.java

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

Kể từ lúc này, tôi chỉ tiêm Giao diện TestServiceAsync, tôi không cần phải thực hiện bất kỳ việc thực hiện nào trong phương thức TestGameModule.configure(); Gin quản lý việc khởi tạo AsyncServices cho tôi qua GWT.create().

sau đó tôi thêm vào phần sau đây để TestGame.gwt.xml

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

Và cuối cùng, tôi đã thực hiện những thay đổi sau đây để 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()); 
    } 
} 

Và điều này khá nhiều bao gồm nền tảng HTML5 cho PlayN.

Đối với các nền tảng Java, để tôi thêm sự phụ thuộc sau phối để 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> 

Do lưu ý rằng các dự án gwt-syncproxy trên Google Code không chứa một pom.xml. Tôi có phiên bản mavenized của gwt-syncproxy được chia nhỏ và khả dụng qua git tại https://bitbucket.org/hatboyzero/gwt-syncproxy.git. Bạn có thể sao chép nó, chạy gói sạch mvn cài đặt để đưa nó vào kho lưu trữ Maven cục bộ của bạn.

Anyways, tôi đã tạo ra một TestGameModule.java cho nền tảng Java như sau:

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" 
      ); 
     } 
    } 
} 

Và tôi sửa đổi TestGameJava.java như sau:

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)); 
    } 
} 

Tôi đã trải qua một cuộc tập trận tương tự với Nền tảng Android và RoboGuice - mà không đi sâu vào chi tiết, các thay đổi/đoạn mã có liên quan như sau:

pom.xml d ependencies

<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> 

TestGameApplication.java

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

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" 
      ); 
     } 
    } 
} 

TestGameActivity.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)); 
    } 
} 

Đó là một tóm tắt nhanh chóng và bẩn thỉu về cách tôi nhận Gin/Guice/RoboGuice + GWT làm việc trong dự án của mình và tôi đã xác minh rằng nó hoạt động trên cả nền tảng Java và HTML đẹp mắt.

Dù sao, có phương pháp GWT để cung cấp các cuộc gọi RPC tới nhiều nền tảng PlayN :).

+1

Tôi đã tiếp tục và cập nhật câu trả lời của mình một chút vì tôi đã cố gắng giải quyết nhiều vấn đề liên quan đến cách thực hiện ... – hatboyzero

+0

Có vẻ như tôi có thể làm việc với GWT RPC và thực hiện phương pháp này nếu/khi tôi muốn hỗ trợ chế độ đầu ra không phải HTML. Cảm ơn đã phản ứng chi tiết! –

+0

Không có vấn đề - vui khi được phục vụ :) – hatboyzero

Các vấn đề liên quan