ããã«ã¡ã¯ïŒ æ¥ãã§å
±æããçŽ æŽãããé±æ«ãéãããŸããïŒ 1æ¥åã®éãç§ã¯è³æãæ瀺ãããªãã·ã§ã³ãæ€èšããã¬ã€ã¢ãŠããèŠãäžè¬ã«ããŸãããããã«æåãå°œãããŸããã ãã¬ãŒãã³ã°è³æã®ã³ã³ããã¹ãã§äœãè¯ãã§ããïŒ ç§ã®æèŠã§ã¯ãããã¯ãèå³æ·±ãããç°¡æœããæ£ç¢ºããæå¿«ãã§ãã å人çã«ãã®ãããªèšäºãæžãããšã¯åæ¥ã§ãã ããããäžé£ã®èšäºã¯ãåã«å€§å®¹éã§è²¬ä»»ã®ããã¿ã¹ã¯ã§ãã ã²ãŒã ããŒãããäœæããéçšã§Scene2dãåŠç¿ããŸãïŒ ç§ãã¡ã®åµé æ§ã®ããã»ã¹ã¯10ã12æ¥éç¶ããŸãã ææã®é »åºŠã¯1æ¥ã«1åçšåºŠã«ãªããšä¿¡ãããã å人çã«ã¯ãããã¯éåžžã«éå¿çãªã¿ã¹ã¯ã§ãããªããªããããã°ã©ã ããã ãã§ãªãã詳现ãªåæãšãšãã«èšäºã«èšè¿°ããããšãå¿
èŠã ããã§ãã ç§ã¯ãèãçãæµ·ã«æ¥ãããšã®æ¯æè
ã§ã¯ãªããæ³³ãæ¹ãåŠã³ãããšæã£ãŠããŸãã æ°ŽããŸããé£ã³è¶ããŠãäžè²«ããŠæ·±ããåºããŠãããŸãã ããã§ã¯å§ããŸãããã
補åã«ãŒãã䜿çšããŠããã°ã©ã ã®éçºãéå§ããããšã匷ããå§ãããŸãã 矩åãã-ç®æšã Googleããã¥ã¡ã³ãã§ååã«ãŒããäœæããŠããŸããã
ããããã®ã±ãŒã¹ã§ã®ã«ãŒãã®å€èŠ³ã§ãã
äžäžã®å€§ç©
ãããžã§ã¯ãã®ç®ç
- ãµã€ãhabrahabr.ruã®ã²ãŒã éçºããã»ã¹ã®ãã¢ïŒå
¬éãæ
å ±æäŸãçæïŒ
- ãã®åŸæè²ãšããŠäœ¿çšã§ããè³æã®äœæïŒå人ãè©å€ãé·æ;äžè¬ãæ
å ±ãé·æïŒ
- åçšã²ãŒã ã®åºç€ã®äœæïŒå人çšãçæïŒ
- Google Playããã®ããŠã³ããŒãã®èªèŽïŒå人ãéèãé·æïŒ
ãŸã第äžã«ãç§ãã¡ã¯ã§ããã ãæ£çŽã«åæ©ã«å¯ŸåŠããããšããŸãã ãªããã®ããžãã¹ã«åå
¥ããã®ã§ããããã ãã¹ãŠãè¯ãå Žåã«ç§ãã¡ãå°ãå
ãšããŠããããŠãã¹ãŠãæªãå Žåã«ã±ãã蹎ãã®ã«åœ¹ç«ã€ãã®ã¯äœã§ãããã å©ä»äž»çŸ©ãšãäžçå¹³åããé¿ããããã«ããŠãã ããã 人éã®ç²Ÿç¥ã¯ãå人çãªåæ©ä»ãã®èŠçŽ ãå
¬çãªãã®ãããéèŠã«ãªãããã«æ§æãããŠããŸãïŒããã§ã¯ãå
èŠçãªå¿çåŠã¯èããŠããŸããïŒã
ã²ãŒã ã®äžç
äžäž/ãã¡ã³ã¿ãžãŒ
ã²ãŒã ã®ç®æšã¯å€é¡ã®ãéã§ãã
ãªãœãŒã¹åé
販売äž
ã²ãŒã ã®èª¬æ
ãã®éçºã®æåã®äž»ãªç®æšã¯äœæ¥ãå®èšŒããããšã§ãããããã²ãŒã ã®äžçãšã²ãŒã ããã»ã¹ã®èª¬æã®äž¡æ¹ããè³æã®è¡šç€ºãç°¡æœãã€æ確ã«ããããã«ç°¡ç¥åãããŸãã
ãã¬ãŒã€ãŒã¯ãªãœãŒã¹ãåéããããŒã«ã«åžå Žã§è²©å£²ããŸãã é£æ/ãšãã«ã®ãŒã¯ãè³æºã®çºèŠãšåéã«è²»ããããŸãã ãšãã«ã®ãŒãçµãã£ãããè¡ã§è²·ãå¿
èŠããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãããã¿ã€ã
ååã®èšäºã§ã¯ããããã¿ã€ãäœæçšã®ããŒã«ãšããŠããŒãããã¯ãšéçãæšå¥šããŠããŸãããããã®ã¬ã€ã¢ãŠãã¯Adobe Experience Design CCïŒããŒã¿ïŒã§è¡ãããŸããã èšäºã®å
¬éæã«ãç¡æ
ã§ããŠã³ããŒãã§ããŸã ã ç§ã¯åœŒãš1æ¥åã®éåãããšã決ããŸããããããã¯æ£åœåããããšæããŸãã å®éã®ãšãããHabréã®åºçç©ã¯ãç§ãåç¬ã§ãã¹ãŠãè¡ã£ããšããŠããã°ã«ãŒãäœæ¥ã§ãã 質ã®é«ããµããŒãè³æãæäŸããã»ã©ãæ
å ±ãææ¡ãããããªããŸãã ãããAdobe Experience Design
ãããžã§ã¯ããã¡ã€ã«ã§ã ã ããŠã³ããŒãããŠããã¬ãŒã³ããŒã·ã§ã³ã¢ãŒãã§èµ·åãããã¿ã³ãå°ãæŒãããšãã§ããŸãã æè¡çã«ã¯ãå¥ã®èšäºãæåºã§ããŸããããããå¿
èŠãã©ããã¯ããããŸããã ã³ã¡ã³ããå€æããŸãã
ããŠãå
¬éãªããžããªãªãã§ã©ã®ãããªéçºãè¡ãããŸãããïŒ
ãã¡ãããªã³ã¯ã§ãã
ä»äºã«ã¯ãAndroid Studio 3.0ïŒCanary 5ãçŸåšå©çšå¯èœïŒãAndroid SKDããã³
LibGDXãå¿
èŠã§ãã ç§ã¯ããããã¹ãŠã®äžå®å®ãªç¥æµãããã§ã¯ãã¹ãŠã®å€§ããªç·ã®åãšå¥³ã®åã®ã€ã³ã¹ããŒã«ãæ¬ å ŽããŸãã 極端ãªå Žåã«ã¯ãã³ã¡ã³ãããããŸãã
LibGDXæ§æãŠã£ã¶ãŒãã¯ãã³ãã³ãã©ã€ã³ããéå§ããŸãã
java -jar gdx-setup.jar
ãããžã§ã¯ããªãã·ã§ã³ LibGDXã¯ãPCãAndroidãiOSãããã«ã¯HTMLïŒGWTã䜿çšãããKotlinã䜿çšããŠãããããHTMLã¯è
åšã«ãªããŸããïŒãåæã«äœæã§ããã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ã§ãã æ¡åŒµæ©èœã®ãã¡ã2ã€ãéžæããŸããã
Freetype-ttf / otfãããããããããã©ã³ããçæã§ããŸã
ããŒã«-ãšãããããã¯ã¹ãã£ã¢ãã©ã¹ãçæã§ããŸãçµæã®ãããžã§ã¯ãã§ã®ã³ãããã¯ãªããžããªã§å©çšå¯èœã§ãã ã©ã®ãã©ã°ã¡ã³ããäœã®åå ã§ããããç解ããããããã«ãã³ããããåãå»ãã§åœåããããšããŸããã LibGDXã¯ã¯ãã¹ãã©ãããã©ãŒã ã§ãããããéçºã®ã»ãšãã©ãPCã§è¡ãããªãªãŒã¹ã®çŽåã«Androidã®ãšã©ãŒããã¹ã/ä¿®æ£ããŸãã ååãšããŠããã®äœæ¥ã«ã¯2ã3æéããããããŸããã
ãã®èšäºã§ããã«
- DesktopLauncherãä»ããŠãããžã§ã¯ããéå§ãã
- Kotlinã§ã®ãããžã§ã¯ãã®ç¿»èš³
- Kotlinã®æªæ§æãšã©ãŒ
- kotlin-desktopããŒãžã§ã³ã®Gradleèšå®
- ãã¹ã¯ãããçã®çžŠåãèšå®
- Scene2Dã®æåã®äœ¿çšã èµ·åç»é¢ãèµ·åã·ãŒã³
DesktopLauncherãä»ããŠãããžã§ã¯ããéå§ãã
DesktopLauncherã®äœæ¥ãã©ã«ããŒã¯android / assetã«ããããšã«æ³šæããŠãã ããã ã³ãããæã«DesktopLauncherãèµ·åããïŒ
libgdxãŠã£ã¶ãŒãåŸã®åæã³ããã æ°ããæ§æããããããžã§ã¯ãã§ãããAndroidã§ã¯èµ·åããªãããšã«æ³šæããŠãã ããã ããã¯æ¬¡ã®ã¹ãããã§ä¿®æ£ããŸãã
Kotlinã§ã®ãããžã§ã¯ãã®ç¿»èš³
LibGDXãããžã§ã¯ãã¯ããã«ãã¢ãžã¥ãŒã«gradleãšããŠæ§æãããŸãã ã³ã¢ãAndroidããã¹ã¯ãããçšã®ãããžã§ã¯ãbuild.gradleãšã¢ãžã¥ã©ãŒbuild.gradleããããŸãã ã»ãšãã©ãã¹ãŠã®ã³ãŒããã³ã¢ã§èšè¿°ããŸãã Androidãããžã§ã¯ãã§ã¯ãåŸã»ã©AdMob +ã€ããŒã·ãã¢ãŒãã®æ§æ+ Google Playã¹ãã¢ã§ã®è³Œå
¥ãè¡ããŸãã
ãããžã§ã¯ããJavaããkotlinã«è»¢éããã«ã¯ããã¹ãŠã®é©çšãã©ã°ã€ã³ãjavaããå€æŽããŠãã©ã°ã€ã³ãkotlinããé©çšããŸãã android / build.gradleã«ãé©çšãã©ã°ã€ã³ãkotlin-androidããè¿œå ããŸãã æ倧ã®å€æŽã¯ãããžã§ã¯ãbuild.gradleã§çºçããŸãã
build.gradle mavenCentral() maven { url "https://oss.sonatype.org/content/repositories/snapshots/" } jcenter() + + maven { url 'https://maven.google.com' } } + + ext.kotlin_version = '1.1.3' + dependencies { - classpath 'com.android.tools.build:gradle:2.2.0' - - + // uncomment for desktop version + // classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:3.0.0-alpha5' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } @@ -37,7 +43,7 @@ } project(":desktop") { - apply plugin: "java" + apply plugin: "kotlin" dependencies { @@ -74,13 +80,13 @@ } project(":core") { - apply plugin: "java" + apply plugin: "kotlin" dependencies { compile "com.badlogicgames.gdx:gdx:$gdxVersion" compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion" - + compile "org.jetbrains.kotlin:kotlin-stdlib-jre8:$kotlin_version" } }
Googleãªããžããªãè¿œå ãããkotlin-gradle-pluginãbuildscript.dependenciesã«è¿œå ãããcompile-dependency kotlin-stdlibïŒãã®å Žåã¯kotlin-stdlib-jre8ïŒãã³ã¢ãããžã§ã¯ãã«è¿œå ãããŸããã
ãã®ããŒãžã§ã³ã¯Androidã§åäœããŸãããAndroid Studio 3.0 Canary 5ãšã©ãŒã®ããã«ãã¹ã¯ãããçã§ã¯åäœããŸããããªããããçç±ã ãšæããŸã-desktop-runã¿ãŒã²ããã§gradleãå®è¡ããŠãã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãïŒAndroidãå®è¡ããã«ã¯å®è¡äžã®Androidããã€ã¹/ãšãã¥ã¬ãŒã¿ãå¿
èŠã§ãïŒå®è¡ïŒã ãã ããAndroid Studioããèµ·åãããšãã¹ã¬ãããmainãjava.lang.NoClassDefFoundErrorïŒkotlin / jvm / internal / Intrinsicsã§äŸå€ãã¹ããŒãããŸãã 誰ããææ°ããŒãžã§ã³ã®gradleã§DesktopLauncherã®èµ·åãæã¡è² ããããšãã§ãããªããç§ã«ç¥ãããŠãã ããïŒ
Javaãã¡ã€ã«ã®ktãžã®å€æã¯åºæ¬ã§ãããã¡ã€ã«/ãã©ã«ããŒãéžæããCtrl + Alt + Shitf + KãæŒããŸãã ãã®æäœã®åŸã«çºçããå¯äžã®ãšã©ãŒã¯ãå®çŸ©æã«ããããã£ãåæåããKotlinã®ãªã¯ãšã¹ãã§ãã
java public class MedievalTycoonGame extends ApplicationAdapter { SpriteBatch batch; Texture img; @Override public void create () { batch = new SpriteBatch(); img = new Texture("badlogic.jpg"); } @Override public void render () { Gdx.gl.glClearColor(1, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); batch.begin(); batch.draw(img, 0, 0); batch.end(); } @Override public void dispose () { batch.dispose(); img.dispose(); } }
ã³ããªã³ class MedievalTycoonGame : ApplicationAdapter() { internal var batch: SpriteBatch // <- private lateinit var batch: SpriteBatch internal var img: Texture // <- private lateinit var img: Texture override fun create() { batch = SpriteBatch() img = Texture("badlogic.jpg") } override fun render() { Gdx.gl.glClearColor(1f, 0f, 0f, 1f) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) batch.begin() batch.draw(img, 0f, 0f) batch.end() } override fun dispose() { batch.dispose() img.dispose() } }
internal = javaã®ããã±ãŒãžã®å¯èŠæ§ã ãããã®å¯èŠæ§ã¯å¿
èŠãããŸããïŒãããŠäžè¬ã«ã2ã3ã®ã³ãããåŸã«ãããã®ãã£ãŒã«ããåé€ããŸãïŒã ãã¹ãŠã®å Žåã«ããã«ãã£ãŒã«ããåæåã§ããããã§ã¯ãªããäžè¬çã«ãããnullå¯èœã«ããããšã¯æãã§ãïŒnullã»ãŒãã®ããã ãã«kotlinã«èå³ããããŸãïŒã ãã®ããã«ãkotlinã«ã¯lateinit修食åããããŸããããã¯ãããã°ã©ããŒãæ¯ã«äžãããã®ãã³ã³ãã€ã©ãŒã«äŒããŸãããã®ãã£ãŒã«ãã䜿çšãããšãã¯nullã«ãªããŸããã ããã¯ãããããæ§æãœã«ãã§ãã äžè¬ã«ãèªåå€æã®çµæãšããŠã§ã¯ãªããã®ã³ãŒããèŠãå ŽåãèŠãæ¹ãé©åã§ãïŒ
private val batch = SpriteBatch() private val img = Texture("badlogic.jpg")
Kotlinã®æªæ§æãšã©ãŒ
ãã®ãšã©ãŒã¯ãAndroid Studioãèµ·åãããã³ã«è¡šç€ºãããŸãã åæã°ã©ãã«ãã¯ãªãã¯ããã ãã§ãïŒ
kotlin-desktopããŒãžã§ã³ã®Gradleèšå®
åè¿°ããããã«ãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ã¯ãããããŒãžã§ã³ãéçºããããšã奜ã¿ã2ã3è¡ãå€æŽããããšã§ãã®ã¢ãŒãã埩掻ãããŸãã å¿
èŠãªã®ã¯ããããžã§ã¯ãbuild.gradleã§æå®ããããšã ãã§ã
ã¯ã©ã¹ãã¹ 'com.android.tools.build:gradle:2.3.2'ãããã³gradle-wrapper.propertiesããŒãžã§ã³gradle-3.3-all.zip
ãã¹ã¯ãããçã®çžŠåãèšå®
DesktopLauncherã«ãããã€ãã®æ§æãªãã·ã§ã³ãè¿œå ããŸãã 3ã€ã¯ããŠã£ã³ããŠãµã€ãºãšãµã€ãºå€æŽãªãã·ã§ã³ã«é¢é£ããŠããŸãã 4çªç®ã®ãã©ã¡ãŒã¿ãŒvSyncã¯æ¬¡ã®çç±ã§ç¡å¹ã«ãªã£ãŠããŸã ãã¹ã¯ãããã®äžéšã®ãããªã«ãŒãã§ãconfig.foregroundFPS = 60ïŒããã©ã«ãïŒã®ã¿ã«ã°ãªãããããã1ã€ã®ããã»ããµã³ã¢ã100ïŒ
ã§ããŒãããŸãã
config.width = 576 config.height = 1024 config.resizable = false config.vSyncEnabled = false
Scene2Dã®æåã®äœ¿çšã èµ·åç»é¢ãèµ·åã·ãŒã³
ããã§ãScene2DãåããŠäœ¿çšããŸããã ãããäœãæå³ããŠããŠãããªããããããäœãæãããšãã§ãããã«ã€ããŠç°¡æœã«ããã€ãã®èšèã
Scene2Dã¯èŠçŽ ã®ã°ã©ãïŒããªãŒïŒã§ãããäž»ã«UIã®äœæãç®çãšããŠããŸãã ç®±ããåºããŠããã«ãã¿ã€ãã»ãããèŠçŽ ã®å€æïŒå転ãæ¡å€§çž®å°ãã·ãããªã©ïŒãè¡ãããšãã§ããŸãã 倧ããªå©ç¹ã¯ãã¿ããã®åŠçã§ãã ããŠãã±ãŒãã®ãã§ãªãŒã¯ã¢ã¯ã·ã§ã³ã®ã·ã¹ãã ã§ãã ç解ã§ããªãå®çŸ©ã§ãç§ãã¡ã¯äººéã®èšèªã§ãåãããšãçµããŸããã
ã·ãŒã³ããããç»é¢å
šäœãå æããŸãã ã¹ããŒãžäžã«ã¯ãããŒãã«ãããŒãã«å
ã®åçãã¹ã¯ããŒã«ããŒã1ããŒã¹ã®ãã¿ã³ãããã«ã¯aldããããã·ã¥ïŒäž»ãªãã®ã¯åœŒã俳åªã§ãããšããããšã§ãïŒãé
眮ã§ããŸãã äž/äžå€®/å·Š/å¹
ãªã©ã®ããžãã¯ã¯ãŒãã䜿çšãã ã¬ã€ã¢ãŠããå®è£
ããŸãã äŸã¯ãããã«ã¡ã¯äžçãææ¥ã ãã«ãªããããè€éã§ããããããã®èšäºã¯ãã°ãããããšãããããŸããã ããã«ãä»»æã®èŠçŽ ã«ã¿ãããã³ãã©ãŒãæãããšåäœããŸãã ã¯ãªãã¯ã®åº§æšãæåã§ãã£ããããããããã«ãããã®ãz-indexãªããžã§ã¯ããªã©ã確èªãããããå¿
èŠã¯ãããŸããã ããããåã³ãææ¥ã«ã€ããŠã ãããŠä»æ¥ãæåŸã«ããã€ãã®ã³ãŒãã¹ããããããããŸãã
class MedievalTycoonGame : Game() { val viewport: FitViewport = FitViewport(AppConstants.APP_WIDTH, AppConstants.APP_HEIGHT) override fun create() { screen = LoadingScreen(viewport) } }
MedievalTycoonGameã¯ã©ã¹ã¯Gameããç¶æ¿ããããã«ãªããŸãããGameã®å
šã¿ã¹ã¯ã¯ãç»é¢ã«äœæ¥ãé
眮ããããšã§ãã ãŠãŒã¶ãŒã«è¡šç€ºããæåã®ç»é¢ã¯ãLoadingScreenãšåŒã°ãã1ã€ã®ã·ãŒã³ïŒLoadingStageïŒãå«ãŸããŸãã ãªããªã ãããã®ã¯ã©ã¹ã¯æé·ãããã®ã§ã¯ãªãããã1ã€ã®ãã¡ã€ã«LoadingScreen.ktã«é
眮ããŸã
LoadingScreen.kt class LoadingScreen(val viewport: Viewport) : ScreenAdapter() { private val loadingStage = LoadingStage(viewport) override fun render(delta: Float) { Gdx.gl.glClearColor(0f, 0f, 0f, 0f) Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT) loadingStage.act() loadingStage.draw() } override fun resize(width: Int, height: Int) { viewport.update(width, height) } } class LoadingStage(viewport: Viewport) : Stage(viewport) { init { val backgroundImage = Image(Texture("backgrounds/loading-logo.png")) addActor(backgroundImage.apply { setFillParent(true) setScaling(Scaling.fill) }) } }
LoadingScreenã¯ãç»é¢ãé»ã§äžæžãããLoadingStageã®actïŒïŒããã³drawïŒïŒã¡ãœãããåŒã³åºããŸãã actïŒïŒã§ã¯ãããã°ã©ã ããžãã¯ããã³ã°ãããããŒã¿ãæäœããã®ãéåžžã«äŸ¿å©ã§ãã æç»ïŒïŒã¯ãã·ãŒã³å
ã®ãã¹ãŠã®èŠçŽ ãæç»ããã ãã§ãã
ç§ã匷調ãããå¯äžã®ããšã¯ãjava vs kotlinã·ãŒã³ã®åæåãã©ã®ããã«èŠãããã§ã
init { val backgroundImage = Image(Texture("backgrounds/loading-logo.png")) addActor(backgroundImage.apply { setFillParent(true) setScaling(Scaling.fill) }) }
public LoadingStage() { Image backgroundImage = new Image(new Texture("backgrounds/loading-logo.png")); backgroundImage.setFillParent(true); backgroundImage.setScaling(Scaling.fill); addActor(backgroundImage); }
kotlinã®å ŽåãèŠçŽ ãåžžã«åæåããé£æ¥ããè¡ã«é
眮ããŸãã ããã¯ãæ¡åŒµæ©èœã®é©çšæ©èœã«ãã£ãŠå®çŸãããŸãã kotlinã®éå±€ã¯èªåçã«ã€ã³ãã³ããããèŠèŠçã«éåžžã«èªã¿ããããªããŸãã Javaã§ã¯ããã¹ãŠã®çµçãã€ã³ãã³ããããŸãã å€ãã®å ŽåãèŠçŽ ãåæåããŠé
眮ããããšã¯ã§ããŸããã éå±€ã3ã¬ãã«ä»¥äžã®æ·±ãã§æ§æãããŠããå ŽåãJavaã§èŠçŽ ãçŸããïŒãããŠå®äŸ¡ã«ãµããŒãããŠïŒæŽçããããšã¯äžå¯èœã§ãã
ä»æ¥ã¯ä»¥äžã§ãã ãã®èšäºã玹ä»ãšããŠèããŠãã ãããScene2Dã®å®éã®å
¬éãšã²ãŒã ã®å®è£
ã¯ææ¥ä»¥éã«ãªããŸãã ç§ãã¡ãšäžç·ã«ããŠãããŠããããšã;ïŒãããŠãåºåã®ããã§ã¯ãªãïŒãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãåºåãèŠãåªåãããå¿
èŠããããŸãïŒãScene2Dã§ã®ç§ã®æåã®ãããžã§ã¯ã "Fifteen"ããã¹ã¿ãŒããŸããã å©ç¹ã®-管çã®å®¹æãã ã¢ããªã±ãŒã·ã§ã³ã®ããŒãžã§ã³ã¯æ°åãšãŸã§ã¯ãããªããŸã§ããããŸããã90ïŒ
ã§ã空ã®ã»ã«ã®é£ã«æŒã蟌ãããšã§ã®ã¿ãããã®ç§»åãå¯èœã§ãããšããããŸããã
ç«ãéããŠã¿ãŠãã ããã
次ã®èšäºã§
- Scene2Dã®åºæ¬èŠçŽ
- 2ã€ã®åºæ¬çãªã¬ã€ã¢ãŠãã³ã³ãããŒ
- ãã¯ã¹ãã£ã¢ãã©ã¹
- ã¹ãã³
- åœéå
PSããŒãã£ã³ã°ç»é¢ã¯ãã¢ãŒãã£ã¹ãVitaly Samarinå¥åVitaly S Alexiusã®äœåã䜿çšããŸããã
æŽæ°ïŒ15ã®ãœãŒã¹ãžã®ãªã³ã¯
ç§ã¯ããã«èŠåããŸããã³ãŒãã¯æãã§ãã ã ããç§ãã¡ã¯æžããŸããã ãã®å Žã§ç»åã解æããŸãã URLã«ãã£ãŠç»åãåžã蟌ãŸããããã«ã³ãŒããä¿®æ£ã§ããŸãã ãã®ãããžã§ã¯ãã¯Androidã§å®è¡ããããšãçŽæããŠããŸãã ãã®èšäºãèªãã åŸã«ç¥ã£ãŠããã¹ããã¹ã¯ãããããŒãžã§ã³ãèµ·åããããã«å¿
èŠãªããšã