LibCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдВрдЧрдкреЛрдВрдЧ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ


рд╢реБрдн рджрд┐рдиред рдЗрд╕ рд╡рд┐рд╖рдп рдореЗрдВ рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ LibCanvas рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░ рджрд┐рдпрд╛, рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡рд┐рд╖рдп рдХрд╛ рд▓рдХреНрд╖реНрдп рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ рдЧреЗрдо рдмрдирд╛рдирд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд▓рд┐рдмрд╛рд╕рдирд╡рд╛рд╕ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕рдордЭрд╛рдирд╛ рд╣реИред

рддреЛ, рд╡рд┐рд╖рдп рдореЗрдВ, рдХрджрдо-рдХрджрдо рдкрд░ рдирд┐рд░реНрджреЗрд╢ рджрд┐рдП рдЧрдП рд╣реИрдВ рдХрд┐ рд▓рд┐рдмрдХрдирд╡рд╛рд╕ (рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд┐рдирд╛) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд┐рдВрдЧ-рдкреЛрдВрдЧ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рддреЛ, рдкрд┐рдВрдЧ рдкреЛрдВрдЧ - рджреЛ рдмреЛрд░реНрдб, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЧреЗрдВрдж рдзрдбрд╝рдХрддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЖрдк рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВред рд╢реБрд░реБрдЖрддреА HTML рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реА рдЪреАрдЬрд╝ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ - рдПрдХ рдЕрдХреЗрд▓рд╛ рдХреИрдирд╡рд╛рд╕ рддрддреНрд╡, AtomJS рдФрд░ LibCanvas рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ, рдФрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рд┐рдВрдХ:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>LibCanvas :: ping-pong</title> <link href="/styles.css" rel="stylesheet" /> <script src="/lib/atom.js"></script> <script src="/lib/libcanvas.js"></script> </head> <body> <canvas></canvas> <!-- Game engine --> <script src="js/init.js"></script> <script src="js/controller.js"></script> <script src="js/field.js"></script> <script src="js/unit.js"></script> <script src="js/ball.js"></script> </body> </html> 


рдкреНрд░рд╛рд░рдВрдн


рдпрд╣ рд╕рдм рдПрдХ рдЖрд░рдВрднреАрдХрд░рдг рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИред

рдЗрд╕рдореЗрдВ, рдореИрдВ LibCanvas.extract рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ LibCanvas.extract рддрд╛рдХрд┐ рд╡реИрд╢реНрд╡рд┐рдХ рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╕рднреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЙрдирдХреЗ рдирд╛рдорд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: LibCanvas.Shapes.Circle ред extract рдмрд╛рдж рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: Circle

рджреВрд╕рд░рд╛ рдХрджрдо рдореЗрд░реЗ рдЦрд┐рд▓реМрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рд╕реНрдерд╛рди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХреА рдЬрд╛рдПрдВрдЧреАред

рдЬрдм рдЖрдк рдбреЛрдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЕрдВрддрд┐рдо рдЪрд░рдг рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛ рд╣реЛрддрд╛ рд╣реИред

 LibCanvas.extract(); window.Pong = {}; atom.dom(function () { new Pong.Controller('canvas'); }); 


рдкреНрд░рд╛рд░рдВрднрд┐рдХрдХрд░рдг рдЖрд╡реЗрджрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдорд╛рди рд╣реИред рдореЗрд░реЗ рдПрдХ рдорд┐рддреНрд░ рдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд╕рдВрдж рд╣реИ - рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╕рднреА рддрд░реНрдХ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддрддреНрд╡ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЬреЛрдбрд╝рдиреЗ) рдХреЗ рд╕рд╛рде рдПрдХ рдиреНрдпреВрдирддрдо HTML рдлрд╝рд╛рдЗрд▓ред рдФрд░ рд╣рд╛рдБ, рдпрд╣ рдХреЛрдб рдорд╛рдиреНрдп рд╣реИ!

 <!DOCTYPE html> <title>LibCanvas :: ping-pong</title> <script src="js/load.ls"></script> 


рдирд┐рдпрдВрддреНрд░рдХ


рдЕрдЧрд▓рд╛ рдХрджрдо рдПрдХ рдирд┐рдпрдВрддреНрд░рдХ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕рдореЗрдВ рд╣рдо рдПрдХ LibCanvas рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдЧреЗрдо рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ LibCanvas ред рдореИрдВ atom.Class рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдЦреЗрд▓ рдХрдХреНрд╖рд╛рдПрдВ atom.Class , рдЬрд╣рд╛рдВ atom.Class рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рд╣реИред

 Pong.Controller = atom.Class({ initialize: function (canvas) { this.libcanvas = new LibCanvas(canvas, { preloadImages: { elems : 'im/elems.png' } }) .listenKeyboard([ 'aup', 'adown', 'w', 's' ]) .addEvent('ready', this.start.bind(this)) .start(); }, start: function () { var libcanvas = this.libcanvas; [...] } }); 


рд╣рдо рдЫрд╡рд┐ рдХреЛ рдкреНрд░реАрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЪрд┐рддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдиреЗ рддрдХ рдЖрд╡реЗрджрди рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдпреЗ рджреЛ рдкреНрд░реЗрдд рд╣реИрдВ - рд▓рд╛рдареА рдФрд░ рдЧреЗрдВрджред



рд╣рдо LibCanvas рдХреЛ LibCanvas рдХрд┐ рд╣рдо рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╣рдореЗрдВ 'aup', 'adown', 'w' рдФрд░ 's' рдХреА рдХреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреНрд░рд┐рдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдпрдВрддреНрд░рдг рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдФрд░, рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреАрд░ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

рдЬрдм LibCanvas рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХрдВрдЯреНрд░реЛрд▓рд░ рдХреА рд╕реНрдЯрд╛рд░реНрдЯ рд╡рд┐рдзрд┐ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрд╕рдХреЗ рдкрд╛рд╕ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред

рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди


рд╣рдорд╛рд░реЗ рд╕рд╛рде рдЦреЗрд▓ рдХрд╛ рдореИрджрд╛рди рдкреГрд╖реНрдарднреВрдорд┐, рдЕрдВрдХ, рдХреБрдЫ рдЧрдгрдирд╛, рдЗрдХрд╛рдЗрдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред

 Pong.Field = atom.Class({ Implements: [ Drawable ], width : 800, height: 500, [...] }); 


рдПрдХ рдЗрдХрд╛рдИ рдмрдирд╛рдПрдБ рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП libcanvas рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдХреИрд╕реЗ рдЪрддреБрд░рд╛рдИ рд╕реЗ рдХреИрдирд╡рд╛рд╕ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рдЧреБрдг рд╣реИрдВред

 Pong.Controller = atom.Class({ [...] start: function () { var libcanvas = this.libcanvas; var field = new Pond.Field(); libcanvas.size( field, true ); libcanvas.addElement( field ); [...] } }); 


рдЧреЗрдВрдж


рдЧреЗрдВрдж рдХрд╛ рддрд░реНрдХ рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдЗрд╕рдореЗрдВ рдПрдХ "рдЖрд╡реЗрдЧ" рд╣реИ - рдЖрдВрджреЛрд▓рди рдХреА рджрд┐рд╢рд╛ рдФрд░ рдЧрддрд┐ред
рдЧрддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ / рд╕реЗрдХрдВрдб рдореЗрдВ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЕрдкрдбреЗрдЯ рдХреЗ рджреМрд░рд╛рди, рд╣рдореЗрдВ рд╡рд╣ рд╕рдордп рдорд┐рд▓рддрд╛ рд╣реИ, рдЬреЛ рдкрд┐рдЫрд▓реЗ рдЕрдкрдбреЗрдЯ рдХреЗ рдмрд╛рдж рд╕реЗ рдЧреБрдЬрд░рд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдЧрддрд┐ рдХреЛ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдХрд╛рд░рдг, рдПрдлрдкреАрдПрд╕ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирд┐рд░рдВрддрд░ рдЧрддрд┐ рд╣реИ
рдЬрдм рдЧреЗрдВрдж рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдкрд░ рдкрд╣реБрдБрдЪрддреА рд╣реИ - рддреЛ рд╡рд╣ рд╣рд┐рдЯ рдХрд░рддреА рд╣реИ рдФрд░ рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЙрдбрд╝рддреА рд╣реИред
appendTo рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдЧреЗрдВрдж рдХреЛ рдкрд┐рди рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдФрд░ рджреАрд╡рд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдЖрдХрд╛рд░ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдкреНрд░рддрд┐рдкрд╛рджрди рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рд╣рдо рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рднрд╛рдЧ рдХреЛ рд╡рд░реНрддрдорд╛рди рдЖрдпрдд рдореЗрдВ рдмрдирд╛рддреЗ рд╣реИрдВред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, libcanvas рд╕рдВрдкрддреНрддрд┐ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ libcanvasSet рдЗрд╡реЗрдВрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА libcanvas рдЙрдкрдпреЛрдЧ libcanvas

 Pong.Ball = atom.Class({ Implements: [ Drawable ], impulse: null, initialize: function (controller) { this.impulse = new Point( Number.random(325, 375), Number.random(325, 375) ); this.addEvent('libcanvasSet', function () { this.image = this.libcanvas.getImage('elems').sprite( 23, 0, 26, 26 ); }); }, move: function (time) { this.shape.move( this.impulse.clone().mul(time / 1000) ); }, update: function (time) { this.move(time); var from = this.shape.from, to = this.shape.to; //      if ( (this.impulse.y < 0 && from.y < 0) || (this.impulse.y > 0 && to.y > this.field.height) ) this.impulse.y *= -1; }, appendTo: function (field) { this.shape = new Rectangle( 40, field.height / 2, 24, 24 ); this.field = field; return this; }, draw: function () { this.libcanvas.ctx.drawImage(this.image, this.shape); } }); 


рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдЗрд╕рдХреА рдХреЙрд▓ рдЬреЛрдбрд╝реЗрдВред рд╣рдореЗрдВ рд╣рд░ рдлреНрд░реЗрдо рдореЗрдВ рдЧреЗрдВрдж рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо addFunc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдбреЗрдЯ рдХреА рд╕рджрд╕реНрдпрддрд╛ addFunc
 Pong.Controller = atom.Class({ [...] start: function () { [...] ball = new Pong.Ball(); libcanvas [...] .addElement( ball.appendTo( field ) ) .addFunc(function (time) { ball.update( time ); libcanvas.update(); }); } }); 


рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдПрдБ


рдЕрдЧрд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рд╣реИ рд░реИрдХреЗрдЯред рдЙрдиреНрд╣реЗрдВ рдХреАрдмреЛрд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдмрд╛рдПрдВ рдХреЗ рд▓рд┐рдП ws рдФрд░ рджрд╛рдПрдВ рдХреЗ рд▓рд┐рдП рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ)ред
рдпрд╣ рд╡рд░реНрдЧ рдирд┐рдпрдВрддреНрд░рдг, рдЖрдВрджреЛрд▓рди, рдЧреЗрдВрдж рдХреЗ рд╕рд╛рде рд╕рдВрдкрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ред
рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ "рдЧрддрд┐" рдЧреБрдг рд╕реНрдерд┐рд░ рд╣реИ, рдЕрд░реНрдерд╛рддреН, рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдмрджрд▓реЗрдВрдЧреЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ, рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рд╕рдВрд▓рдЧреНрди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред
рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЧрддрд┐ рддрдХ рд▓реЗ рдЬрд╛рдиреЗ рдХрд╛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХрд╛ рдпрд╣ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рд╣рдорд╛рд░реА рдЖрдпрдд рдХреА рдЪрд╛рд▓ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИред
fitToField рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рддрддреНрд╡ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╕реАрдорд╛ рдХреЗ рднреАрддрд░ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдкрдиреА рдЬрдЧрд╣ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЧреЗрдВрдж рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдбреНрд░рд╛ рд╡рд┐рдзрд┐ рдореЗрдВ, рдЪрд┐рддреНрд░ рдХрд╛ рдЖрд╡рд╢реНрдпрдХ рд╣рд┐рд╕реНрд╕рд╛ рд╡рд░реНрддрдорд╛рди рдЖрдХрд╛рд░ рдореЗрдВ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред

 Pong.Unit = atom.Class({ Implements: [ Drawable ], size: { width: 20, height: 100, padding: 20 }, speed: new Point( 0, 300 ), score: 0, controls: function (up, down) { this.addEvent('libcanvasSet', function () { var lc = this.libcanvas.addFunc(function (time) { if (lc.getKey(up)) { this.move( -time ); } else if (lc.getKey(down)) { this.move( time ); } }.bind(this)); }); return this; }, appendTo: function (field, number) { var s = this.size; this.field = field; this.number = number; this.shape = new Rectangle({ // field.width, field.height from: [ (number == 2 ? field.width - s.width - s.padding : s.padding), (field.height - s.height) / 2 ], size: s }); return this; }, fitToField: function () { var shape = this.shape; var top = shape.from.y, bottom = shape.to.y - this.field.height; if (top < 0) shape.move(new Point(0, -top)); if (bottom > 0) shape.move(new Point(0, -bottom)); }, move: function (time) { this.shape.move( this.speed.clone().mul( time / 1000 ) ); this.fitToField(); }, draw: function() { this.libcanvas.ctx.drawImage( this.libcanvas.getImage('elems').sprite(0,0,20,100), this.shape ); } }); 


рд╣рдо рдореИрджрд╛рди рдкрд░ рдЗрдХрд╛рдЗрдпрд╛рдБ рдмрдирд╛рдПрдВрдЧреЗ, рдЬрд╣рд╛рдБ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рд╕реНрдерд┐рддрд┐ рджреЗрдВрдЧреЗ:
 Pong.Field = atom.Class({ [...] createUnits: function (libcanvas) { this.unit = new Pong.Unit() .controls('w', 's') .appendTo( this, 1 ); this.enemy = new Pong.Unit() .controls('aup', 'adown') .appendTo( this, 2 ); libcanvas .addElement( this.unit ) .addElement( this.enemy ); }, [...] 


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:

 Pong.Controller = atom.Class({ [...], start: function () { [...], field.createUnits( libcanvas ); } }); 


рд╡рд╕реНрддреБ рд╕рд╣рднрд╛рдЧрд┐рддрд╛


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

 Pong.Ball = atom.Class({ [...] checkCollisions: function () { var coll = this.field.collidesUnits( this ), isOut = this.field.isOut( this.shape ); if ( (( coll < 0 || isOut < 0 ) && this.impulse.x < 0) || (( coll > 0 || isOut > 0 ) && this.impulse.x > 0) ) this.impulse.x *= -1; }, update: function (time) { [...] this.checkCollisions(); }, [...] }); 


рдлреАрд▓реНрдб рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рдБрдЪ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рд╣рдо рдЗрдХрд╛рдИ рдХреЗ рд╕рд╛рде рдЯрдХрд░рд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХреЛ рдЗрдХрд╛рдИ рдХреЗ рдХрдВрдзреЛрдВ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рджрд┐рд╢рд╛ рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рджрд╛рдИрдВ рдпрд╛ рдмрд╛рдИрдВ рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рдЬрд╛рдиреЗ рдХреА рдЬрд╛рдБрдЪ рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╕реАрдорд╛ рдХреЗ рд╕рдВрдкрд░реНрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд┐рдкрд░реАрдд рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЗ рд╕реНрдХреЛрд░ рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред

 Pong.Field = atom.Class({ [...] collidesUnits: function (ball) { return this.unit .collides(ball) ? -1 : this.enemy.collides(ball) ? 1 : 0; }, isOut: function (shape) { if (shape.from.x < 0) { this.enemy.score++; return -1; } else if (shape.to.x > this.width) { this.unit.score++; return 1; } return 0; }, [...] 


рдЗрдХрд╛рдИ рдХреЗ рдЕрдВрджрд░, рд╣рдо рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд Rectangle().intersect рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ Rectangle().intersect рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рдзрд┐ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рджреЛ рдЖрдпрддреЗрдВ рдкреНрд░рддрд┐рдЪреНрдЫреЗрдж рдХрд░рддреА рд╣реИрдВред
 Pong.Unit = atom.Class({ [...] collides: function (ball) { return ball.shape.intersect(this.shape); }, }); 


рдЦрд╛рддрд╛ рд╡рд╛рдкрд╕реА


рдЕрдВрддрд┐рдо рдЪрд░рдг рдЦрд┐рд▓рд╛рдбрд╝рд┐рдпреЛрдВ рдХреЗ рд╕реНрдХреЛрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ ctx.text рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - рдпрд╣ рдЖрдкрдХреЛ рдкрд╛рда рдХреЛ css рдХреЗ рдЕрдзрд┐рдХ рдирд┐рдХрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрдВрдбреЗрдВрдЯ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рдЖрдпрдд рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдкрд╛рда рдФрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

 Pong.Field = atom.Class({ [...] drawScore: function (unit, align) { this.libcanvas.ctx.text({ text: unit.score, size: 32, padding: [0, 70], color: 'white', align: align }); return this; }, draw: function () { this .drawScore( this.unit , 'left' ) .drawScore( this.enemy, 'right' ); } }); 


рдирд┐рд╖реНрдХрд░реНрд╖


рд╡рд╣ рд╕рдм рд╣реИред рдкреВрд░реНрдг рдХреЛрдб рдФрд░ рдЦреЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

libcanvas.github.com/games/pingpong/



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

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

рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рд╡рд┐рдЪрд╛рд░ рдХрд╛рдлреА рдЕрд░рд╛рдЬрдХ рдереЗ, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рд╣реИрдмреЗ рдкрд░ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдпрд╛ рдИрдореЗрд▓ рдкрд░ рд╕рд╡рд╛рд▓ рдкреВрдЫрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред

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


All Articles