{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-jsx/src/components/demo/lively-bouncing-ball.js"],"names":["Morph","pt","Ball","initialize","windowTitle","hits","balls","dx","dy","y","x","size","registerButtons","attachedCallback","animation","setInterval","draw","detachedCallback","clearInterval","canvas","get","context","getContext","clearRect","width","height","forEach","ball","beginPath","fillStyle","arc","Math","PI","closePath","fill","collisionTest","shadowRoot","querySelector","innerHTML","console","log","other","dist","onAddButton","addBall","push","random","removeBall","pop","livelyMigrate","oldInstance"],"mappings":"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","file":"lively-bouncing-ball.js","sourcesContent":["import Morph from \"src/components/widgets/lively-morph.js\"\nimport {pt} from \"src/client/graphics.js\"\n\n\n\nexport default class Ball extends Morph {\n\n  initialize() {\n    this.windowTitle = \"Bouncing Atoms and other stuff\";\n    this.hits = this.hits || 0;\n    if (!this.balls) {\n      this.balls =  [{dx: 1, dy: 2, y: 180, x: 20}];\n    }\n    this.size = 10;\n    this.registerButtons();\n  }\n  \n  attachedCallback() {\n    this.animation = setInterval(() => this.draw(), 20);\n  }\n  \n  detachedCallback() {\n    clearInterval(this.animation);\n  }\n  \n  draw() {\n    var canvas = this.get(\"#bouncing-ball\");\n    var context = canvas.getContext('2d');\n    context.clearRect(0, 0, canvas.width, canvas.height);\n    \n    \n    if (!this.balls) return\n    this.balls.forEach(ball => {\n        context.beginPath();\n        context.fillStyle = \"blue\";\n        context.arc(ball.x, ball.y, this.size * 2, 0, Math.PI*2, true);\n        context.closePath();\n        context.fill();\n        this.collisionTest(canvas, ball)\n        ball.x += ball.dx * 1;\n        ball.y += ball.dy * 1;\n    })\n    this.shadowRoot.querySelector(\"#hits\").innerHTML = \"Hits: \" + this.hits\n  }\n\n  collisionTest(canvas, ball) {\n    if( ball.x < this.size || ball.x> (canvas.width  - this.size)) {\n      ball.dx =- ball.dx;\n      this.hits++\n      console.log(\"[ball] collide x\")\n\n    }\n    if( ball.y < this.size || ball.y> (canvas.height - this.size)) {\n      ball.dy =- ball.dy;\n      this.hits++\n      console.log(\"[ball] collide y\")\n    }\n    \n    this.balls.forEach(other => {\n      if (other === ball) return;\n      var dist = pt(other.x, other.y).dist(pt(ball.x, ball.y))\n      if (dist < 2 * this.size) {\n        ball.dx *= -1\n        ball.dy *= -1\n      }\n    })\n    \n  }\n  \n  onAddButton() {\n    this.addBall()\n  }\n\n  // this.addBall()\n  addBall() {\n    this.balls.push({dx: 2 * Math.random(), dy: 2 * Math.random(), \n                      y: 200 * Math.random(), x: 200  * Math.random()})\n  }\n  \n  // this.removeBall()\n  removeBall() {\n    this.balls.pop()\n  }\n\n  // lively mirgrate is executed after constructor, but before initializer #Design?\n  livelyMigrate(oldInstance) {\n    if (oldInstance.balls)\n       this.balls = oldInstance.balls\n    if (oldInstance.hits)\n       this.hits = oldInstance.hits\n\n  }\n}"]}