2012-01-28 7 views
9

Me gustaría usar PlayN para crear un juego de tarjeta cliente/servidor, p. Copas. Aunque principalmente me estoy enfocando en la salida de HTML5, idealmente me gustaría ser independiente de la plataforma de salida en caso de que decida hacer un cliente de Android en el futuro. ¿Cómo debería abordar el mecanismo RPC?¿Cómo se manejan las RPC en el juego cliente-servidor de PlayN?

Estas son las opciones que he pensado:

  1. Uso de JSON RPC con get()/post() Métodos - escribir un servlet que acepta/devuelve JSON, y hacer todas las versiones de código de cliente usa eso. Esto parece factible, pero me preocupa la verbosidad de JSON. Una vez que funcione Hearts, me gustaría pasar a juegos más complejos, y me preocupa que JSON genere una cantidad de mensajes mucho más grandes de lo necesario entre el cliente y el servidor. Realmente no sé cómo trabajar con JSON en Java, pero supongo que esto es factible. ¿Están mis suposiciones en línea? ¿Qué tan bien funciona Java con JSON?
  2. Continuar usando GWT-RPC. Puedo hacer esto tomando una interfaz de servicio asíncrona en mi constructor núcleo (plataforma-agnóstico), y en mi HTML main() paso en la interfaz GWT Async generada por GWT.create(MyService.class) (o al menos una envoltura alrededor de ella). Sin embargo, no tengo idea de lo bien que esto funcionaría para las versiones que no son HTML. ¿Puedo usar GWT-RPC directamente desde el código Java del lado del cliente?
  3. Utilice alguna otra forma de RPC. ¿Alguna sugerencia?
+1

No es una respuesta completa, pero un poco: Java funciona bien con Json, pero todas las buenas libs de Json están rotas bajo PlayN. Acabo de publicar una pregunta hoy, porque estamos construyendo nuestro servidor como una aplicación REST sin estado usando Jersey y algunas otras cosas de la pila EE. http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn Esto nos permite compartir DTO y tener callbacks y yesos de tipo seguro Usando su método GWT podría rompa la compilación de Java, y luego podría apegarse a GWT y utilizar un marco de lienzo para ello. – iuiz

Respuesta

12

Para la RPC GWT en las plataformas Java y Android, actualmente estoy experimentando con el uso de GWT-syncproxy para proporcionar acceso de cliente de Java para los métodos de GWT RPC, y estoy usando Guice, Gin, y en RoboGuice sus respectivas plataformas de destino para inyectar las instancias de servicio asíncronas apropiadas para el objeto de juego instanciado.

En el núcleo/pom.xml para un proyecto reproducirN, incluyo la siguiente dependencia coordenadas para apoyar DI de Gin/Guice/RoboGuice según sea necesario:

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

Luego añadir anotaciones a cualquier campo @Inject en el interior del hormigón aplicación del juego:

public class TestGame implements Game { 

    @Inject 
    TestServiceAsync _testService; 

    ... 

} 

En el html/pom.xml, incluyo la dependencia coordenadas de Gin:

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

Y creo TestGameGinjector y TestGameModule clases:

TestGameGinjector.java

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

TestGameModule.java

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

Dado que por el momento, sólo estoy inyectando el Interfaz TestServiceAsync, no necesito poner ninguna implementación en el método TestGameModule.configure(); Gin gestiona la creación de instancias de AsyncServices para mí a través de GWT.create().

Luego añade lo siguiente a TestGame.gwt.xml

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

Y finalmente, realizado los siguientes cambios a 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()); 
    } 
} 

Y esto cubre prácticamente la plataforma HTML5 para PlayN.

para la plataforma Java, añado la siguiente dependencia coordina a 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> 

tenga en cuenta que el proyecto GWT-syncproxy en Google Code no contiene un pom.xml. Tengo una mavenized versión de gwt-syncproxy bifurcada y disponible a través de git en https://bitbucket.org/hatboyzero/gwt-syncproxy.git. Debería poder clonarlo, ejecutar mvn limpiar instalar paquete para obtenerlo en su repositorio local de Maven.

De todas formas, he creado un TestGameModule.java para la plataforma Java de la siguiente manera:

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

Y he modificado TestGameJava.java de la siguiente manera:

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

Fui a través de un ejercicio similar con el Plataforma Android y RoboGuice: sin entrar en detalles, los cambios/fragmentos relevantes son los siguientes:

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

Ese es un resumen rápido y sucio de cómo obtuve Gin/Guice/RoboGuice + GWT trabajando en mi proyecto, y he verificado que funciona tanto en plataformas Java como en HTML.

De todos modos, existe el enfoque GWT para proporcionar llamadas RPC a múltiples plataformas PlayN :).

+1

Seguí adelante y actualicé mi respuesta un poco, ya que he logrado resolver muchos problemas en cómo hacer esto recientemente ... – hatboyzero

+0

Parece que puedo hacer lo mío con GWT RPCs y tomar este enfoque si/cuando quiero soportar modos de salida que no sean HTML. ¡Gracias por la respuesta detallada! –

+0

No hay problema - feliz de estar a servicio :) – hatboyzero

Cuestiones relacionadas