2012-01-28 12 views
9

मैं क्लाइंट/सर्वर कार्ड गेम बनाने के लिए PlayN का उपयोग करना चाहता हूं, उदा। दिल। जबकि मैं ज्यादातर एचटीएमएल 5 आउटपुट पर ध्यान केंद्रित कर रहा हूं, मैं भविष्य में एंड्रॉइड क्लाइंट बनाने का फैसला करता हूं, तो मैं आदर्श रूप से आउटपुट-प्लेटफॉर्म-अज्ञेयवादी होना चाहता हूं। मुझे आरपीसी तंत्र से कैसे संपर्क करना चाहिए?क्लाइंट-सर्वर PlayN गेम में आरपीसी को कैसे संभालें?

ये विकल्प मैं के बारे में सोचा गया है कर रहे हैं: get()/पोस्ट के साथ RPC शुरू() पद्धतियों के लिए

  1. उपयोग JSON - एक सर्वलेट स्वीकार करता है कि/JSON देता है लिखते हैं, और ग्राहक कोड के सभी संस्करणों बनाने उसका उपयोग करें। ऐसा लगता है, लेकिन मैं JSON की verbosity के बारे में चिंतित हूँ। एक बार जब मैं दिल काम कर रहा हूं तो मैं अधिक जटिल खेलों में आगे बढ़ना चाहता हूं, और मुझे चिंता है कि जेएसओएन के परिणामस्वरूप क्लाइंट और सर्वर के बीच बहुत से अधिक आवश्यक संदेशों को पारित किया जा रहा है। मैं वास्तव में जावा में JSON के साथ काम करने के बारे में नहीं जानता, लेकिन मुझे लगता है कि यह करने योग्य है। क्या मेरी धारणाएं ऑनलाइन हैं? जावा JSON के साथ कितनी अच्छी तरह काम करता है?
  2. जीडब्ल्यूटी-आरपीसी का उपयोग जारी रखें। मैं अपने कोर (प्लेटफार्म-अज्ञेयवादी) कन्स्ट्रक्टर में एसिंक्रोनस सर्विस इंटरफ़ेस लेकर और मेरे HTML मुख्य() में GWT.create(MyService.class) (या कम से कम एक रैपर) द्वारा उत्पन्न जीडब्ल्यूटी असिंक इंटरफ़ेस में पास करके ऐसा कर सकता हूं। मुझे नहीं पता कि यह गैर-एचटीएमएल संस्करणों के लिए कितना अच्छा काम करेगा। क्या मेरे लिए क्लाइंट-साइड जावा कोड से सीधे जीडब्ल्यूटी-आरपीसी का उपयोग करना संभव है?
  3. आरपीसी के किसी अन्य रूप का उपयोग करें। कोई सुझाव?
+1

कोई पूरा उत्तर नहीं है, लेकिन थोड़ा सा: जावा जेसन के साथ अच्छा काम करता है, लेकिन सभी अच्छे जेसन लिब प्लेन के तहत टूटे हुए हैं। मैंने अभी एक सवाल पोस्ट किया है, क्योंकि हम जर्सी और ईई स्टैक से कुछ अन्य सामान का उपयोग कर एक स्टेटलेस आरईएसटी आवेदन के रूप में हमारे सर्वर का निर्माण कर रहे हैं। http://stackoverflow.com/questions/9045455/how-do-i-convert-a-pojo-to-json-in-playn यह हमें डीटीओ साझा करने के लिए प्रेरित करता है और टाइपएफ़ कॉलबैक करता है और आपके जीडब्ल्यूटी विधि का उपयोग कर सकता है जावा बिल्ड को तोड़ें, और फिर आप बस जीडब्ल्यूटी पर चिपके रहें और इसके लिए कुछ कैनवास ढांचे का उपयोग कर सकें। – iuiz

उत्तर

12

जावा और Android प्लेटफार्मों पर GWT RPC के लिए, मैं वर्तमान में gwt-syncproxy का उपयोग कर GWT RPC तरीकों के जावा ग्राहक पहुँच प्रदान करने के साथ प्रयोग कर रहा हूँ, और मैं पर Guice, जिन, और RoboGuice उपयोग कर रहा हूँ तत्काल गेम ऑब्जेक्ट के लिए उचित एसिंक्रोनस सेवा उदाहरणों को इंजेक्ट करने के लिए उनके संबंधित लक्ष्य प्लेटफ़ॉर्म।

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

तो मैं किसी भी क्षेत्र के लिए @Inject एनोटेशन जोड़ने:

एक PlayN परियोजना के लिए कोर/pom.xml में, मैं निम्नलिखित निर्भरता के रूप में की जरूरत डि जिन/Guice/RoboGuice से समर्थन करने के लिए निर्देशांक शामिल ठोस खेल कार्यान्वयन के अंदर:

public class TestGame implements Game { 

    @Inject 
    TestServiceAsync _testService; 

    ... 

} 

html/pom.xml में, मैं शामिल निर्भरता जिन के लिए निर्देशांक:

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

TestGameModule.java

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

इस समय के बाद से, मैं केवल इंजेक्शन लगाने कर रहा हूँ TestServiceAsync इंटरफ़ेस, मुझे TestGameModule.configure() विधि में कोई कार्यान्वयन करने की आवश्यकता नहीं है; जीन GWT.create() के माध्यम से मेरे लिए AsyncServices के तत्काल प्रबंधन का प्रबंधन करता है।

मैं तो TestGame.gwt.xml

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

के लिए निम्न और अंत में, मैं TestGameHtml में निम्न परिवर्तन किए गयी।जावा

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 प्लेटफ़ॉर्म को कवर करता है।

जावा मंच के लिए, मैं निम्नलिखित निर्भरता जावा/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 शामिल नहीं है। मेरे पास mwized- gwt-syncproxy फोर्कड का संस्करण है और https://bitbucket.org/hatboyzero/gwt-syncproxy.git पर गिट के माध्यम से उपलब्ध है। आपको इसे क्लोन करने में सक्षम होना चाहिए, एमवीएन क्लीन पैकेज को अपने स्थानीय मैवेन रिपोजिटरी में लाने के लिए चलाएं।

फिर भी, मैं जावा मंच के लिए एक 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)); 
    } 
} 

मैं के साथ एक समान व्यायाम के माध्यम से चला गया एंड्रॉइड प्लेटफॉर्म और रोबोगुइस - जबरदस्त विस्तार के बिना, प्रासंगिक परिवर्तन/स्निपेट निम्नानुसार हैं:

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

यह मेरे प्रोजेक्ट में काम करने वाले जीन/गुइस/रोबोगुइस + जीडब्ल्यूटी के बारे में एक त्वरित और गंदा रैंड डाउन है, और मैंने सत्यापित किया है कि यह जावा और एचटीएमएल प्लेटफॉर्म दोनों पर खूबसूरती से काम करता है।

वैसे भी, कई प्लेएन प्लेटफॉर्म पर आरपीसी कॉल प्रदान करने के लिए जीडब्ल्यूटी दृष्टिकोण है :)।

+1

मैं आगे बढ़ गया और मेरा जवाब थोड़ा सा अपडेट किया क्योंकि मैंने हाल ही में यह करने के तरीके में बहुत सारे कंकों को काम करने में कामयाब रहा है ... – hatboyzero

+0

ऐसा लगता है जैसे मैं जीडब्ल्यूटी आरपीसी के साथ अपनी बात कर सकता हूं और यह दृष्टिकोण ले सकता हूं अगर/जब मैं गैर-एचटीएमएल आउटपुट मोड का समर्थन करना चाहता हूं। विस्तृत प्रतिक्रिया के लिए धन्यवाद! –

+0

कोई समस्या नहीं - सेवा होने के लिए खुश :) – hatboyzero

संबंधित मुद्दे