рдпрд╣ рдореЗрд░реЗ рдЖрдЦрд┐рд░реА рд▓реЗрдЦ рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, "
CraftyJS рдкрд░ рдПрдХ html5 рдорд┐рдиреА-рдПрдХреНрд╢рди рдЧреЗрдо рдмрдирд╛рдирд╛ ред" рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, рдЕрдм рдХрд┐рд╕реА рднреА html5 рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдореЛрдмрд╛рдЗрд▓ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЕрд╡рд╕рд░ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдХреНрдпреЛрдВ рди рджреЗрдВ?

рдиреАрдЪреЗ, рдпрд╣ рдХреНрдпрд╛ рдЖрдпрд╛ред рд╣рдордиреЗ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЛ рдзреНрдпрд╛рди рд╕реЗ рдкрдврд╝рд╛!
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
- PhoneGap рдФрд░ рдЗрд╕рдХрд╛ рд╡рд╛рддрд╛рд╡рд░рдг ( рд╕реНрдерд╛рдкрдирд╛ рдирд┐рд░реНрджреЗрд╢ )
- рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛
- рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рд╣реЛрдирд╛ рдЕрддрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реИ
рдХрд╛рд░реНрдп
рдЖрдкрдХреЛ рдЧреЗрдо рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдкрд░ рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рдФрд░ рдирд┐рдпрдВрддреНрд░рдг рдкрд░ рдПрдХ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд┐рд╖реНрдХрд░реНрд╖ рдмрдирд╛рдПрдВред
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддреИрдпрд╛рд░реА
рд╢реБрд░реБрдЖрдд рд╕реЗ, рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдХреА рдЖрд▓реЛрдЪрдирд╛ рд╕реБрдирдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ index.html рд╕реЗ js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдХреЙрд▓ рдирд┐рдХрд╛рд▓реЗ, рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ
рдЕрдкреЗрдХреНрд╖рд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рддреБрд░рдВрдд phonegap.js рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓ рджрд┐рдпрд╛, рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдм рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
/index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <script type="text/javascript" src="js/require.js"></script> <script type="text/javascript" src="js/phonegap.js"></script> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/crafty.js"></script> <script type="text/javascript" src="js/game.js"></script> <link rel="stylesheet" href="css/game.css" type="text/css" media="screen" charset="utf-8"> <title>Simpe RPG</title> </head> <body> <div id="cr-stage"></div> <div id="sidebar"> <div id="level"> Level: <span>1</span> </div> <div id="score"> Score: <span>0</span> </div> </div> </body> </html>
/css/game.css
body, html { margin:0; padding: 0; overflow:hidden; font-family:Arial; font-size:20px; background-color: #000; } #cr-stage { color:white; float:left; } #sidebar { top: 0; left: 0; width: 150px; height: 100px; position: absolute; color:white;} #sidebar div { margin: 10px 5px; text-align: center; }
/js/game.js
var Settings = { width: 480,
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рдореЛрдмрд╛рдЗрд▓ рдлреЛрди рдХреЗ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕реЗ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рднреА рдмрджрд▓ рджреА рд╣реИред
accelerometer
рдЕрдм рдирд┐рдпрдВрддреНрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рдмрджрд▓реЗрдВрдЧреЗ /js/objects/player.js, FourwayAccel рдХреЗ рд╕рд╛рде рдлреЛрд░рд╡реЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЗрд╕ .fourway (1) рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдпрд╣ рдмрд╣реБрдд рд╣реА рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:
Crafty.c("FourwayAccel", { _speed: 3, _touch_element: null, init: function() { this._movement= { x: 0, y: 0}; this.accels = {}; this.accels['left'] = false; this.accels['right'] = false; this.accels['top'] = false; this.accels['bottom'] = false; }, fourway_accel: function(speed) { var self = this; self._speed = speed; self.bind('Acceleration', function(acceleration) { if (acceleration.y < -2) this.start_or_stop_move('left'); if (acceleration.y > 2) this.start_or_stop_move('right'); if (acceleration.x < -2) this.start_or_stop_move('top'); if (acceleration.x > 2) this.start_or_stop_move('bottom'); }); self.bind("EnterFrame",function() { if (self.disableControls) return; if(self._movement.x !== 0) { self.x += self._movement.x; self.trigger('Moved', {x: self.x - self._movement.x, y: self.y}); } if(self._movement.y !== 0) { self.y += self._movement.y; self.trigger('Moved', {x: self.x, y: self.y - self._movement.y}); } }); return self; }, start_or_stop_move: function(move_type) { var move_speed = this.get_speed(move_type); if (this.accels[move_type]) {
Fourway_accel рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо "рддреНрд╡рд░рдг" рдШрдЯрдирд╛ рдХреЛ рд╕реБрдирдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдмрдирд╛рдПрдВрдЧреЗред рдпрд╣ рдШрдЯрдирд╛ рд╣рдореЗрдВ рдврд▓рд╛рди (x, y, z) рдкрд░ рдбреЗрдЯрд╛ рджреЗрддреА рд╣реИред рд╣рдо рдХреЗрд╡рд▓ x рдФрд░ y рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдмрдбрд╝реА рдЭреБрдХрд╛рд╡, -2 рд╕реЗ рдХрдо рдпрд╛ 2 рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реВрдВред
рдЬреИрд╕реЗ рд╣реА рдврд▓рд╛рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд┐рдЧреНрд░реА рддрдХ рдкрд╣реБрдБрдЪрддрд╛ рд╣реИ, start_or_stop_move рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдврд▓рд╛рди рдХреА рджрд┐рд╢рд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди, рдЧрддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ "EnterFrame" рдЗрд╡реЗрдВрдЯ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ "рдПрдХреНрд╕реЗрд▓реЗрд░реЗрд╢рди" рдИрд╡реЗрдВрдЯ рдЬреЗрдирд░реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб /js/game.js рдкрд░ рдЬреЛрдбрд╝реЗрдВ:
var watchID = null; function stopWatch() { if (watchID) { navigator.accelerometer.clearWatch(watchID); watchID = null; } } function startWatch() { var options = { frequency: 200 }; watchID = navigator.accelerometer.watchAcceleration(onSuccess, onError, options);
рдлреЛрдирдЧреИрдк рдореЗрдВ рдПрдХреНрд╕реЗрд▓реЗрд░реЛрдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП,
рджрд╕реНрддрд╛рд╡реЗрдЬ рджреЗрдЦреЗрдВред
рдЕрдм, рд╣рдореЗрдВ start.atch () рдХреЛ /js/scenes/main.js рджреГрд╢реНрдп рдореЗрдВ, рдФрд░ рд╕рд╛рде рд╣реА stop.atch () win.js рдореЗрдВ рдФрд░ рд╣рд╛рд░ рдХреЗред Js рджреГрд╢реНрдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдлреЛрди рдкрд░ рдбрд╛рдпрд░реЗрдХреНрдЯ рд▓реЙрдиреНрдЪ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╡рд╣ рд╕рдм рдХреБрдЫ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдЬреЛ
рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЖрдкрдХреЛ AndroidManifest.xml рдХреЛ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рдХрд░ рдереЛрдбрд╝рд╛ рд╕рд╛ рдореЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛: Android: screenOrientation = "рд▓реИрдВрдбрд╕реНрдХреЗрдк" рдЧрддрд┐рд╡рд┐рдзрд┐ рдЕрдиреБрднрд╛рдЧ рдореЗрдВред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╕реНрдХреНрд░реАрди рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рд╣рдореЗрд╢рд╛ рд▓реИрдВрдбрд╕реНрдХреЗрдк рд╣реЛред
рд╣рдордиреЗ рдЗрд╕ рдлреЙрд░реНрдо рдореЗрдВ AndroidrpgActivity.java рдбрд╛рд▓рд╛:
package com.phonegap.simplerpg; import android.os.Bundle; import android.view.WindowManager; import com.phonegap.*; public class AndroidrpgActivity extends DroidGap { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); super.loadUrl("file:///android_asset/www/index.html"); } }
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЪрд░ FLAG_FULLSCREEN рдЕрдкрдиреЗ рд▓рд┐рдП рдмреЛрд▓рддрд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖
рдпрд╣рд╛рдБ рдореИрдВ (рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ) рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ:

рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рдЕрд░реЗ рд╣рд╛рдБ! рдХреНрдпрд╛ рдореИрдВ рд╕рдВрддреБрд╖реНрдЯ рд╣реВрдВ? рдЕрд░реЗ рдирд╣реАрдВ!
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдореИрдВ рдШреБрдорд╛рд╡рджрд╛рд░ рд╣реВрдВ, рдореИрдВ рд╕реНрдХреА рдХреА рд╕рд╡рд╛рд░реА рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЖрд╡реЗрджрди рдмреЗрд╣рдж рдзреАрдорд╛ рдирд┐рдХрд▓рд╛ред рдкрд░рд┐рдгрд╛рдо рдПрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЯрд░реНрди-рдЖрдзрд╛рд░рд┐рдд рд░рдгрдиреАрддрд┐ рдХреА рддрд░рд╣ рд╣реИред рдФрд░ рдпрд╣рд╛рдБ рдмрд┐рдВрджреБ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ, рдЕрднреА рднреА рд╕реНрдХреАрдЗрдВрдЧ рд╣реИ, рдЬрд╡рд╛рдм рд╢рд╛рдпрдж рд╕реНрдкрд╖реНрдЯ рд╣реИред PhoneGap, tumblr рдкрд╛рдардХреЛрдВ рдФрд░ рдЕрдиреНрдп рд╕рдорд╛рдЪрд╛рд░ рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рд▓реЗрдХрд┐рди рдЦрд┐рд▓реМрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдЬрд╛рд╡рд╛ рдХреЗ рд▓рд┐рдП рджреЗрд╢реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
GitHub рдкрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рд╕реНрд░реЛрддред