
1.ã¯ããã«
ãã®ãããžã§ã¯ãã¯ãã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã§Google App Engineã䜿çšããç°¡åãªäŸã§ãã
ãµãŒããŒéšåã¯ãJSON圢åŒã®ãã³ã®ã³ã®ãªã¹ããæäŸããŸãã ã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã¯ãHTTPãŸãã¯HTTPSãä»ããŠãã®ãªã¹ããèŠæ±ããŸãã
ãŸãããµãŒããŒåŽã¯ããŒã¿ããŒã¹ã«ç¹å®ã®ã€ãã³ããã€ãŸãç¹å®ã®ãã³ã®ã³ãžã®èšªåæ°ãšãã¿ã³ãæŒããåæ°ãèšé²ããŸããã€ãŸããéã«é€ãäžããããªããæ»ããŸãã
åãã³ã®ã³ã«ã¯ã
Name
ã
Bio
ããã³counterãã£ãŒã«ãã®èª¬æãã£ãŒã«ãããããŸãã
2.翻蚳ã®åŸ®åŠã
ãã³ã®ã³ä¿è²ã·ãã¥ã¬ãŒã¿ããã·ã¢èªã«ç¿»èš³ããæ¹æ³ãèããŸããããã幌çšåãã¯ãä¿è²ãããä¿è²ããšããŠãé©ããŠããŸããã ãããã£ãŠã翻蚳ããã«æ®ã£ââãã
3.æºå
Google App Engine Go SDKãã€ã³ã¹ããŒã«ãããŠããªãå Žåã¯ã
Google App Engineãªã³ã¯ãã¯ãªãã¯ãããä»ãã詊ãããã¯ãªãã¯ããŠããã¹ãŠã®ãã€ã³ãã«åŸããŸãã ãããžã§ã¯ãã«ååãä»ãã[Go]ãéžæããSDKãããŠã³ããŒãããŠã€ã³ã¹ããŒã«ããŸãã ç°å¢å€æ°ïŒ
PATH
ã
GOROOT
ã
GOPATH
ã
APPENGINE_DEV_APPSERVER
ïŒã
APPENGINE_DEV_APPSERVER
ããããšã確èªããŠãã ãããããã«ããã
goapp
ã³ãã³ãã衚瀺ãããŸãã ä»åŸã¯ãåçŽãªãããžã§ã¯ããGAEãµãŒããŒã«ã¢ããããŒãããŠå®è¡
goapp deploy
ã¯ããããžã§ã¯ããã£ã¬ã¯ããªã§
goapp deploy
ã³ãã³ããå®è¡ããå¿
èŠããããš
goapp deploy
ãŸãã 圌女ã¯ããããžã§ã¯ããé
眮ããGoogleã¢ã«ãŠã³ãã®ã¡ãŒã«ãå°ããŸãã ãããžã§ã¯ãåãapp.yamlãšãµã€ãã§äžèŽããããšãéèŠã§ãã ãã ãããã®ãããžã§ã¯ãã§ã¯ãã¢ãžã¥ãŒã«ã䜿çšãããããŒãããã»ã¹ãå€å°ç°ãªããŸãã
Goã®IDEãšããŠ
LiteIDEããLuaããã³Corona SDKã®
ZeroBrane Studioããå§ãããŸãã Corona SDKã¯
Webãµã€ãããããŠã³ããŒãã§ããŸãã
4.ã¯ãªã³ããµãŒããŒ
次ã®å³ã¯ãã¯ã©ã€ã¢ã³ãïŒå·ŠïŒãšãµãŒããŒïŒå³ïŒã®éã®éåžžã«è€éãªéä¿¡ã¹ããŒã ã瀺ããŠããŸãã
ã芧ã®ãšãããã¯ã©ã€ã¢ã³ãã¯ãã³ã®ã³ã®ãªã¹ãã®ã¿ãèŠæ±ãã3ã€ã®ã€ãã³ãã®ã¿ãéä¿¡ããŸãã éä¿¡ã¯HTTPçµç±ã§ãããHTTPSã¯ç¡æã§äœ¿çšã§ããŸãã ããã¯ãGAEã䜿çšããå©ç¹ã®1ã€ã«èµ·å ããå¯èœæ§ããããŸããSSLèšŒææžã«æ¯æããããŠãããã§äœæ¥ãæ§æããå¿
èŠã¯ãããŸããã
ãã¹ãŠãHTTPãä»ããŠæ©èœãããããç¹å¥ãªã¯ã©ã€ã¢ã³ãã䜿çšããã«ãã©ãŠã¶ãŒã§ãªã¯ãšã¹ããçŽæ¥å®è¡ã§ããŸãã
penguin-daycare-simulator.appspot.comã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã§ã¯äœ¿çšãããªãåçŽãªæšæ¶ã§ããããµãŒãã¹ãæ©èœããŠãããã©ããã確èªã§ããŸãã httpãhttpsã«çœ®ãæããŠããããæ©èœããããšã確èªã§ããŸãã
penguin-daycare-simulator.appspot.com/penguinsããã¯æãéèŠãªãªã¯ãšã¹ãã§ãã ã¢ãã€ã«ã¯ã©ã€ã¢ã³ãã¯ããã®å©ããåããŠãçŸåšç£èŠäžã«ãããã¹ãŠã®ãã³ã®ã³ã®ãªã¹ããåãåããŸãã
ãã®ããŒã¿ããã䟿å©ã«è¡šç€ºããã«ã¯ãChromeã®
JSONviewæ¡åŒµæ©èœããå§ãããŸãã
penguin-daycare-simulator.appspot.com/stat/visitpenguin-daycare-simulator.appspot.com/stat/fishpenguin-daycare-simulator.appspot.com/stat/bellyrubãããã®3ã€ã®ã¯ãšãªã¯ããã³ã®ã³ã®å¯Ÿå¿ããã«ãŠã³ããã€ã³ã¯ãªã¡ã³ãããŸãã ãã³ã®ã³
Id
POSTãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãã ãµãŒããŒã¯å¿çã§äœãè¿ããŸããããå¿
èŠã«å¿ããŠãæååãOKããŸãã¯æäœã®æåã®å¥ã®ä¿¡å·ãå¿çã«è¿œå ã§ããŸãã
5.ããå€ãã®ã¹ã¯ãªãŒã³ã·ã§ãããããå€ãã®ã¹ã¯ãªãŒã³ã·ã§ããïŒ


èšäºã®å
¬éåã«ãç§ã¯ãã®ãã³ã®ã³ã«ã€ããŠæãåºããŸããïŒ
ããžãã£ããèŠã 6.ãµãŒããŒ-Google App Engine
ããã§ãã³ãŒãã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã Goãããžã§ã¯ãã®ãã¡ã€ã«æ§é ãèæ
®ããŠãã ããã
PenguinDaycareSimulatorServer/ âââ default/ â âââ app.go â âââ default.yaml â âââ penguins.json âââ static/ â âââ favicon.ico â âââ static.yaml âââ dispatch.yaml
default
ããã³
static
ã¯ã¢ãžã¥ãŒã«ã§ãã GAEã®ãããžã§ã¯ãã¯ã¢ãžã¥ãŒã«ã«åå²ããããšããã¢ãžã¥ãŒã«ãªãã§æ©èœããããšãã§ããŸãã ãã®å Žåã
app.yaml
ãã¡ã€ã«ã¯
app.yaml
ã
app/app.go
ããã³
penguins.json
3ã€ã ãã§ãã å
ã
ããã¯ç§ã®ãããžã§ã¯ãã®ã±ãŒã¹ã§ããïŒGitHubã§æåã®ã³ããããèŠãããšãã§ããŸãïŒããã¢ããªã±ãŒã·ã§ã³ã®1ã€ã®ã€ã³ã¹ã¿ã³ã¹ãåŠçã§ããåæãªã¯ãšã¹ãã®æ°ãæ
åœãã
max_concurrent_requests
èšå®ã远å ãããã£ãã®ã§ãã ããã©ã«ãå€ã¯10ã®ã¿ã§ããGoã¯æããã«ãã以äžã®æ©èœãåããŠããŸãã æå€§å€ã¯500ã§ããè² è·ãå¢å ããŠãã®å€ãè¶
ãããšãã¢ããªã±ãŒã·ã§ã³ã®è¿œå ã®ã³ããŒãèµ·åããããããã®éã§è² è·ã忣ãããŸãã GAEã®ç¡æã®ã¯ã©ãŒã¿ã®ã¿ã«åãããå Žåã¯ããã®èšå®ã䜿çšããããšã匷ããå§ãããŸãã ã¢ããªã±ãŒã·ã§ã³ããã®ãããªè² è·ã«å¯Ÿå¿ããŠããªãå Žåã¯ããã®å€ãæžãããŠææè«æ±ã«åãæ¿ããŸãã
ãããã£ãŠããã®èšå®ã¯ã¢ãžã¥ãŒã«ã§ã®ã¿äœ¿çšã§ããŸãã ãŸããGAEãã¢ãžã¥ãŒã«ãšèŠãªãã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã«å°ãªããšã2ã€ã®ã¢ãžã¥ãŒã«ãå¿
èŠã§ãã
static
ã¯éåžžã«ã·ã³ãã«ãªã¢ãžã¥ãŒã«ã§ããïŒäžèšã®GAEã®å¶éããªãå ŽåïŒããã®ã¿ã¹ã¯ã¯
favicon.ico
ãã¡ã€ã«ãéçã«æäŸããããšã ãã§ãã
default
-ãã¹ãŠã®äœæ¥ãè¡ãã¡ã€ã³ã¢ãžã¥ãŒã«ã
*.yaml
ãã¡ã€ã«ã¯èšå®ãšèª¬æã§ãã åã¢ãžã¥ãŒã«ã«1ã€ãšãã©ã®ã¢ãžã¥ãŒã«ãã©ã®URLãåŠçããããèšè¿°ãã1ã€ã®
dispatch.yaml
ãã¡ã€ã«ã
dispatch.yaml application: penguin-daycare-simulator dispatch: - url: "*/favicon.ico" module: static - url: "*/" module: default
static.yaml application: penguin-daycare-simulator module: static version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: /favicon.ico static_files: favicon.ico upload: favicon.ico
default.yaml application: penguin-daycare-simulator module: default version: 1 runtime: go api_version: go1 automatic_scaling: max_concurrent_requests: 500 handlers: - url: /.* script: _go_app
static.yaml
ã©ã³ã¿ã€ã ã§ã¯ãGoã§ã¯ãªãPythonãæå®ãããŠããããšã«æ³šæããŠãã ããã ããã¯ãå®éã«Goãã¡ã€ã«ãªãã§Goã«ã¢ãžã¥ãŒã«ãããŒãããããšãããšãGAEãèªãããã§ãã ãããã圌ã¯ãã®ç¶æ³ã§PythonãšPHPãèªããŸããã
ãªããããã¯ããã®æ³šææ·±ãèªè
ã¯ããPHPã¯éçãã¡ã€ã«ã®ã¬ã³ããªã³ã°ã«é¢ããŠPythonãããæªãããšäž»åŒµããèæŠãè§£ãæŸãšããšããŸãããPythonã¯å人çã«ç§ã«è¿ãã®ã§ããããéžãã ã®ã§ãã 誰ã§ããã®ç®çã§PHPã䜿çšã§ããŸãã ãã¡ããããã®ããã»ã¹ã«ã¯PythonãPHPãé¢äžããŠããªããããããã¯ãã¹ãŠç¡æå³ã§ãã
default.yaml
handlers
ã¯ãç¹å®ã®URLãåŠçããå®è¡å¯èœãã¡ã€ã«ã瀺ããŸãã ãã®å Žåãapp.goã¯ãã¹ãŠã®çä¿¡ãªã¯ãšã¹ããåŠçããŸãïŒ
dispatch.yaml
ãèæ
®ã«å
¥ããŸãïŒã URLã®èª¬æã¯éåžžã«æè»ã§ãæ£èŠè¡šçŸã䜿çšããŸãã ãã ããPythonãšPHPã§ç°ãªããã¡ã€ã«ã䜿çšããŠåãã¢ãžã¥ãŒã«å
ã®ç°ãªãURLãåŠçã§ããå ŽåãGoã§ã¯ã_go_appããšããŠæå®ãããåäžã®ãã¡ã€ã«ã§ããå¿
èŠããããŸãã ããã«ãæ¢ã«Goããã°ã©ã å
ã§ãå¿
èŠã«å¿ããŠãç°ãªãURLã®ãã³ãã©ãŒãéžæããã¢ããªã±ãŒã·ã§ã³å
šäœãè€æ°ã®ãã¡ã€ã«ã«åå²ã§ããŸãã
èšå®ãšyamlãã¡ã€ã«ã®è©³çްã«ã€ããŠã¯ã
ãã¡ããã芧ãã ãã ã
penguins.json
䜿çšãããŠãããã¹ãŠã®ãã³ã®ã³ã®ååãšèª¬æãå«ãJSONãã¡ã€ã«ã
penguins.json [ {"id": "1", "name": "Tux", "bio": "Beloved Linux mascot" }, {"id": "2", "name": "Skipper", "bio": "Small combat squad leader" }, {"id": "3", "name": "Lolo", "bio": "Russian adventurer" }, {"id": "4", "name": "Gunter", "bio": "The darkest character in Adventure Time" }, {"id": "5", "name": "The Penguin", "bio": "Na, na, na, na, na, na, na, na, na, na... The Penguin! " } ]
ãã®ãã¡ã€ã«ãä»ããŠãã³ã®ã³ã®è¿œå ãç·šéãè¡ãããŸãã
ã¢ããªã±ãŒã·ã§ã³å
šäœã®
app.go
ãŸãã å®å
šãªãªã¹ãã¯ãGitHub-
app.goã§èŠãã®ã«äŸ¿å©ã§ãããã®ãã¡ã€ã«ã®åçŽåãããæ§é ïŒ
package app . import (...) : Id, , , . type penguin struct {...} () . var penguins []penguin . type penguinEntity struct {...} . func init() {...} penguins.json penguins. func loadPenguinsJson() {...} / - . func rootHandler(w http.ResponseWriter, r *http.Request) {...} /penguins - JSON. func penguinsHandler(w http.ResponseWriter, r *http.Request) {...} /stat/visit - . func visitHandler(w http.ResponseWriter, r *http.Request) {...} /stat/fish - . func fishHandler(w http.ResponseWriter, r *http.Request) {...} /stat/bellyrub - . func bellyrubHandler(w http.ResponseWriter, r *http.Request) {...}
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãæåã«initïŒïŒé¢æ°ãèµ·åãããŸãããã®é¢æ°ã¯ãpenguins.jsonãã¡ã€ã«ããèªã¿åããã¯ã©ã€ã¢ã³ãããã®ããŸããŸãªèŠæ±ã«å¿çãã颿°ãèšå®ããŸãã èšäºã®åé ã®ãªã³ã¯ã§æ¢ã«äœ¿çšã§ããŸãã
penguinsHandler()
ã¯ã
json.Marshal()
颿°ã䜿çšããŠãã³ã®ã³ã¹ã©ã€ã¹ãJSON圢åŒã«
json.Marshal()
ãã
json.Marshal()
ãä»ããŠã¯ã©ã€ã¢ã³ãã«æäŸããŸãã
visitHandler()
ã
fishHandler()
ã
bellyrubHandler()
ã¯åãããžãã¯ã«åŸã£ãŠåäœããŸããããŒã¿ããŒã¹ãããã³ã®ã³ãåãåºãã察å¿ãããã©ã¡ãŒã¿ãŒã1ã€å¢ãããŠããŒã¿ããŒã¹ã«æžãæ»ããŸãã ããŒã¿ããŒã¹-
ããŒã¿ã¹ã㢠-ã¯SQLäºæã§ã¯ãããŸãããã€ãŸããNoSQLãœãªã¥ãŒã·ã§ã³ã§ãã 圌女ã®äœåã®èª¬æã¯å¥ã®èšäºã«å€ããŸãã
ããŒã¿ã¹ãã¢ãžã®ã¢ã¯ã»ã¹ãªã©ãGAEã®å€ãã®æäœã¯åå¥ã«èª²éãããããããªãœãŒã¹ã®éå°ãªäœ¿çšã¯é¿ããŠãã ããã ãã®ãããããšãã°ããã¹ãŠã®ãã³ã®ã³ã®çµ±èšãèŠæ±ããå Žåãé¢é£ããŒã¿ãæäŸããããšã¯å®å
šã«ãªãã·ã§ã³ã§ãã ãã®ãªã¯ãšã¹ãã¯ãããšãã°10åã®ãã£ãã·ã¥æå¹æéã§ãã£ãã·ã¥ã§ããŸãã ãããè¡ãããã«ã远å ã®å€æ°
lastUpdateTime
ãå°å
¥ããŸãããããã¯ã
penguins
ã¹ã©ã€ã¹ã®æåŸã®æŽæ°ã®ã¿ã€ã ã¹ã¿ã³ãã§ãã ãããŠãå
/penguins
ãªã¯ãšã¹ãã§
updatePenguinsStatistics()
颿°ãåŒã³åºããŸãããã®é¢æ°ã¯ããã£ãã·ã¥ã®æå¹æéãåããŠãããã©ããã確èªãããµã€ã¯ã«ã§
penguins
ã¹ã©ã€ã¹å
ã®åãã³ã®ã³ã®ã«ãŠã³ã¿ãŒãæŽæ°ããŸãã
æåã§æŽæ°ã匷å¶ããããã«ã远å ã®èŠæ±
/æŽæ°ãšå¯Ÿå¿ãã
updateHandler()
ãã³ãã©ãŒãå°å
¥ããŸããã
åèŠæ±ã¯ç¬èªã®ãŽã«ãŒãã³ã§åŠçãããããã
penguins
ã¹ã©ã€ã¹ãèšé²äžã®åææžã蟌ã¿ãŸãã¯èªã¿åãããä¿è·ããå¿
èŠããããŸãã ãã®ããã«ã
RWMutex
ã䜿çšãããŸã-èªã¿åããŸãã¯æžã蟌ã¿çšã®ãã¥ãŒããã¯ã¹ã ãã®äœ¿çšã¯ãåçŽãª
Mutex
ããã广çã§ãã
ãªãœãŒã¹ã®æ¯ææžã¿æ¶è²»ãåé¿ããããã«ãããŒã¿ããŒã¹ã«é
å»¶ã¬ã³ãŒããå
¥åããŠãåä¿¡ãããã¹ãŠã®ã€ãã³ãã®å€ãèç©ããããšãã§ããŸãã
ãããžã§ã¯ããGAEãµãŒããŒã«ã¢ããããŒãããã«ã¯ããããžã§ã¯ããã£ã¬ã¯ããªã®ã¿ãŒããã«ã§3ã€ã®ã³ãã³ããå®è¡ããå¿
èŠããããŸãã
goapp deploy default/default.yaml goapp deploy static/static.yaml appcfg.py update_dispatch .
å°æ¥ãapp.goã倿Žãããšãã¯ã
goapp deploy default/default.yaml
ãå®è¡ããã ãã§ãã
çµè«ãšããŠãç¡æã®å¶éãå¢ããã«ã¯ãææã®è«æ±æžãæ¥ç¶ããããšããå§ãããŸãããåæã«1æ¥ãããã®æå€§è²»çšã1ãã«ã«èšå®ããããšããµãŒããŒåŽã«ã€ããŠã話ããŸãã åæã«ãäžéšã®ç¡æå²ãåœãŠãå¢å ããŠããŸããããŸã äœã䜿çšããŠããŸããã
7.ã¯ã©ã€ã¢ã³ãåŽ-Corona SDK
Corona SDKã¯ãAndroidãiOSãWindows PhoneïŒè¿æ¥å
¬éäºå®ïŒãHTML5ïŒéçºäžïŒçšã®ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ãéçºããããã®ã¯ãã¹ãã©ãããã©ãŒã ãã¬ãŒã ã¯ãŒã¯ã§ãã ç§ã¯ãã®è£œåãããªãé·ãé䜿çšããŠãããããªãŒã©ã³ãµãŒãšããŠã®ã¯ã©ã€ã¢ã³ããšç§èªèº«ã®ããã«ã²ãŒã ãæžããŠããŸãã é©åãªé床ãšã¢ããªã±ãŒã·ã§ã³ã®äœæéåºŠã«æ³šæããŠãã ããã
ãããžã§ã¯ãã®ãã¡ã€ã«æ§é ããå§ããŸãããã äž»ã«ã¢ã€ã³ã³ãšåçã®ããã«ãããã«ããã«ãã¡ã€ã«ããããŸãã®ã§ãç§ã¯ã¹ãã€ã©ãŒã®äžã§ãããããããã«ããŸãã
ãã¡ã€ã«æ§é PenguinDaycareSimulator/ âââ images/ â âââ penguins/ â â âââ 1.png â â âââ 1@2x.png â â âââ 2.png â â âââ 2@2x.png â â âââ 3.png â â âââ 3@2x.png â â âââ 4.png â â âââ 4@2x.png â â âââ 5.png â â âââ 5@2x.png â âââ background.jpg â âââ background@2x.jpg â âââ button-over.png â âââ button-over@2x.png â âââ button.png â âââ button@2x.png â âââ dot-off.png â âââ dot-off@2x.png â âââ dot.png â âââ dot@2x.png â âââ fish.png â âââ fish@2x.png â âââ hand.png â âââ hand@2x.png â âââ popup.png â âââ popup@2x.png âââ lib/ â âââ api.lua â âââ app.lua â âââ utils.lua âââ scenes/ â âââ choose.lua â âââ menu.lua â âââ penguin.lua âââ Default-568h@2x.png âââ Icon-60.png âââ Icon-60@2x.png âââ Icon-72.png âââ Icon-72@2x.png âââ Icon-76.png âââ Icon-76@2x.png âââ Icon-Small-40.png âââ Icon-Small-40@2x.png âââ Icon-Small-50.png âââ Icon-Small-50@2x.png âââ Icon-Small.png âââ Icon-Small@2x.png âââ Icon-hdpi.png âââ Icon-ldpi.png âââ Icon-mdpi.png âââ Icon-ouya.png âââ Icon-xhdpi.png âââ Icon-xxhdpi.png âââ Icon.png âââ Icon@2x.png âââ build.settings âââ config.lua âââ main.lua
ä»ã®ãšãããLuaãã¡ã€ã«ã«ã®ã¿æ³šæãæãããšãã§ããŸãã
config.lua
ã
build.settings
-Corona SDKã®ãããžã§ã¯ãèšå®ãã¡ã€ã«ã ããŒãã¬ãŒããã¥ãŒãŸãã¯ã©ã³ãã¹ã±ãŒããã¥ãŒã«ãã¢ããªã±ãŒã·ã§ã³ãåç
§ç»é¢ã®è§£å床ããºãŒã æ¹æ³ããã®ä»ã®ããŸããŸãªèšå®ãããããšã瀺ããŸãã Corona SDKãåããŠã®å Žåã¯ãä»ã®ãšãããããã®ãã¡ã€ã«ã«æ³šæãæãããšã¯ã§ããŸããã
ãŸããã«ãŒãã«ã¯iOSãšAndroidã®ã¢ã€ã³ã³ã
Default-568h@2x.png
ãiPhone 5ã§æ£åžžã«åäœããããã«
Default-568h@2x.png
ããããŸããç»å/ãã£ã¬ã¯ããªå
ã«ã¯ãéåžžã®ãã¡ã€ã«ãš2åã®HDããŒãžã§ã³
@2x
ãŸãã ååãšããŠãiPhone 3GSã®ãããªç»é¢ãæã€ããã€ã¹ã¯ãµããŒãã§ããªããªããŸããããã®å²åã¯éåžžã«å°ããã§ãããããã§ããŒãã§ã¯ãããŸããã iPad Retinaãå®å
šã«ãµããŒãããã«ã¯ããã§ã«
@4x
ãã¡ã€ã«ãš
config.lua
è¡ãå¿
èŠã§ãããã»ãšãã©ã®ã²ãŒã ã¯åé¡ãªãåäœããŸãã
Corona SDKã¯
main.lua
ãã¡ã€ã«ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããå¿
èŠãªã©ã€ãã©ãªãããã«æ¥ç¶ãããããã€ãã®å€æ°ã宣èšãããã·ãŒã³ãããã€ã±ã¢ã«å
¥ãããã¿ã³ã§åãæ¿ããããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã·ãŒã³ïŒç»é¢ïŒã¯ç°ãªããã¡ã€ã«ã«ä¿åããã
scenes/
ãã£ã¬ã¯ããªã«åéããããã¹ãŠã®ãŠãŒã¶ãŒã©ã€ãã©ãªã
lib/
ã«é
眮ããŸããã éçºè
ã¯ãããã®ãã¡ã€ã«ã奜ããªããã«èªç±ã«é
眮ã§ããŸãã
lib/
app.lua
ãš
utils.lua
ãå«ãŸããŠããŸã-ããã¯äžç·ã«Corona SDKãæäœããããã®äŸ¿å©ãªé¢æ°ã®ã³ã¬ã¯ã·ã§ã³ã§ãã
app.lua
ãç»åãããã¹ãããã¿ã³ãªã©ã衚瀺ããããã®æšæºCorona SDK颿°ã®äŸ¿å©ãªã©ãããŒãå®è£
ããŸãã
main.lua
ãã
scenes/menu.lua
main.lua
ãžã®ç§»è¡
scenes/menu.lua
ãã©ã€ã³ãä»ããŠè¡ãããŸã
storyboard.gotoScene('scenes.menu')
ããã§ããã³ã®ã³èŠæ±ã¯æ¢ã«ãµãŒããŒäžã§å®è¡ãããŠããŸãã
menu.lua
äž»èŠãªã³ãŒãã
menu.lua
ãŸãã
function scene:createScene (event) local group = self.view app.newText{g = group, text = 'Penguin Daycare', size = 32, x = _CX, y = _CY - 150} app.newText{g = group, text = 'Simulator', size = 32, x = _CX, y = _CY - 110} local pleaseWait = app.newText{g = group, text = 'Please Wait', size = 16, x = _CX, y = _CY} local button = app.newButton{g = group, x = _CX, y = _CY, text = 'Enter the Daycare', onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideLeft', time = app.duration}) end} button.isVisible = false app.api:getPenguins(function() pleaseWait.isVisible = false button.isVisible = true end) end
3è¡ã®ããã¹ããš1ã€ã®ãã¿ã³ãäœæãããŸãã ãµãŒããŒããå¿çãåãåããŸã§ããã¿ã³ã¯é衚瀺ã«ãªããŸãã èŠæ±èªäœã¯
app.api:getPenguins()
颿°ã«ãã£ãŠå®è¡ãããåŒæ°ãšããŠã³ãŒã«ããã¯é¢æ°ããããŸãã
ãã¿ã³ãã¯ãªãã¯ãããšããã³ã®ã³ã®éžæã·ãŒã³ã
choose.lua
ãŸã
choose.lua
ãã¡ã€ã«ã®ã³ãŒãã®äž»èŠéšåã®ã¿ã
choose.lua
ãŸãã
function scene:createScene(event) local group = self.view self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.menu', {effect = 'slideRight', time = app.duration}) end} local function gotoPenguin(ind) storyboard.gotoScene('scenes.penguin', {effect = 'slideLeft', time = app.duration, params = ind}) end local slideView = newSlideView{g = group, x = 0, y = _CY, dots_y = 180, onRelease = gotoPenguin} for i = 1, #app.api.penguins do local p = app.api.penguins[i] local slide = display.newGroup() app.newImage('images/popup.png', {g = slide, w = 300, h = 335}) app.newImage('images/penguins/' .. p.id .. '.png', {g = slide, w = 200, h = 256}) app.newText{g = slide, x = 0, y = -140, text = p.name, size = 18, color = 'white'} app.newText{g = slide, x = 0, y = 140, text = p.bio, size = 14, color = 'white', w = 220, align = 'center'} slideView:addSlide(slide) end slideView:makeDots() slideView:gotoSlide(1) end
ããã§ã
newSlideView()
ã¯ããã³ã®ã³ã®ã¹ã©ã€ããã¹ã¯ããŒã«ã§ããã·ã³ãã«ãªãŠã£ãžã§ãããäœæãã颿°ã§ãã ãã®ãŠã£ãžã§ããã®ã³ãŒãã¯ããã¡ã€ã«ã®å
é ã®
choose.lua
ã«ãããŸãã
ãã³ã®ã³ããšã«ã¹ã©ã€ããäœæãããŸãã ãã³ã®ã³ã®ç»åã¯ã¢ããªã±ãŒã·ã§ã³å
ã«ä¿åããããã³ã®ã³ã®IDã«å¯Ÿå¿ããŸãã ããã¯ãGAEãµãŒããŒãªã©ã«ç»åãä¿åããããšã§ä¿®æ£ã§ããŸãã ãããã¯ãŒã¯ããç»åãããŠã³ããŒãããããã«ãCorona SDKã«ã¯
display.loadRemoteImage()
颿°ãŸãã¯äžäœã¬ãã«ã®
network.download()
ãŸãã
ã¹ã©ã€ããã¯ãªãã¯ãããšã
gotoPenguin()
颿°ã
gotoPenguin()
ãåä¿¡ãããã¹ãŠã®ãã³ã®ã³ã®é
åïŒããŒãã«ïŒå
ã®ãã³ã®ã³ã®çªå·ïŒ
Id
ã§ã¯ãªãïŒãååŸããŸãã ãã®é¢æ°ã¯æçµçãª
penguin.lua
ã·ãŒã³ã«ãžã£ã³ããããã®åŒæ°ãåãã·ãŒã³ã«æž¡ããŸãã
penguin.lua function scene:createScene(event) local group = self.view local background = app.newImage('images/background.jpg', {g = group, w = 384, h = 640, x = _CX, y = _CY}) self.backButton = app.newButton{g = group, x = _L + 10, y = _T + 10, w = 48, h = 32, rp = 'TopLeft', text = 'Back', fontSize = 14, onRelease = function() storyboard.gotoScene('scenes.choose', {effect = 'slideRight', time = app.duration}) end} local ind = event.params local p = app.api.penguins[ind] local visitsLabel = app.newText{g = group, x = _CX, y = _T + 20, text = 'Visits: ' .. p.visit_count, size = 18, color = 'white'} local fishLabel = app.newText{g = group, x = _CX, y = _T + 40, text = 'Fish: ' .. p.fish_count, size = 18, color = 'white'} local bellyrubsLabel = app.newText{g = group, x = _CX, y = _T + 60, text = 'Belly rubs: ' .. p.bellyrub_count, size = 18, color = 'white'} local penguin = app.newImage('images/penguins/' .. p.id .. '.png', {g = group, w = 200, h = 256, x = _CX, y = _CY - 25}) app.newButton{g = group, x = _CX - 80, y = _B - 50, w = 128, h = 48, text = 'Fish', fontSize = 14, onRelease = function() local fish = app.newImage('images/fish.png', {g = group, x = penguin.x, y = penguin.y + 200, w = 512, h = 188}) fish.alpha = 0.8 transition.to(fish, {time = 400, alpha = 1, y = penguin.y, xScale = 0.1, yScale = 0.1, transition = easing.outExpo, onComplete = function(obj) transition.to(fish, {time = 400, alpha = 0, onComplete = function(obj) display.remove(obj) end}) end}) app.api:sendFish(p.id) p.fish_count = p.fish_count + 1 fishLabel:setText('Fish: ' .. p.fish_count) end} app.newButton{g = group, x = _CX + 80, y = _B - 50, w = 128, h = 48, text = 'Belly rub', fontSize = 14, onRelease = function() local hand = app.newImage('images/hand.png', {g = group, x = penguin.x - 40, y = penguin.y + 30, w = 80, h = 80, rp = 'TopLeft'}) transition.to(hand, {time = 1200, x = penguin.x + 40, transition = easing.swing3(easing.outQuad), onComplete = function(obj) display.remove(obj) end}) app.api:sendBellyrub(p.id) p.bellyrub_count = p.bellyrub_count + 1 bellyrubsLabel:setText('Belly rubs: ' .. p.bellyrub_count) end} app.api:sendVisit(p.id) p.visit_count = p.visit_count + 1 visitsLabel:setText('Visits: ' .. p.visit_count) end
penguin.lua
ã§ã¯ãèæ¯ç»åãèªã¿èŸŒãŸããéžæãããã³ã®ã³ã®ç»åã衚瀺ãããããã€ãã®ããã¹ãã©ãã«ãš2ã€ã®ã¢ã¯ã·ã§ã³ãã¿ã³ã衚瀺ãããŸãã ããããã¯ãªãã¯ãããšãã¢ã¯ã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³åããããªã¯ãšã¹ãã颿°
app.api:sendFish()
ããã³
app.api:sendBellyrub()
ä»ããŠãµãŒããŒã«éä¿¡ãããŸãã ãŸãã
app.api:sendVisit()
ã¯ãã·ãŒã³ãäœæãããçŽåŸã«åŒã³åºãããŸãã ãããã®å颿°ãåŒã³åºããåŸãã€ã³ã¿ãŒãããããªãå Žåã§ãã察å¿ããããã¹ãã©ãã«ãæŽæ°ãããŸãã ããã¯ãåãªã¯ãšã¹ãã«å¯ŸããŠãµãŒããŒããã®å¿çã®ãã§ãã¯ãå
¥åããã³ãŒã«ããã¯é¢æ°ãæäŸããããšã§ä¿®æ£ã§ããŸãã
æåŸã«ããã¹ãŠã®ãµãŒããŒäœæ¥ã¯
lib/api.lua
è¡ãã
lib/api.lua
ã
api.lua local _M = {} local app = require('lib.app') _M.hostname = 'http://penguin-daycare-simulator.appspot.com' function _M:getPenguins(callback) local url = '/penguins#' .. math.random(1000, 9999) network.request(self.hostname .. url , 'GET', function (event) if not event.isError then local response = json.decode(event.response) if response then self.penguins = response callback() end end end) end function _M:sendVisit(id) local url = '/stat/visit' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendFish(id) local url = '/stat/fish' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end function _M:sendBellyrub(id) local url = '/stat/bellyrub' local request = {body = 'id=' .. id} network.request(self.hostname .. url , 'POST', function (event) if event.isError then app.alert('Network error') end end, request) end return _M
ãæ³åã®ãšããããµãŒããŒã®æäœã¯ç°¡åãªPOSTãªã¯ãšã¹ãã§è¡ãããŸãã
getPenguins()
å ŽåããµãŒããŒããã®å¿çã¯
json.decode()
颿°ã«ãã£ãŠJSON圢åŒããé
åïŒããŒãã«ïŒã«å€æãããã¢ãžã¥ãŒã«ã®ïŒããããã£ïŒãã£ãŒã«ãã«é
眮ãããŸãã
ã芧ã®ãšãããCorona SDKã§ã®POSTãªã¯ãšã¹ãã®éä¿¡ãšãã®å¿çãžã®å¿çã¯éåžžã«ç°¡åã§ãã ãããã£ãŠãGoogle App Engineèªäœãšã®çµ±åã¯éåžžã«ç°¡åã«ãªããŸããã ç§ã¯åè¡ãäœããããããã€ã³ãããŸãããæ§æãçŽæçã§ããããšãæã¿ãŸãã
8.åç
§
ãœãŒã¹ã¯ç§ã®GitHubã«ãããŸãïŒ
Android 2.3.3以éã«ã¯ã©ã€ã¢ã³ãããŒããã€ã³ã¹ããŒã«ã§ããŸããããã¯
APK ïŒ
ãã©ãŒ ïŒã§ãã
ãŸãã¯ãCorona SDKãããŠã³ããŒãããGitHubãããœãŒã¹ãããŠã³ããŒãããŠãCorona Simulatorã§å®è¡ããŸãã
ãã®èšäºã®å·çãæäŒã£ãŠãããM0sTH8ã«æè¬ããŸããTwitter @SergeyLergã§ãã©ããŒããŠãã ããããã ãã§ã ãæž
èŽããããšãããããŸããïŒ