рдХреИрдирд╡рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдмрдирд╛рдирд╛: рдСрдмреНрдЬреЗрдХреНрдЯ рдФрд░ рдорд╛рдЙрд╕



рдХреИрдирд╡рд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдмреАрдЪ , рд╕рдмрд╕реЗ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдЪреМрдЦрдЯреЗ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЗ - рдХреИрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдорд╛рдЙрд╕ рддрддреНрд╡ рд╕реЗ рдКрдкрд░ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╡рд┐рд╖рдп рдореЗрдВ, рд╣рдо AtomJS рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рд╕рдорд╛рди рдХреИрдирд╡рд╕ рдврд╛рдВрдЪреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рд╡реИрд╢реНрд╡рд┐рдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕


рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд╣рдорд╛рд░реЗ рдврд╛рдВрдЪреЗ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдХреИрдирд╡рд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХрд╣рддреЗ рд╣реИрдВ, рд╢реЙрд░реНрдЯ рдХреЗ рд▓рд┐рдП - рд╕реАрдПрдлред рдпрд╣ рддрд╛рддреНрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рдХрд╛рд░рдЦрд╛рдирд╛ рдЪрд░ рд╣реЛрдЧрд╛ред
рдкрд╣рд▓рд╛ рддрд░реНрдХ рд╣рдо рдЗрд╕рдореЗрдВ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд╛рдВрдЫрд┐рдд рддрддреНрд╡ рдХрд╛ рд▓рд┐рдВрдХ рд╣реИ:

var cf = new CF('#my-canvas'); 


рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рд░рд▓ рд╣реИ:
 window.CF = atom.Class({ initialize: function (canvas) { this.canvas = atom.dom( canvas ).first; this.ctx = this.canvas.getContext('2d'); } }); 


рддрдм рд╣рдо рдЗрд╕ рдЗрдХрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ:

 cf.circle([50, 50, 10] , { fill: 'red' , hover : { fill: 'blue' } }); cf.rect ([10, 10, 20, 20], { fill: 'green', hover : { fill: 'blue' } }); 


рд╕рд░рд▓рддрд╛ рдХреЗ рд▓рд┐рдП, рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдорд╛рдЙрд╕ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реБрдиреЗрдВрдЧреЗред

рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЕрдм рд╣рдореЗрдВ рдЖрдВрдХрдбрд╝реЗ рдХреЗ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 //    var Shape = atom.Class({ Implements: [ atom.Class.Events, atom.Class.Options ], cf : null, data : null, hover: false, path: atom.Class.abstractMethod, initialize: function (data, options) { this.data = data; this.setOptions( options ); }, hasPoint: function (x, y) { var ctx = this.cf.emptyCanvas.ctx; this.path( ctx ); return ctx.isPointInPath(x, y); }, draw: function () { var ctx = this.cf.ctx, o = this.options; this.path( ctx ); ctx.save(); ctx.fillStyle = this.hover ? o.hover.fill : o.fill; ctx.fill(); ctx.restore(); } }); 


рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреБрдЫ рдЦрд╛рд▓реА рдЬрдЧрд╣реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА - рдпрд╣ рдПрдХ рдЫрд┐рдкрд╛ рд╣реБрдЖ рдХреИрдирд╡рд╕ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ "рд▓рдбрд╝рд╛рдИ" рдХреИрдирд╡рд╛рд╕ рдХреЗ рдорд╛рд░реНрдЧреЛрдВ рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рди рд╣реЛред рд╕реАрдПрдл рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 window.CF = atom.Class({ initialize: function (canvas) { [...] this.emptyCanvas = atom.dom.create( 'canvas', { width: 1, height: 1 }).first; this.emptyCanvas.ctx = this.emptyCanvas.getContext('2d'); } }); 


рдкреНрд░рддреНрдпреЗрдХ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдЖрдХреГрддрд┐ рдХреЛ рдХреЗрд╡рд▓ рдкрде рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЖрдЗрдП рдХреБрдЫ рдЖрдХреГрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ - рдЖрдпрдд рдФрд░ рд╡реГрддреНрддред

 // circle.data == [x, y, radius] var Circle = atom.Class({ Extends: Shape, path: function (ctx) { ctx.beginPath(); ctx.arc( this.data[0], this.data[1], this.data[2], 0, Math.PI * 2, false ); ctx.closePath(); } }); var Rect = atom.Class({ Extends: Shape, path: function (ctx) { ctx.beginPath(); ctx.rect.apply( ctx, this.data ); ctx.closePath(); } }); 


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

 var Mouse = atom.Class({ x: 0, y: 0, initialize: function (canvas) { this.elements = []; canvas.bind({ mousemove: this.move.bind(this), mousedown: this.fire.bind(this, 'mousedown'), mouseup: this.fire.bind(this, 'mouseup' ) }); }, add: function (element) { this.elements.push( element ); }, move: function (e) { //   layer*,        if (e.layerX == null) { // opera this.x = e.offsetX; this.y = e.offsetY; } else { // fx, chrome this.x = e.layerX; this.y = e.layerY; } this.elements.forEach(function (el) { el[i].hover = el[i].hasPoint(this.x, this.y) }.bind(this)); }, fire: function (name, e) { this.elements.forEach(function (el) { if (el.hasPoint(this.x, this.y)) { el.fireEvent(name, e); } }.bind(this)); } }); //    : window.CF = atom.Class({ initialize: function (canvas) { [...] this.mouse = new Mouse( this.canvas ); } }); 


рдЕрдм рдЖрдкрдХреЛ рдПрдХ рдХреИрдирд╡рд╛рд╕ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 window.CF = atom.Class({ initialize: function (canvas) { [...] // 25 fps this.update.periodical( 1000/25, this ); }, update: function (shapes) { this.ctx.clearRect(0,0,this.canvas.width, this.canvas.height); this.elements.invoke('draw'); } }); 


рд╣рдо рдЕрдкрдиреА рд╡реИрд╢реНрд╡рд┐рдХ рд╡рд╕реНрддреБ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рд╣рдо рддрддреНрд╡ рдмрдирд╛ рд╕рдХреЗрдВ:
 window.CF = atom.Class({ [...], elements: [], _shape: function (Class, args) { var e = new Class(args[0], args[1]); this.mouse.add( e ); this.elements.push( e ); e.cf = this; return e; }, circle: function (data, options) { return this._shape(Circle, arguments); }, rect: function (data, options) { return this._shape(Rect, arguments); } }) 


рд╕рднреА, рд╣рдо рдЕрдкрдирд╛ рдЖрд╡реЗрджрди рдмрдирд╛рддреЗ рд╣реИрдВ:

 var write = function (msg) { atom.dom.create('p').text(msg).appendTo('body'); }; var cf = new CF('canvas'); cf.circle([50, 50, 10] , { fill: 'red' , hover : { fill: 'blue' } }) .addEvent('mousedown', write.bind( window, 'circle mousedown' )); cf.rect ([10, 10, 20, 20], { fill: 'green', hover : { fill: 'blue' } }) .addEvent('mousedown', write.bind( window, 'rect mousedown' )); 


рдкрд░рд┐рдгрд╛рдо



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


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

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

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

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


All Articles