summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorLi Haoyi <haoyi@dropbox.com>2014-10-29 23:07:55 -0700
committerLi Haoyi <haoyi@dropbox.com>2014-10-29 23:07:55 -0700
commite8b38f242876f99966c3d13cefae2f5863c5bb9e (patch)
tree01989c3899a57cbbc37c5479a7489aa6ac8c753f /examples
parent42394b5fa4bc0a76585d77f587a79b11c1b7c32f (diff)
downloadhands-on-scala-js-e8b38f242876f99966c3d13cefae2f5863c5bb9e.tar.gz
hands-on-scala-js-e8b38f242876f99966c3d13cefae2f5863c5bb9e.tar.bz2
hands-on-scala-js-e8b38f242876f99966c3d13cefae2f5863c5bb9e.zip
lots of refactoring
Diffstat (limited to 'examples')
-rw-r--r--examples/src/main/scala/Clock.scala48
-rw-r--r--examples/src/main/scala/FlappyLine.scala105
-rw-r--r--examples/src/main/scala/ScratchPad.scala38
-rw-r--r--examples/src/main/scala/Splash.scala (renamed from examples/src/main/scala/Example.scala)3
4 files changed, 192 insertions, 2 deletions
diff --git a/examples/src/main/scala/Clock.scala b/examples/src/main/scala/Clock.scala
new file mode 100644
index 0000000..1db7c23
--- /dev/null
+++ b/examples/src/main/scala/Clock.scala
@@ -0,0 +1,48 @@
+
+import org.scalajs.dom
+import scala.scalajs.js.annotation.JSExport
+import scalajs.js
+@JSExport
+object Clock extends{
+ @JSExport
+ def main(canvas: dom.HTMLCanvasElement) = {
+ /*setup*/
+ val renderer = canvas.getContext("2d")
+ .asInstanceOf[dom.CanvasRenderingContext2D]
+
+ canvas.width = canvas.parentElement.clientWidth
+ canvas.height = canvas.parentElement.clientHeight
+
+ val gradient = renderer.createLinearGradient(
+ canvas.width / 2 - 100, 0, canvas.width/ 2 + 100, 0
+ )
+ gradient.addColorStop(0,"red")
+ gradient.addColorStop(0.5,"green")
+ gradient.addColorStop(1,"blue")
+ renderer.fillStyle = gradient
+ //renderer.fillStyle = "black"
+
+ renderer.textAlign = "center"
+ renderer.textBaseline = "middle"
+
+ /*code*/
+ def render() = {
+ val date = new js.Date()
+ renderer.clearRect(
+ 0, 0, canvas.width, canvas.height
+ )
+
+ renderer.font = "75px sans-serif"
+ renderer.fillText(
+ Seq(
+ date.getHours(),
+ date.getMinutes(),
+ date.getSeconds()
+ ).mkString(":"),
+ canvas.width / 2,
+ canvas.height / 2
+ )
+ }
+ dom.setInterval(render _, 1000)
+ }
+} \ No newline at end of file
diff --git a/examples/src/main/scala/FlappyLine.scala b/examples/src/main/scala/FlappyLine.scala
new file mode 100644
index 0000000..92583b5
--- /dev/null
+++ b/examples/src/main/scala/FlappyLine.scala
@@ -0,0 +1,105 @@
+
+import org.scalajs.dom
+import scala.scalajs.js.annotation.JSExport
+import scala.util.Random
+import scalajs.js
+
+@JSExport
+object FlappyLine extends{
+ @JSExport
+ def main(canvas: dom.HTMLCanvasElement) = {
+ /*setup*/
+
+ val renderer = canvas.getContext("2d")
+ .asInstanceOf[dom.CanvasRenderingContext2D]
+
+ canvas.width = canvas.parentElement.clientWidth
+ canvas.height = 400
+
+ renderer.font = "50px sans-serif"
+ renderer.textAlign = "center"
+ renderer.textBaseline = "middle"
+
+ /*variables*/
+ val obstacleGap = 200 // Gap between the approaching obstacles
+ val holeSize = 50 // Size of the hole in each obstacle you must go through
+ val gravity = 0.1 // Y acceleration of the player
+
+ var playerY = canvas.height / 2.0 // Y position of the player; X is fixed
+ var playerV = 0.0 // Y velocity of the player
+ // Whether the player is dead or not;
+ // 0 means alive, >0 is number of frames before respawning
+ var dead = 0
+ // What frame this is; used to keep track
+ // of where the obstacles should be positioned
+ var frame = -50
+ // List of each obstacle, storing only the Y position of the hole.
+ // The X position of the obstacle is calculated by its position in the
+ // queue and in the current frame.
+ val obstacles = collection.mutable.Queue.empty[Int]
+
+
+ def runLive() = {
+ frame += 2
+
+ // Create new obstacles, or kill old ones as necessary
+ if (frame >= 0 && frame % obstacleGap == 0)
+ obstacles.enqueue(Random.nextInt(canvas.height - 2 * holeSize) + holeSize)
+ if (obstacles.length > 7){
+ obstacles.dequeue()
+ frame -= obstacleGap
+ }
+
+ // Apply physics
+ playerY = playerY + playerV
+ playerV = playerV + gravity
+
+
+ // Render obstacles, and check for collision
+ renderer.fillStyle = "darkblue"
+ for((holeY, i) <- obstacles.zipWithIndex){
+ val holeX = i * obstacleGap - frame + canvas.width
+ renderer.fillRect(holeX, 0, 5, holeY - holeSize)
+ renderer.fillRect(
+ holeX, holeY + holeSize, 5, canvas.height - holeY - holeSize
+ )
+ if (math.abs(holeX - canvas.width/2) < 5 &&
+ math.abs(holeY - playerY) > holeSize){
+ dead = 50
+ }
+ }
+
+ // Render player
+ renderer.fillStyle = "darkgreen"
+ renderer.fillRect(canvas.width / 2 - 5, playerY - 5, 10, 10)
+
+ // Check for out-of-bounds player
+ if (playerY < 0 || playerY > canvas.height){
+ dead = 50
+ }
+ }
+
+
+ def runDead() = {
+ playerY = canvas.height / 2
+ playerV = 0
+ frame = -50
+ obstacles.clear()
+ dead -= 1
+ renderer.fillStyle = "darkred"
+ renderer.fillText("You Died", canvas.width / 2, canvas.height / 2)
+ }
+
+ def run() = {
+ renderer.clearRect(0, 0, canvas.width, canvas.height)
+ if (dead > 0) runDead()
+ else runLive()
+ }
+
+ dom.setInterval(run _, 20)
+
+ canvas.onclick = (e: dom.MouseEvent) => {
+ playerV -= 5
+ }
+ }
+} \ No newline at end of file
diff --git a/examples/src/main/scala/ScratchPad.scala b/examples/src/main/scala/ScratchPad.scala
new file mode 100644
index 0000000..225e567
--- /dev/null
+++ b/examples/src/main/scala/ScratchPad.scala
@@ -0,0 +1,38 @@
+
+import org.scalajs.dom
+
+import scala.scalajs.js.annotation.JSExport
+
+@JSExport
+object ScratchPad extends{
+ @JSExport
+ def main(canvas: dom.HTMLCanvasElement) = {
+ /*setup*/
+ val renderer = canvas.getContext("2d")
+ .asInstanceOf[dom.CanvasRenderingContext2D]
+
+ canvas.width = canvas.parentElement.clientWidth
+ canvas.height = canvas.parentElement.clientHeight
+
+ renderer.fillStyle = "#f8f8f8"
+ renderer.fillRect(0, 0, canvas.width, canvas.height)
+
+ /*code*/
+ renderer.fillStyle = "black"
+ var down = false
+ canvas.onmousedown = (e: dom.MouseEvent)=>{
+ down = true
+ }
+ canvas.onmouseup = (e: dom.MouseEvent)=>{
+ down = false
+ }
+ canvas.onmousemove = (e: dom.MouseEvent)=>{
+ val rect = canvas.getBoundingClientRect()
+ if (down) renderer.fillRect(
+ e.clientX - rect.left,
+ e.clientY - rect.top,
+ 10, 10
+ )
+ }
+ }
+} \ No newline at end of file
diff --git a/examples/src/main/scala/Example.scala b/examples/src/main/scala/Splash.scala
index 3eba6fa..1dcc528 100644
--- a/examples/src/main/scala/Example.scala
+++ b/examples/src/main/scala/Splash.scala
@@ -4,7 +4,7 @@ import org.scalajs.dom
import scala.scalajs.js.annotation.JSExport
@JSExport
-object Example extends{
+object Splash extends{
@JSExport
def main(canvas: dom.HTMLCanvasElement) = {
@@ -21,7 +21,6 @@ object Example extends{
def h = canvas.height
def w = canvas.width
- /*example*/
var x = 0.0
type Graph = (String, Double => Double)
val graphs = Seq[Graph](