рдЬрд╛рд╡рд╛ рдореЗрдВ HTML5 / рдлрд╝реНрд▓реИрд╢ рдЧреЗрдореНрд╕ рдмрдирд╛рдирд╛

PlayN рдФрд░ "How Rovio Angry Birds HTML5 рдиреЗ рд▓рд┐рдЦрд╛"


рд╕реИрди рдлреНрд░рд╛рдВрд╕рд┐рд╕реНрдХреЛ рдореЗрдВ рдЕрдВрддрд┐рдо Google IO рд╕рдореНрдореЗрд▓рди рдореЗрдВ, PlayN рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕рддреНрд░ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ - рдХрд┐рдХ-рдЧрдзрд╛ рдЧреЗрдо рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧред рдФрд░ рдпрд╣ рддрдХрдиреАрдХ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрдХрд░реНрд╖рдХ рд▓рдЧрддреА рд╣реИред рдмрд╕ рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдУрдПрд╕ рдкрд░ рдПрдХ рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЧреЗрдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдЖрдИрдбреАрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ HTML5 / Android / Native / Flash (!) рдХреЗ рддрд╣рдд рдПрдХ рдЧреЗрдо рдорд┐рд▓рддрд╛ рд╣реИред PlayN рд╕реНрд╡рддрдВрддреНрд░ рдФрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рд╣реИ, рдФрд░ рдЗрд╕ рдкрд░ рдПрдВрдЧреНрд░реА рдмрд░реНрдбреНрд╕ (HTML5) рднреА рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рд╡рд╛рдЗрдкрд░ рдЗрдВрдЬрди рдФрд░ PlayN


рдХреБрдЫ рд╣рдлрд╝реНрддреЗ рдкрд╣рд▓реЗ, рдореИрдВрдиреЗ PlayN рдкрд░ рдПрдХ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдЬреЛ рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рд╕реНрддрд░ рдЪреБрдирд╛, рд╡рд╣ рд╣рдореЗрдВ рдЬрд▓реНрджреА рд╕реЗ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЛ рдПрдХ рдРрд╕реА рд░реВрдкрд░реЗрдЦрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ 2 рдбреА рдЧреЗрдо рд▓рд┐рдЦрддреЗ рд╕рдордп рд╕рд╛рдорд╛рдиреНрдп рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░реЗрдЧреАред рдЬреИрд╕реЗ рдХрд╛рд░реНрдп: рдПрдиреАрдореЗрд╢рди, рдХрдг рдкреНрд░рднрд╛рд╡, рдПрдХ рдЧреЗрдо рдХреИрдорд░рд╛, рдПрдХ рдЧреЗрдо рджреГрд╢реНрдп рдФрд░ рджреГрд╢реНрдп рдкрд░рд┐рд╡рд░реНрддрди, рд╕рд░рд▓ рднреМрддрд┐рдХреА, рдЦреЗрд▓ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ред
рдПрдХ рд╣рдлреНрддреЗ рдмрд╛рдж, рд╡рд╛рдЗрдкрд░ рдЗрдВрдЬрди рдХрд╛ рдПрдХ рдЕрд▓реНрдлрд╛ рд╕рдВрд╕реНрдХрд░рдг рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдЬрд┐рд╕рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд╣рдо рдЬрд╛рд╡рд╛ рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдЧреЗрдо рдмрдирд╛рдПрдВрдЧреЗред

рдкрд╛рдХ рдХрд▓рд╛ рдЙрдкрдХрд░рдг


1. PlayN рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, playn рдФрд░ рдЗрд╕рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛рдПрдВ:
PlayN рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛
PlayN рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░реЗрдВ:
PlayN рдХреЛрдб Git рдореЗрдВ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ Git рд╕реНрдерд╛рдкрд┐рдд рд╣реИ:

git clone code.google.com/p/playn

PlayN рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ Maven рд╕рдВрд╕реНрдХрд░рдг 3 рдпрд╛ рдЙрдЪреНрдЪрддрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк рдирд┐рдореНрди рд▓рд┐рдВрдХ рдкрд░ рдорд╛рд╡реЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдорд╛рд╡реЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ред

рдорд╛рд╡реЗрди рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВ:
mvan -V
рдпрд╣ 3 рдФрд░ рдКрдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╣рдо рдорд╛рд╡реЗрди рдХреЗ рд╕реНрдерд╛рдиреАрдп рднрдВрдбрд╛рд░рдг рдореЗрдВ рдкреНрд▓реЗрди рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рджред

рд╕реАрдбреА рдкреНрд▓реЗрди
mvan рд╕рд╛рдл рд╕реНрдерд╛рдкрд┐рдд

PlayN рдХреЗ рдХрд┐рд╕реА рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП:

рд╕реАрдбреА рдкреНрд▓реЗрди / рд╕реИрдВрдкрд▓ / рд╢реЛрдХреЗрд╕
mvan рд╕рд╛рдл рдкреИрдХреЗрдЬ
mvan test -P test-html

рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЦреЛрд▓реЗрдВ (рдмреЗрд╢рдХ Google Chrome) рдФрд░ рджрд░реНрдЬ рдХрд░реЗрдВ: 127.0.0.1:8080/
рдареАрдХ рд╣реИ, рдЖрдк рдЕрдкрдиреЗ рд╕рд╛рдордиреЗ рдЙрд╕ рдбреЗрдореЛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬреЛ Google рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ IO рдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдерд╛ред

mvan test-рдкрд░реАрдХреНрд╖рдг-рдлреНрд▓реИрд╢
рдФрд░ рдЕрдм рдлреНрд▓реИрд╢ред рджрд░реНрдЬ рдХрд░реЗрдВ: рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ: 8080 /

рд╕реАрдбреА рдПрдВрдбреНрд░реЙрдпрдб
mvan android: рдкрд░рд┐рдирд┐рдпреЛрдЬрд┐рдд рдХрд░реЗрдВ
рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдбред

рдФрд░ рдЖрдИрдбреАрдИ рдореЗрдВ рдЕрдкрдирд╛ рдХрд╛рдо рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд▓рд┐рдкреНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред
рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рдорд╛рд╡реЗрди рдПрдХреАрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рдорджрдж рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ тЖТ рдирдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ, рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╕рд╛рдЗрдЯреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдорд╛рд╡реЗрди рд╢рдмреНрдж рдХреА рдЦреЛрдЬ рдХрд░реЗрдВред
рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП Google рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред
рдЧреНрд░рд╣рдг рдХреЗ рд▓рд┐рдП рд╡реЗрдм рдЯреВрд▓ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╕рд╣рд╛рдпрддрд╛ рдЪреБрдиреЗрдВ тЖТ рдирдпрд╛ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ ..., рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВред jboss.org/jbosstools/updates/m2eclipse-wtp, рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ, рдФрд░ WTP рдХреЗ рд▓рд┐рдП рдорд╛рд╡реЗрди рдПрдХреАрдХрд░рдг рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред

2. рдЧреНрд░рд╣рдг рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЦреЗрд▓ рдХрд╛ рдХрдВрдХрд╛рд▓ рдмрдирд╛рдПрдБ

рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ тЖТ рдирдпрд╛ тЖТ рдЕрдиреНрдп ..., рдлрд┐рд░ Maven тЖТ Maven рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЪреБрдиреЗрдВ рдлрд┐рд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рд╕реНрдиреИрдкрд╢реЙрдЯ рдЖрд░реНрдХрд┐рдЯрд╛рдЗрдкреНрд╕ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ рдФрд░ рдЖрд░реНрдХрдЯрд╛рдЗрдкреНрд╕ рдХреА рд╕реВрдЪреА рдореЗрдВ playn-archetype рдкрд░ рдбрдмрд▓-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

Group Id, Artifact Id, Version, Package, рдФрд░ gameName рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВред
рд╕рдореВрд╣ рдЖрдИрдбреА рдЙрджрд╛рд╣рд░рдг: com.mydomain.myprojectред
рд╡рд┐рд░реВрдкрдг рд╕рд╛рдХреНрд╖реНрдп рдЖрдИрдбреА рдЙрджрд╛рд╣рд░рдг: рдЧреЗрдордореЗрдХрд┐рдВрдЧ
рд╕рдВрд╕реНрдХрд░рдг рдЙрджрд╛рд╣рд░рдг: 1.0-SNAPSHOT рдпрд╛ 0.01a
рдкреИрдХреЗрдЬ рдХрд╛ рдЙрджрд╛рд╣рд░рдг: com.mydomain.myproject
рдЦреИрд░, рдЧреЗрдордирд╛рдо рдЙрджрд╛рд╣рд░рдг: рд▓реЛрд▓рдЧреИрдо

рдкреИрдХреЗрдЬ рдПрдХреНрд╕рдкреНрд▓реЛрд░рд░ рдореЗрдВ рдлрд┐рдирд┐рд╢ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ 5 рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
рдЦреИрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦреЗрд▓ рдХрд╛ рдХрдВрдХрд╛рд▓ рд╣реИред
рдПрдХ рдиреЛрдЯ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рд╕рдм рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЦреЗрд▓ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдЬреНрдпрд╛рджрд╛ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред

3. рд╣рдореЗрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рд╡рд╛рдЗрдкрд░ рдЗрдВрдЬрди рдорд┐рд▓рддрд╛ рд╣реИ


рд╡рд╛рдЗрдкрд░ рдбреЗрдореЛ
git рдХреНрд▓реЛрди Partysun@github.com/Partysun/Viper-Engine-Demos.git

рд╕реАрдбреА рд╡рд╛рдЗрдкрд░-рдЗрдВрдЬрди-рдбреЗрдореЛрд╕
mvan рд╕рд╛рдл рд╕реНрдерд╛рдкрд┐рдд
mvan test -P test-html

рдЕрдм рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЧреНрд░рд╣рдг рдореЗрдВ рдЖрдпрд╛рдд рдХрд░реЗрдВред

рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЦреЗрд▓ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ



рд╡рд╛рдЗрдкрд░ рдЗрдВрдЬрди рдкрд░ рдПрдХ рдЧреЗрдо рдореЗрдВ рдПрдХ рдЗрдирдкреБрдЯ рдХреНрд▓рд╛рд╕ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрд┐ рд╡реАрдкрдЧреИрдо рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛред

рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ, рдЧреЗрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдорд╛рди рд╕реЗрдЯ рдХрд░реЗрдВред
public ViperExamples() {
// .
// .
// .
super(640, 480, 800, 800, new LogoDemo(), 33);
}


рд╡рд╛рдЗрдкрд░ рдкрд░ рдЦреЗрд▓ рдХреЗ рджреГрд╢реНрдп рдХреЛ VipState рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдиреЗ () рд╡рд┐рдзрд┐ рдХреЗ рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЕрдзрд┐рднрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ;
рдпрд╣ рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдордВрдЪ рдкрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЦреЗрд▓ рдЪрдХреНрд░реЛрдВ рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдбреЗрдЯ () рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛;

рд╕рдордп рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдФрд░ рдЙрдирдХреЗ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
public class MovingDemo extends VipState{

private VipSprite img;
private VipSprite img2;
private VipKeyboardStandart kListener;

@Override
public void create() {
img = new VipSprite(20, 20, "images/house.png");
add(img);
img.velocity.x = 0.2f;

img2 = new VipSprite(270, 200, "images/house.png");
add(img2);
img2.angularVelocity = 0.002f;

kListener = new VipKeyboardStandart();
addKeybordControl(kListener);
}

@Override
public void update() {
super.update();
if (kListener.ESC) {
VipG.switchState(new LogoDemo());
}
if (img.x > 350)
img.velocity = new VipPoint(0, 0.2f);
if (img.y > 250)
img.velocity = new VipPoint(- 0.2f, 0);
if (img.x < 20)
img.velocity = new VipPoint();

if (img2.scale.x < 2)
img2.scale.x += 0.002f;
if (img2.scale.x > 2)
img2.scale.x = 1.0f;
}
}


рд╕рд╛рд░рд╛рдВрд╢


рддреЛ, рдЕрдВрдд рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдЪрдЯреАрдПрдордПрд▓ 5 / рдлреНрд▓реИрд╢ / рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдЧреЗрдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред
рдирд╣реАрдВ, рдирд╣реАрдВ, рдирд╣реАрдВ! рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЕрдм рддрдХ рдЦрд░рд╛рдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЕрдм рддрдХ, рдХреЗрд╡рд▓ HTML5 рд╣реА рдорд╣рд╛рди рдФрд░ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдпрд╣ рд╡реНрдпрд░реНрде рдирд╣реАрдВ рдерд╛ рдХрд┐ рдЖрдИрдУ рдФрд░ рдПрдВрдЧреНрд░реА рдмрд░реНрдбреНрд╕ рдиреЗ рдЗрддрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ред рдпрд╣ рдЕрдЪреНрдЫреА рдЦрдмрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЬрд╛рд╡рд╛ рдореЗрдВ html5 рдЧреЗрдо рд▓рд┐рдЦрдирд╛ рдореЗрд░реЗ рд▓рд┐рдП js рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╣реАрдВ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЕрдм рддрдХ, рдХреЗрд╡рд▓ рднрд╡рд┐рд╖реНрдп рдХреЗ рдЕрд╡рд╕рд░реЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реА рд╕реБрдЦрджрд╛рдпрдХ рд╣реИред рдФрд░ рдпрд╣ рдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ Google рдФрд░ рд╡рд╛рдЗрдкрд░ рдЗрдВрдЬрди (@Partysun) рд╕реЗ PlayN рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдПрдХ рд╕рд╛рде рдХрд╛рдо рдХрд░рдХреЗ рдорд╣рд╕реВрд╕ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

Source: https://habr.com/ru/post/In129735/


All Articles