{"version":3,"sources":["https://lively-kernel.org/lively4/BP2019RH1/scratch/firstTries/pong.js"],"names":["pt","Paddle","constructor","parent","graphicRepresentation","startPosition","speed","appendChild","position","height","lively","getExtent","y","width","x","draw","setPosition","stepUp","stepDown","Ball","resetSpeed","resetPosition","baseSpeeds","Math","floor","random","length","step","bounceX","bounceY","increaseSpeed","Game","playfield","ballGraphic","paddleGraphics","scoreBoard","parentElement","bounds","ball","paddleLeft","paddleRight","paddles","score","updateScoreBoard","setAttribute","addEventListener","event","handleKeyDown","key","keyCode","preventDefault","stopPropagation","ballHitsRightPaddle","ballHitsLeftPaddle","ballHitsLeftSide","ballHitsRightSide","ballHitsTopSide","ballHitsBottomSide","innerHTML","nextRound"],"mappings":"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","file":"pong.js","sourcesContent":["/*MD \n![](pictures/pong.png)\nMD*/\n\nimport { pt } from \"src/client/graphics.js\"\n\nclass Paddle {\n  constructor(parent, graphicRepresentation, startPosition, speed) {\n    this.graphicRepresentation = graphicRepresentation;\n    this.parent = parent;\n    this.parent.appendChild(this.graphicRepresentation);\n    this.position = startPosition;\n    this.speed = speed;\n    this.height = lively.getExtent(this.graphicRepresentation).y;\n    this.width = lively.getExtent(this.graphicRepresentation).x;\n  }\n\n  draw() {\n    lively.setPosition(this.graphicRepresentation, this.position);\n  }\n\n  stepUp() {\n    this.position.y -= this.speed;\n    if (this.position.y < 0) {\n      this.position.y = 0;\n    }\n  }\n  \n  stepDown() {\n    this.position.y += this.speed;\n    if (this.position.y + this.height > lively.getExtent(this.parent).y) {\n      this.position.y = lively.getExtent(this.parent).y - this.height;\n    }\n  }\n}\n\nclass Ball {\n  constructor(parent, graphicRepresentation) {\n    this.graphicRepresentation = graphicRepresentation;\n    this.parent = parent;\n    this.parent.appendChild(this.graphicRepresentation);\n    this.position = pt(\n      lively.getExtent(this.parent).x / 2,\n      lively.getExtent(this.parent).y / 2\n    );\n    this.speed = pt(0, 0);\n    this.height = lively.getExtent(this.graphicRepresentation).y;\n    this.width = lively.getExtent(this.graphicRepresentation).x;\n    this.resetSpeed();\n  }\n\n  resetPosition() {\n    this.position = pt(\n      lively.getExtent(this.parent).x / 2,\n      lively.getExtent(this.parent).y / 2\n    );\n  }\n\n  resetSpeed() {\n    let baseSpeeds = [-1, 1];\n    this.speed = pt(\n      baseSpeeds[Math.floor(Math.random() * baseSpeeds.length)],\n      baseSpeeds[Math.floor(Math.random() * baseSpeeds.length)]\n    );\n  }\n\n  draw() {\n    lively.setPosition(this.graphicRepresentation, this.position);\n  }\n\n  step() {\n    this.position.x += this.speed.x;\n    this.position.y += this.speed.y;\n  }\n\n  bounceX() {\n    this.speed.x *= -1;\n  }\n\n  bounceY() {\n    this.speed.y *= -1;\n  }\n\n  increaseSpeed() {\n    this.speed.x *= 1.1;\n    this.speed.y *= 1.1;\n  }\n}\n\nexport class Game {\n  constructor(playfield, ballGraphic, paddleGraphics, scoreBoard, parentElement) {\n    this.playfield = playfield;\n    this.bounds = lively.getExtent(playfield);\n\n    this.ball = new Ball(this.playfield, ballGraphic);\n\n    let paddleLeft = new Paddle(playfield, paddleGraphics[0], pt(20, 20), 20);\n    let paddleRight = new Paddle(playfield, paddleGraphics[1], pt(this.bounds.x - 30, 20), 20);\n    this.paddles = [paddleLeft, paddleRight];\n\n    this.score = [0, 0];\n\n    this.scoreBoard = scoreBoard;\n    this.playfield.appendChild(scoreBoard);\n    lively.setPosition(this.scoreBoard, pt((this.bounds.x - lively.getExtent(this.scoreBoard).x) / 2, 0));\n    this.updateScoreBoard();\n\n    parentElement.setAttribute(\"tabindex\", 0);\n    lively.addEventListener(\"pong\", parentElement, \"keydown\", (event) => { this.handleKeyDown(event) });\n\n  }\n\n  handleKeyDown(event) {\n    let key = event.keyCode;\n    event.preventDefault();\n    event.stopPropagation();\n\n    switch (key) {\n      case 87: //w\n        this.paddles[0].stepUp();\n        break;\n      case 83: //s\n        this.paddles[0].stepDown();\n        break;\n      case 38: //arrow up\n        this.paddles[1].stepUp();\n        break;\n      case 40: //arrow down\n        this.paddles[1].stepDown();\n        break;\n    }\n  }\n\n  ballHitsRightPaddle() {\n    return this.ball.position.x + this.ball.width > this.paddles[1].position.x &&\n      this.ball.position.y > this.paddles[1].position.y &&\n      this.ball.position.y + this.ball.height < this.paddles[1].position.y + this.paddles[1].height;\n  }\n\n  ballHitsLeftPaddle() {\n    return this.ball.position.x < this.paddles[0].position.x + this.paddles[0].width &&\n      this.ball.position.y > this.paddles[0].position.y &&\n      this.ball.position.y + this.ball.height < this.paddles[0].position.y + this.paddles[0].height;\n  }\n\n  ballHitsLeftSide() {\n    return this.ball.position.x < 0;\n  }\n\n  ballHitsRightSide() {\n    return this.ball.position.x + this.ball.width > this.bounds.x;\n  }\n\n  ballHitsTopSide() {\n    return this.ball.position.y < 0;\n  }\n\n  ballHitsBottomSide() {\n    return this.ball.position.y + this.ball.height > this.bounds.y;\n  }\n\n  updateScoreBoard() {\n    this.scoreBoard.innerHTML = this.score[0] + \" : \" + this.score[1];\n  }\n\n  nextRound() {\n    this.ball.resetPosition();\n    this.ball.resetSpeed();\n    this.updateScoreBoard();\n  }\n\n  step() {\n    this.ball.draw();\n    this.paddles[0].draw();\n    this.paddles[1].draw();\n\n    if (this.ballHitsLeftPaddle() || this.ballHitsRightPaddle()) {\n      this.ball.bounceX();\n      this.ball.increaseSpeed();\n    } else if (this.ballHitsTopSide() || this.ballHitsBottomSide()) {\n      this.ball.bounceY();\n    } else if (this.ballHitsLeftSide()) {\n      this.score[1] += 1;\n      this.nextRound()\n    } else if (this.ballHitsRightSide()) {\n      this.score[0] += 1;\n      this.nextRound();\n    }\n\n    this.ball.step();\n  }\n\n}\n"]}