рдХреИрдирд╡рд╛рд╕ рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреЗрдо рдмрдирд╛рдПрдВ

рд╡реЗрдм рдЕрдм рд╣рд░ рдЬрдЧрд╣ рд╣реИ рдФрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╡рд╛рддрд╛рд╡рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рд▓реВрдк рдХреЗ рдмрдЬрд╛рдп: рдХреЛрдб рд▓рд┐рдЦрдирд╛ тЖТ рд╕рдВрдХрд▓рди тЖТ рд╢реБрд░реВ рдХрд░рдирд╛, рдмрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ рдпрд╛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдХреЛрдб "рд▓рд╛рдЗрд╡" рднреА рд▓рд┐рдЦреЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рднрд╛рд░реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреЛ рд╡рд┐рддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рджрд░реНрдж рд░рд╣рд┐рдд рд╣реИред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдЦреЗрд▓ рд╡рд┐рдХрд╛рд╕ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдмрди рдЧрдпрд╛ рд╣реИред
рдХреИрдирд╡рд╛рд╕ рддрддреНрд╡ рдПрдЪрдЯреАрдПрдордПрд▓ 5 рдХреЗ рд╕рд╛рде рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдПрдкреАрдЖрдИ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ рдХрднреА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрджрдд рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧреЗрдЧрд╛ред рдХреИрдирд╡рд╕ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЬреЛ рд╡реЗрдм рдХреЛ рдЧреЗрдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдордВрдЪ рдмрдирд╛рддрд╛ рд╣реИред
рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд░рд▓ рд╣реИ: рдПрдХ рдЯреИрдЧ рдмрдирд╛рдПрдВ, рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ, рдФрд░ рдлрд╝реЙрд░реНрдо рдФрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдВрджрд░реНрдн рдкрд░ fillRect рдФрд░ drawImage рдЬреИрд╕реА рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдкреАрдЖрдИ рдореЗрдВ рдХрдИ рддрд░рд╣ рдХреЗ рд░рд╛рд╕реНрддреЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ, рдЫрд╡рд┐ рд░реВрдкрд╛рдВрддрд░рдг, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЧреЗрдо рдмрдирд╛рдПрдВрдЧреЗ; рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕, рдЯреНрд░реИрдХрд┐рдВрдЧ рдЯрдХрд░рд╛рд╡ рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреЗ рд╕рд╛рде рдЕрд╕рд▓реА рдЦреЗрд▓ред рдмрд┐рдирд╛ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреЗ рдХреНрдпрд╛ рдЦреЗрд▓!
рдФрд░ рдпрд╣рд╛рдВ рд╡рд╣ рдЦреЗрд▓ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ - рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП ред

рддреИрдпрд╛рд░ рд╣реЛ рд░рд╣реА рд╣реИ


рдЦреЗрд▓ рдЬрдЯрд┐рд▓ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рд╕рднреА рдХрдИ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрддрд╛ рд╣реИред рдореИрдВ рд╣рдореЗрд╢рд╛ рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрдЪрдВрднрд┐рдд рдерд╛ рдХрд┐ рдЖрдк рдХреИрдирд╡рд╕, рдорд▓реНрдЯреАрдкрд▓ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕, рдЯрдХрд░рд╛рд╡ рдЯреНрд░реИрдХрд┐рдВрдЧ рдФрд░ рдЧреЗрдо рд▓реВрдк рдХреЗ рд╕рд╛рде рдХрд┐рддрдиреА рджреВрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЦреЗрд▓ рдХреЗ рдШрдЯрдХреЛрдВ рдкрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЛрдб рдФрд░ рдПрдкреАрдЖрдИ рдХреА рд╣рд░ рдкрдВрдХреНрддрд┐ рдХреЛ рдирд╣реАрдВ рдЪрдмрд╛рдКрдВрдЧрд╛ред рдпрд╣ рд▓реЗрдЦ рдПрдХ рдЙрдиреНрдирдд рд╕реНрддрд░ рдкрд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рднреА рд╕реНрддрд░реЛрдВ рдХреЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрдПрдЧрд╛ред рдпрд╣ рдЖрд▓реЗрдЦ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдФрд░ HTML рдХреА рдореВрд▓ рдмрд╛рддреЛрдВ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рд╣рдо рдХреИрдирд╡рд╛рд╕ рдПрдкреАрдЖрдИ рдФрд░ рдЧреЗрдо рд▓реВрдк рдЬреИрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рдЧреЗрдо рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рднреА рд╕реНрдкрд░реНрд╢ рдХрд░реЗрдВрдЧреЗред

рдХреИрдирд╡рд╕ рдмрдирд╛рдПрдБ


рдЖрдЗрдП рдХреЛрдб рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВред рдЕрдзрд┐рдХрд╛рдВрд╢ рдЦреЗрд▓ app.js. рдореЗрдВ рд╣реИ
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдЯреИрдЧ рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЬреЗрдПрд╕ рдореЗрдВ рд╕рдм рдХреБрдЫ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк HTML рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ getElementById рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рдореЗрдВ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рд╡рд░реАрдпрддрд╛ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред
// Create the canvas var canvas = document.createElement("canvas"); var ctx = canvas.getContext("2d"); canvas.width = 512; canvas.height = 480; document.body.appendChild(canvas); 

рдХреИрдирд╡рд╕ рдореЗрдВ рдПрдХ рдЧреЗрдЯрдХреЛрдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдВрджрд░реНрдн рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рдЬрд┐рд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЖрдк рдХреИрдирд╡рд╛рд╕ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк 3D рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП WebGL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк 'рд╡реЗрдмрд▓реЙрдЧ' рдкреИрд░рд╛рдореАрдЯрд░ рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЧреЗ рд╣рдо рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ctx рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдЦреЗрд▓ рдЪрдХреНрд░


рд╣рдореЗрдВ рдПрдХ рдЧреЗрдо рдЪрдХреНрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рд▓рдЧрд╛рддрд╛рд░ рдЧреЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ :
 // The main game loop var lastTime; function main() { var now = Date.now(); var dt = (now - lastTime) / 1000.0; update(dt); render(); lastTime = now; requestAnimFrame(main); }; 

рд╣рдо рджреГрд╢реНрдпреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдЧрд▓реЗ рд▓реВрдк рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП requestAnimationFrame рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред 60 рдлреНрд░реЗрдо / рд╕реЗрдХрдВрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ (рдореБрдЦреНрдп, 1000/60) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛ред App.js рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣рдордиреЗ requestAnimationFrame рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рдмрдирд╛рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рд╕реЗрдЯрдЯрд╛рдЗрдордЖрдЙрдЯ (рдореБрдЦреНрдп, 1000/60) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдо рд╕рдЯреАрдХ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЪрдХреНрд░ рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИред
рдЕрджреНрдпрддрди рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ dt рдХрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдФрд░ рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рдХреЗ рд╕рдордп рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╣реИред рдлрд╝реНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреГрд╢реНрдп рдХреЛ рдХрднреА рднреА рддрд╛рдЬрд╝рд╛ рди рдХрд░реЗрдВ (рдЖрддреНрдорд╛ рдореЗрдВ, x + = 5)ред рдЖрдкрдХрд╛ рдЧреЗрдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ / рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдлреНрд░реЗрдо рджрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ рджреГрд╢реНрдп рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рдЕрдВрддрд┐рдо рдЕрджреНрдпрддрди рдХреЗ рдмрд╛рдж рдХреЗ рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рдХреЗ рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рд╕рднреА рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЖрдВрджреЛрд▓рди рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд x + = 50 * dt, рдпрд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 50 рдкрд┐рдХреНрд╕реЗрд▓ рдмрди рдЬрд╛рддрд╛ рд╣реИред

рд╕рдВрд╕рд╛рдзрди рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдЧреЗрдо рд▓реЙрдиреНрдЪ


рдХреЛрдб рдХрд╛ рдЕрдЧрд▓рд╛ рднрд╛рдЧ рдЦреЗрд▓ рдХреЛ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрд▓рдЧ-рдЕрд▓рдЧ рд▓рд┐рдЦрд┐рдд рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, resource.js ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдШрдЯрдирд╛ рдХреЛ рдЙрдард╛рддрд╛ рд╣реИ рдЬрдм рд╡реЗ рд╕рднреА рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВред
рдЦреЗрд▓ рдореЗрдВ рдЪрд┐рддреНрд░, рджреГрд╢реНрдп рдбреЗрдЯрд╛ рдФрд░ рдЕрдзрд┐рдХ рдЬреИрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрд╕рд╛рдзрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВред 2 рдбреА рдЧреЗрдо рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рд╕рдВрд╕рд╛рдзрди рдЫрд╡рд┐рдпрд╛рдВ рд╣реИрдВред рддреБрд░рдВрдд рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЖрдкрдХреЛ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЬрдм рдЖрдкрдХреЛ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ:
 var img = new Image(); img.onload = function() { startGame(); }; img.src = url; 

рдпрд╣ рдмрд╣реБрдд рдердХрд╛рдК рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рд╕рд╛рд░реА рдЫрд╡рд┐рдпрд╛рдВ рди рд╣реЛрдВред рдЖрдкрдХреЛ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдореИрдВрдиреЗ рдпрд╣ рд╕рдм рдЕрдкрдиреЗ рдЖрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд╕рд╛рдзрди рд▓реЛрдбрд░ рд▓рд┐рдЦрд╛:
 (function() { var resourceCache = {}; var loading = []; var readyCallbacks = []; // Load an image url or an array of image urls function load(urlOrArr) { if(urlOrArr instanceof Array) { urlOrArr.forEach(function(url) { _load(url); }); } else { _load(urlOrArr); } } function _load(url) { if(resourceCache[url]) { return resourceCache[url]; } else { var img = new Image(); img.onload = function() { resourceCache[url] = img; if(isReady()) { readyCallbacks.forEach(function(func) { func(); }); } }; resourceCache[url] = false; img.src = url; } } function get(url) { return resourceCache[url]; } function isReady() { var ready = true; for(var k in resourceCache) { if(resourceCache.hasOwnProperty(k) && !resourceCache[k]) { ready = false; } } return ready; } function onReady(func) { readyCallbacks.push(func); } window.resources = { load: load, get: get, onReady: onReady, isReady: isReady }; })(); 

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдЖрдк рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП resource.load рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рд╕рднреА рдбреЗрдЯрд╛ рдХреЗ рд▓реЛрдб рдЗрд╡реЗрдВрдЯ рдкрд░ рдХреЙрд▓рдмреИрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП resource.onReady рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред resource.load рдХрд╛ рдЙрдкрдпреЛрдЧ рдЦреЗрд▓ рдореЗрдВ рдмрд╛рдж рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд▓реЙрдиреНрдЪ рдХреЗ рд╕рдордп
рдЕрдкрд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпрд╛рдБ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдХреИрд╢ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рдФрд░ рдЬрдм рд╕рднреА рдЪрд┐рддреНрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╕рднреА рдХреЙрд▓рдмреИрдХ рдХрд╣рд▓рд╛рдПрдВрдЧреЗред рдЕрдм рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
 resources.load([ 'img/sprites.png', 'img/terrain.png' ]); resources.onReady(init); 

рд╕рдВрд╕рд╛рдзрди.рдЧреЗрдЯ ('img / sprites.png) рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдореЗрдЬ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрд░рд╛рдо рд╕реЗ!
рдЖрдк рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓ рдХреЛ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рднрд╛рд╡рдирд╛ рдореЗрдВ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЬреЗрдПрд╕ред
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдореЗрдВ, рдЬрдм рд╕рднреА рдЪрд┐рддреНрд░ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ init рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред Init рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдЗрдореЗрдЬ рдмрдирд╛рдПрдЧрд╛, "рдлрд┐рд░ рд╕реЗ рдкреНрд▓реЗ рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдИрд╡реЗрдВрдЯреНрд╕ рд╣реИрдВрдЧ рдХрд░реЗрдВ, рдЧреЗрдо рд░реАрд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рдЧреЗрдо рд╢реБрд░реВ рдХрд░реЗрдВред
 function init() { terrainPattern = ctx.createPattern(resources.get('img/terrain.png'), 'repeat'); document.getElementById('play-again').addEventListener('click', function() { reset(); }); reset(); lastTime = Date.now(); main(); } 


рдЦреЗрд▓ рд░рд╛рдЬреНрдп


рдЕрдм рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ! рдЪрд▓реЛ рдХреБрдЫ рдЧреЗрдо рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВред рд╣рд░ рдЦреЗрд▓ рдХреЗ рдореВрд▓ рдореЗрдВ рдПрдХ "рдЦреЗрд▓ рд░рд╛рдЬреНрдп" рд╣реИред рдпреЗ рдбреЗрдЯрд╛ рд╣реИрдВ рдЬреЛ рдЦреЗрд▓ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВ: рдирдХреНрд╢реЗ рдкрд░ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА, рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдФрд░ рдЕрдиреНрдп рдбреЗрдЯрд╛; рд╡рд░реНрддрдорд╛рди рдЕрдВрдХ, рдФрд░ рдЕрдзрд┐рдХред
рдиреАрдЪреЗ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИ:
 // Game state var player = { pos: [0, 0], sprite: new Sprite('img/sprites.png', [0, 0], [39, 39], 16, [0, 1]) }; var bullets = []; var enemies = []; var explosions = []; var lastFire = Date.now(); var gameTime = 0; var isGameOver; var terrainPattern; // The score var score = 0; var scoreEl = document.getElementById('score'); 

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

рд╕рдВрд╕реНрдерд╛рдУрдВ рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕



рддрдереНрдп

рдПрдХ рдЗрдХрд╛рдИ рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЬрд╣рд╛рдЬ, рдмреБрд▓реЗрдЯ рдпрд╛ рд╡рд┐рд╕реНрдлреЛрдЯ рд╕рднреА рд╕рдВрд╕реНрдерд╛рдПрдВ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред
рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдВрдЯрд┐рдЯреАрдЬ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдпрд╣ рдПрдХ рдХрд╛рдлреА рд╕рд░рд▓ рдкреНрд░рдгрд╛рд▓реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреА рдЗрдХрд╛рдИ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдореЙрдирд┐рдЯрд░ рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реА рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╕реНрдерд╛ рдХреЗ рдкрд╛рд╕ рдкреЙрдЬрд╝ рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ, рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдиреНрдп рдХреА рд╕рдВрдкрддреНрддрд┐ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдХрд┐рд╕реА рд╢рддреНрд░реБ рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:
 enemies.push({ pos: [100, 50], sprite: new Sprite(/* sprite parameters */) }); 

рдпрд╣ рдХреЛрдб рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдерд┐рддрд┐ x = 100, y = 50 рдкрд░ рджреБрд╢реНрдорди рдХреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

рд╕реНрдкреНрд░рд┐рдЯ рдФрд░ рдПрдирд┐рдореЗрд╢рди

рд╕реНрдкреНрд░рд╛рдЗрдЯ рдПрдХ рдЫрд╡рд┐ рд╣реИ рдЬреЛ рдПрдХ рдЗрдХрд╛рдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд┐рдирд╛, рд╕реНрдкреНрд░рд╛рдЗрдЯ ctx.drawImage рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдирд┐рдпрдорд┐рдд рдЫрд╡рд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред
рд╣рдо рдХрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдХреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдордп рдХреЗ рд╕рд╛рде рдмрджрд▓рдХрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдлреНрд░реЗрдо рдПрдиреАрдореЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЫрд╡рд┐
рдпрджрд┐ рд╣рдо рдЗрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдВрддрд┐рдо рддрдХ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
рдЫрд╡рд┐
рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рдВрдкрд╛рджрди рдФрд░ рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдорддреМрд░ рдкрд░ рд╕рдм рдХреБрдЫ рдПрдХ рдкрд░ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХрд╛рд░реНрдб рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╕реАрдПрд╕рдПрд╕ рддрдХрдиреАрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╛рд░рджрд░реНрд╢реА рдирдХреНрд╢рд╛ рд╣реИ (рдкрд╛рд░рджрд░реНрд╢реА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рд╛рде):
рдЫрд╡рд┐
рд╣рдо рд╣рд╛рд░реНрдб рд╡реИрдХреНрдпреВрдо рдЗрдореЗрдЬ рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕реЗрдЯ bmp рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЕрдкрдиреА рдЬрд╝рд░реВрд░рдд рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдИ рдФрд░ рдПрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╢реАрдЯ рд╕реЗ рдЪрд┐рдкрдХрд╛рдпрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЧреНрд░рд╛рдлрд┐рдХ рдПрдбрд┐рдЯрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рднреА рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджреВрд╕рд░реЗ рд╣реЗрд▓реНрдкрд░ рдХреНрд▓рд╛рд╕ - рд╕реНрдкреНрд░рд╛рдЗрдЯ.рдЬреЗрдПрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдПрдХ рдЫреЛрдЯреА рдлрд╛рдЗрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдПрдиреАрдореЗрд╢рди рд▓реЙрдЬрд┐рдХ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ:
 function Sprite(url, pos, size, speed, frames, dir, once) { this.pos = pos; this.size = size; this.speed = typeof speed === 'number' ? speed : 0; this.frames = frames; this._index = 0; this.url = url; this.dir = dir || 'horizontal'; this.once = once; }; 

рдпрд╣ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рддрд░реНрдХ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рд╕рднреА рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдлрд╝реНрд░реЗрдо рддрд░реНрдХ рдХреЛ рд╢рд╛рдпрдж рдЖрдЧреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕рдордЭрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рднреА рдлреНрд░реЗрдо рдПрдХ рд╣реА рдЖрдХрд╛рд░ рдХреЗ рд╣реИрдВ (рдпрд╣ рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдХрд╛рд░ рд╣реИ)ред рдПрдиреАрдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди, рд╕рд┐рд╕реНрдЯрдо рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдореИрдк рдХреЗ рд╕рд╛рде рдХреНрд╖реИрддрд┐рдЬ рдпрд╛ рд▓рдВрдмрд╡рдд (dir рдорд╛рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░) рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде x рдпрд╛ y рдЕрдХреНрд╖ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╡реЗрддрди рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝реНрд░реЗрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рдлрд╝реНрд░реЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреИрд╕реЗ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред [0, 1, 2, 3, 2, 1] рдХрд╛ рдорд╛рди рдкреНрд░рд╛рд░рдВрдн рд╕реЗ рдЕрдВрдд рддрдХ рдФрд░ рдкреАрдЫреЗ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдЧрд╛ред
рдХреЗрд╡рд▓ url, pos, size рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рд╣реИ, рдФрд░ рдЗрд╕рдХрд╛ рддрд░реНрдХ рдПрдХ рдбреЗрд▓реНрдЯрд╛ рд╕рдордп рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдорд╛рд░реЗ рд╡реИрд╢реНрд╡рд┐рдХ рдЕрдкрдбреЗрдЯ рдореЗрдВ рднреА рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
 Sprite.prototype.update = function(dt) { this._index += this.speed*dt; } 

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рдЦреБрдж рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рднреА рд╣реИред рдЗрд╕рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдореВрд▓ рддрд░реНрдХ рд╣реИред рдпрд╣ рдореЙрдирд┐рдЯрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдлреНрд░реЗрдо рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕реНрдкреНрд░рд╛рдЗрдЯ рдореИрдк рдкрд░ рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдлреНрд░реЗрдо рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП ctx.drawImage рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
 Sprite.prototype.render = function(ctx) { var frame; if(this.speed > 0) { var max = this.frames.length; var idx = Math.floor(this._index); frame = this.frames[idx % max]; if(this.once && idx >= max) { this.done = true; return; } } else { frame = 0; } var x = this.pos[0]; var y = this.pos[1]; if(this.dir == 'vertical') { y += frame * this.size[1]; } else { x += frame * this.size[0]; } ctx.drawImage(resources.get(this.url), x, y, this.size[0], this.size[1], 0, 0, this.size[0], this.size[1]); } 

рд╣рдо рдбреНрд░рд╛рдЗрдореЗрдЬ рдХреЗ 3 рд░реВрдкреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рд╕реНрдкреНрд░рд╛рдЗрдЯ, рдСрдлрд╕реЗрдЯ рдФрд░ рджрд┐рд╢рд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рджреГрд╢реНрдп рдЕрджреНрдпрддрди


рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ рд╣рдорд╛рд░реЗ рдЧреЗрдо рд▓реВрдк рдореЗрдВ рд╣рдордиреЗ рд╣рд░ рдлреНрд░реЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ (рдбреАрдЯреА) рдХрд╣рд╛ рд╣реИ? рд╣рдореЗрдВ рдЕрдм рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рд╕рднреА рд╕реНрдкреНрд░рд╛рдЗрдЯреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ, рдЗрдХрд╛рдИ рдкрджреЛрдВ рдФрд░ рдЯрдХрд░рд╛рд╡реЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
 unction update(dt) { gameTime += dt; handleInput(dt); updateEntities(dt); // It gets harder over time by adding enemies using this // equation: 1-.993^gameTime if(Math.random() < 1 - Math.pow(.993, gameTime)) { enemies.push({ pos: [canvas.width, Math.random() * (canvas.height - 39)], sprite: new Sprite('img/sprites.png', [0, 78], [80, 39], 6, [0, 1, 2, 3, 2, 1]) }); } checkCollisions(); scoreEl.innerHTML = score; }; 

рд╣рдо рдирдХреНрд╢реЗ рдореЗрдВ рджреБрд╢реНрдордиреЛрдВ рдХреЛ рдХреИрд╕реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рд╣рдо рдПрдХ рджреБрд╢реНрдорди рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди рд╕реЗрдЯ рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рджрд╛рдИрдВ рдУрд░ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рджреГрд╖реНрдЯрд┐ рд╕реЗ рдмрд╛рд╣рд░ред рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд╛рдирдЪрд┐рддреНрд░ рдХреА рдКрдВрдЪрд╛рдИ рдФрд░ рджреБрд╢реНрдорди рдХреА рдКрдВрдЪрд╛рдИ рдХреЗ рдЕрдВрддрд░ рд╕реЗ рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд╢реНрдорди рдХреА рдЫрд╡рд┐ рдХреА рдКрдВрдЪрд╛рдИ "рд╣рд╛рд░реНрдбрдХреЛрдб" рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕рдХреА рдКрдВрдЪрд╛рдИ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдереНрд░реЗрд╕рд╣реЛрд▓реНрдб рд╣рд░ рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди 1 - Math.pow(.993, gameTime) рджреНрд╡рд╛рд░рд╛ рдЙрдард╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕

рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдПрдХ рдФрд░ рдЫреЛрдЯрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдпрд╛: input.js ред рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЫреЛрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬреЛ рдмрд╕ рдХреАрдк рдФрд░ рдХреАрдбрд╛рдЙрди рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдкреНрд░реЗрд╕ рдХреА рдЧрдИ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИред
рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдПрдХ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ - input.isDownред рдЬреЛ рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рддрд░реНрдХ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ 'рдП', рдФрд░ рдЕрдЧрд░ рд╡рд╣ рдХреБрдВрдЬреА рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рд╕рдЪ рд╣реЛрддрд╛ рд╣реИред рдЖрдк рдирд┐рдореНрди рдорд╛рди рднреА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЕрдм рд╣рдо рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ:
 function handleInput(dt) { if(input.isDown('DOWN') || input.isDown('s')) { player.pos[1] += playerSpeed * dt; } if(input.isDown('UP') || input.isDown('w')) { player.pos[1] -= playerSpeed * dt; } if(input.isDown('LEFT') || input.isDown('a')) { player.pos[0] -= playerSpeed * dt; } if(input.isDown('RIGHT') || input.isDown('d')) { player.pos[0] += playerSpeed * dt; } if(input.isDown('SPACE') && !isGameOver && Date.now() - lastFire > 100) { var x = player.pos[0] + player.sprite.size[0] / 2; var y = player.pos[1] + player.sprite.size[1] / 2; bullets.push({ pos: [x, y], dir: 'forward', sprite: new Sprite('img/sprites.png', [0, 39], [18, 8]) }); bullets.push({ pos: [x, y], dir: 'up', sprite: new Sprite('img/sprites.png', [0, 50], [9, 5]) }); bullets.push({ pos: [x, y], dir: 'down', sprite: new Sprite('img/sprites.png', [0, 60], [9, 5]) }); lastFire = Date.now(); } } 

рдпрджрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА s рдпрд╛ рдбрд╛рдЙрди рдПрд░реЛ рджрдмрд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдСрд░реНрдбрд┐рдиреЗрдЯ рдХрд░рддреЗ рд╣реИрдВред рдХреИрдирд╡рд╛рд╕ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0,0) рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдмрдврд╝рдиреЗ рд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐ рдХрдо рд╣реЛ рдЬрд╛рдПрдЧреАред рд╣рдордиреЗ рдмрд╛рдХреА рд╕рднреА рдЪрд╛рдмрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдпрд╣реА рдХрд┐рдпрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдордиреЗ app.js. рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдЧрддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
 // Speed in pixels per second var playerSpeed = 200; var bulletSpeed = 500; var enemySpeed = 100; 

рдбреАрдЯреАрдПрдЪ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕рд╛рде рдкреНрд▓реЗрдпрд░рд╕реНрдкреАрдб рдХреЛ рдЧреБрдгрд╛ рдХрд░рдирд╛, рд╣рдо рдлреНрд░реЗрдо рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдордиреЗ рдХреЗ рд▓рд┐рдП рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдпреЛрдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рдПрдХ рд╕реЗрдХрдВрдб рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рддреЛ рдЦрд┐рд▓рд╛рдбрд╝реА 200 рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛, рдЕрдЧрд░ 0.5 рд╕реЗ 100 рддрдХред рдпрд╣ рдлреНрд░реЗрдо рджрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдВрджреЛрд▓рди рдХреА рдирд┐рд░рдВрддрд░ рдЧрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рдПрдХ рдмреБрд▓реЗрдЯ рд╢реЙрдЯ рд╣реИ, рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд: рдПрдХ рд╕реНрдерд╛рди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдпрд╣ рдЖрдЦрд┐рд░реА рд╢реЙрдЯ рд╕реЗ 100 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╣реБрдЖред lastFire рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рд╣реИ рдФрд░ рдЦреЗрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рд╢реЙрдЯреНрд╕ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╣рд░ рдлреНрд░реЗрдо рдХреЛ рд╢реВрдЯ рдХрд░ рд╕рдХрддрд╛ рдерд╛ред рдФрд░ рдпрд╣ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ, рд╣реИ рдирд╛?!
 var x = player.pos[0] + player.sprite.size[0] / 2; var y = player.pos[1] + player.sprite.size[1] / 2; bullets.push({ pos: [x, y], dir: 'forward', sprite: new Sprite('img/sprites.png', [0, 39], [18, 8]) }); bullets.push({ pos: [x, y], dir: 'up', sprite: new Sprite('img/sprites.png', [0, 50], [9, 5]) }); bullets.push({ pos: [x, y], dir: 'down', sprite: new Sprite('img/sprites.png', [0, 60], [9, 5]) }); lastFire = Date.now(); 

рд╣рдо x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдореЗрдВ рдирдИ рдЧреЛрд▓рд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреА рд╕реНрдерд┐рддрд┐, рдЙрдирдХреА рдКрдБрдЪрд╛рдИ рдФрд░ рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЖрдзреЗ рд╣рд┐рд╕реНрд╕реЗ рд╕реЗ рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рддрд╛рдХрд┐ рд╡рд╣ рдЬрд╣рд╛рдЬ рдХреЗ рдХреЗрдВрджреНрд░ рд╕реЗ рдЧреЛрд▓реА рдорд╛рд░ рджреЗред
рдЫрд╡рд┐
рд╣рдо 3 рдЧреЛрд▓рд┐рдпрд╛рдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рд╢реВрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЦреЗрд▓ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЦрд┐рд▓рд╛рдбрд╝реА рдлрдВрд╕ рдирд╣реАрдВ рд╕рдХрддрд╛ рд╣реИред рдмреБрд▓реЗрдЯ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ 'dir' рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛: 'рдлреЙрд░рд╡рд░реНрдб', 'рдЕрдк', 'рдбрд╛рдЙрди'ред

рддрдереНрдп

рд╕рднреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦрд┐рд▓рд╛рдбрд╝реА рдФрд░ 3 рд╕рд░рдгрд┐рдпреЛрдВ рдХрд╛ рд╕рд╛рд░ рдЧреЛрд▓рд┐рдпреЛрдВ, рджреБрд╢реНрдордиреЛрдВ рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯреЛрдВ рдХрд╛ рд╕рд╛рд░ рд╣реИред
 function updateEntities(dt) { // Update the player sprite animation player.sprite.update(dt); // Update all the bullets for(var i=0; i<bullets.length; i++) { var bullet = bullets[i]; switch(bullet.dir) { case 'up': bullet.pos[1] -= bulletSpeed * dt; break; case 'down': bullet.pos[1] += bulletSpeed * dt; break; default: bullet.pos[0] += bulletSpeed * dt; } // Remove the bullet if it goes offscreen if(bullet.pos[1] < 0 || bullet.pos[1] > canvas.height || bullet.pos[0] > canvas.width) { bullets.splice(i, 1); i--; } } // Update all the enemies for(var i=0; i<enemies.length; i++) { enemies[i].pos[0] -= enemySpeed * dt; enemies[i].sprite.update(dt); // Remove if offscreen if(enemies[i].pos[0] + enemies[i].sprite.size[0] < 0) { enemies.splice(i, 1); i--; } } // Update all the explosions for(var i=0; i<explosions.length; i++) { explosions[i].sprite.update(dt); // Remove if animation is done if(explosions[i].sprite.done) { explosions.splice(i, 1); i--; } } } 

рдЪрд▓реЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ: рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдХреЗрд╡рд▓ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдЕрдкрдбреЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЖрдЧреЗ рдмрдврд╝рд╛рддрд╛ рд╣реИред
рдЧреЛрд▓рд┐рдпреЛрдВ, рджреБрд╢реНрдордиреЛрдВ рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд 3 рдЪрдХреНрд░ред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рднреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ: рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдЖрдВрджреЛрд▓рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ, рдФрд░ рд╣рдЯрд╛рдПрдВ рдпрджрд┐ рдЗрдХрд╛рдИ рджреГрд╢реНрдп рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЪрд▓реА рдЧрдИ рд╣реИред рдЪреВрдВрдХрд┐ рд╕рднреА рдЗрдХрд╛рдЗрдпрд╛рдВ рдЕрдкрдиреЗ рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдХрднреА рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреА рд╣реИрдВ, рд╣рдореЗрдВ рджреГрд╢реНрдпрддрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреА рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдмреБрд▓реЗрдЯ рдЖрдВрджреЛрд▓рди рд╕рдмрд╕реЗ рдХрдард┐рди рд╣реИ:
 switch(bullet.dir) { case 'up': bullet.pos[1] -= bulletSpeed * dt; break; case 'down': bullet.pos[1] += bulletSpeed * dt; break; default: bullet.pos[0] += bulletSpeed * dt; } 

рдпрджрд┐ рдмреБрд▓реЗрдЯ .ir = 'рдКрдкрд░', рд╣рдо рдмреБрд▓реЗрдЯ рдХреЛ y- рдЕрдХреНрд╖ рд╕реЗ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдпрджрд┐ dir = 'down', рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд▓рд┐рдП, рд╣рдо abscissa рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред
 // Remove the bullet if it goes offscreen if(bullet.pos[1] < 0 || bullet.pos[1] > canvas.height || bullet.pos[0] > canvas.width) { bullets.splice(i, 1); i--; } 

рдлрд┐рд░ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдмреБрд▓реЗрдЯ рдЗрдХрд╛рдИ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдкрджреЛрдВ рдХреЛ рд╢реАрд░реНрд╖, рдиреАрдЪреЗ рдФрд░ рджрд╛рдПрдВ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЧреЛрд▓рд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдЗрди рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЪрд▓рддреА рд╣реИрдВред
рдЧреЛрд▓рд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд░рдгреА рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ i рдХреЛ рдХрдо рдХрд░рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЕрдЧрд▓реА рдмреБрд▓реЗрдЯ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЯрдХрд░рд╛рд╡ рдХреА рдЯреНрд░реИрдХрд┐рдВрдЧ

рдЕрдм рдХреНрдпрд╛ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдбрд░ рд╣реИ: рдЯрдХрд░рд╛рд╡ рдЯреНрд░реИрдХрд┐рдВрдЧ! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрддрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдПред
3 рдкреНрд░рдХрд╛рд░ рдХреЗ рдЯрдХрд░рд╛рд╡ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдореЗрдВ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
  1. рджреБрд╢реНрдорди рдФрд░ рдЧреЛрд▓рд┐рдпрд╛рдВ
  2. рд╢рддреНрд░реБ рдФрд░ рдЦрд┐рд▓рд╛рдбрд╝реА
  3. рдкреНрд▓реЗрдпрд░ рдФрд░ рд╕реНрдХреНрд░реАрди рдПрдЬ

2D рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╕рд░рд▓ рд╣реИ:
 function collides(x, y, r, b, x2, y2, r2, b2) { return !(r <= x2 || x > r2 || b <= y2 || y > b2); } function boxCollides(pos, size, pos2, size2) { return collides(pos[0], pos[1], pos[0] + size[0], pos[1] + size[1], pos2[0], pos2[1], pos2[0] + size2[0], pos2[1] + size2[1]); } 

рдЗрди 2 рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдкрдврд╝рдиреЗ рдореЗрдВ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд▓рдЧрддрд╛ рд╣реИред рдЯрдХрд░рд╛рд╡ рджреЛрдиреЛрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдКрдкрд░реА / рдмрд╛рдПрдБ рдФрд░ рдирд┐рдЪрд▓реЗ / рджрд╛рдПрдВ рдХреЛрдиреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдХреЛрдИ рдЪреМрд░рд╛рд╣рд╛ рд╣реИ рддреЛ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред
рдмреЙрдХреНрд╕рдХреЙрд▓рд┐рдбреНрд╕ рдлрд╝рдВрдХреНрд╢рди рдЯрдХрд░рд╛рд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рдЖрдпрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред
рдФрд░ рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ:
 function checkCollisions() { checkPlayerBounds(); // Run collision detection for all enemies and bullets for(var i=0; i<enemies.length; i++) { var pos = enemies[i].pos; var size = enemies[i].sprite.size; for(var j=0; j<bullets.length; j++) { var pos2 = bullets[j].pos; var size2 = bullets[j].sprite.size; if(boxCollides(pos, size, pos2, size2)) { // Remove the enemy enemies.splice(i, 1); i--; // Add score score += 100; // Add an explosion explosions.push({ pos: pos, sprite: new Sprite('img/sprites.png', [0, 117], [39, 39], 16, [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12], null, true) }); // Remove the bullet and stop this iteration bullets.splice(j, 1); break; } } if(boxCollides(pos, size, player.pos, player.sprite.size)) { gameOver(); } } } 

рдЯрдХрд░рд╛рд╡ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдШрд╛рддреАрдп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рджреГрд╢реНрдп рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЗрдХрд╛рдИ рдХреЗ рдмреАрдЪ рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╣рд░ рджреБрд╢реНрдорди рдХрд╛ рд╣рд░ рдЧреЛрд▓реА рдХреЗ рдЦрд┐рд▓рд╛рдл рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо рджреБрд╢реНрдордиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрдХреНрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдмреБрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдЪрдХреНрд░ рдореЗрдВ рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред
BoxCollides рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреБрд╢реНрдорди рдФрд░ рдмреБрд▓реЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ, рдФрд░ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рд╣реА рд╣реИ, рддреЛ рдирд┐рдореНрди рдХреНрд░рдо рд╣реИрдВ:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдПрдХ рд╡рд┐рд╕реНрдлреЛрдЯ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВред рд╣рдо рдЧреБрдг рдкреЙрд╕ рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ, рдФрд░ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдореИрдк рдкрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП 13 рдлрд╝реНрд░реЗрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рднреА рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдмрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕рд╣реА рд╣реИ рддрд╛рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╣реА рдЪрд▓реЗред
рдЗрди 3 рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ:
 if(boxCollides(pos, size, player.pos, player.sprite.size)) { gameOver(); } 

рдпрд╣рд╛рдВ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА рдФрд░ рджреБрд╢реНрдорди рдХреА рдЯрдХреНрдХрд░реЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЕрдЧрд░ рдЯрдХреНрдХрд░ рд╣реЛрддреА рд╣реИ рддреЛ рдЦреЗрд▓ рдЦрддреНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдЪрд▓рд┐рдП checkPlayerBounds рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:
 function checkPlayerBounds() { // Check bounds if(player.pos[0] < 0) { player.pos[0] = 0; } else if(player.pos[0] > canvas.width - player.sprite.size[0]) { player.pos[0] = canvas.width - player.sprite.size[0]; } if(player.pos[1] < 0) { player.pos[1] = 0; } else if(player.pos[1] > canvas.height - player.sprite.size[1]) { player.pos[1] = canvas.height - player.sprite.size[1]; } } 

рдпрд╣ рдХреЗрд╡рд▓ 0 рд╕реЗ рдФрд░ рдХреИрдирд╡рд╛рд╕ рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд░рдЦрддреЗ рд╣реБрдП, рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рдирдХреНрд╢реЗ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛


рд╣рдо рд▓рдЧрднрдЧ рд╣реЛ рдЪреБрдХреЗ рд╣реИрдВ! рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдмрд╕ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдлреНрд░реЗрдо рдХреЗ рджреГрд╢реНрдп рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЧреЗрдо рд▓реВрдк рджреНрд╡рд╛рд░рд╛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
 // Draw everything function render() { ctx.fillStyle = terrainPattern; ctx.fillRect(0, 0, canvas.width, canvas.height); // Render the player if the game isn't over if(!isGameOver) { renderEntity(player); } renderEntities(bullets); renderEntities(enemies); renderEntities(explosions); }; function renderEntities(list) { for(var i=0; i<list.length; i++) { renderEntity(list[i]); } } function renderEntity(entity) { ctx.save(); ctx.translate(entity.pos[0], entity.pos[1]); entity.sprite.render(ctx); ctx.restore(); } 

рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ рдкреГрд╖реНрдарднреВрдорд┐ред рд╣рдордиреЗ ctx.createPattern рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ init рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдПрдХ рднреВ-рднрд╛рдЧ рдкреГрд╖реНрдарднреВрдорд┐ рдмрдирд╛рдИ рд╣реИ, рдФрд░ рд╣рдо fillStyle рдХреЛ рд╕реЗрдЯ рдХрд░рдХреЗ рдФрд░ fillRect рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВред
рдлрд┐рд░ рд╣рдо рдЦрд┐рд▓рд╛рдбрд╝реА, рд╕рднреА рдЧреЛрд▓рд┐рдпреЛрдВ, рд╕рднреА рджреБрд╢реНрдордиреЛрдВ рдФрд░ рд╡рд┐рд╕реНрдлреЛрдЯреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓реВрдк рд░реЗрдВрдбрд░ рдХрд░реЗрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбреНрд░рд╛ рдХрд░реЗрдВред рд░реЗрдВрдбрд░рдПрдиреНрдЯрд┐рдЯреА рд╕реНрдХреНрд░реАрди рдкрд░ рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреИрдирд╡рд╕ рдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИред ctx.save рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рд╣реЗрдЬрддрд╛ рд╣реИ, рдФрд░ ctx.restore рдЗрд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдпрджрд┐ рдЖрдк рд╕реНрдкреНрд░рд╛рдЗрдЯ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╕реНрдкреНрд░рд╛рдЗрдЯ рд╕реНрдерд┐рддрд┐ (0,0) рдкрд░ рд╣реИ, рд▓реЗрдХрд┐рди ctx.translate рдкрд░ рдХреЙрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред

рдЦреЗрд▓ рдЦрддреНрдо


рдЖрдЦрд┐рд░реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рд╡рд╣ рд╣реИ рдЦреЗрд▓ рдХрд╛ рдЕрдВрддред рд╣рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЧреЗрдордСрд╡рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдЧреЗрдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдПрдЧрд╛, рдФрд░ рдПрдХ рдФрд░ рд░реАрд╕реЗрдЯ, рдЬреЛ рдлрд┐рд░ рд╕реЗ рдЧреЗрдо рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ред
 // Game over function gameOver() { document.getElementById('game-over').style.display = 'block'; document.getElementById('game-over-overlay').style.display = 'block'; isGameOver = true; } // Reset game to original state function reset() { document.getElementById('game-over').style.display = 'none'; document.getElementById('game-over-overlay').style.display = 'none'; isGameOver = false; gameTime = 0; score = 0; enemies = []; bullets = []; player.pos = [50, canvas.height / 2]; }; 

gameOver рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдПрдХ рд╕реНрдХреНрд░реАрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ "Gane Over" рдФрд░ "рдкреБрдирд░рд╛рд░рдВрдн" рдмрдЯрди рд╣реЛред
рд░реАрд╕реЗрдЯ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЦреЗрд▓ рд░рд╛рдЬреНрдп рдорд╛рди рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЧреЗрдо рдПрдВрдб рд╕реНрдХреНрд░реАрди рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдФрд░ рдЧреЗрдо рдХреЛ рдкреБрдирд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред

рдЕрдВрддрд┐рдо рд╡рд┐рдЪрд╛рд░


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

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


All Articles