Skip to content

Commit 7756148

Browse files
Version 1.0 (#1)
* chore: WiP * chore: Some tidy up * bugfix: jsEnv := PhantomJSEnv(autoExit = false).value blocks testing
1 parent 07a7520 commit 7756148

File tree

8 files changed

+101
-57
lines changed

8 files changed

+101
-57
lines changed

.gitignore

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,39 @@
1-
# sbt
2-
lib_managed
3-
project/project
4-
target
1+
# Log files
2+
*.class
3+
*.log
4+
5+
# sbt specific
6+
.cache
7+
dist/*
8+
lib_managed/
9+
project/**/project
10+
project/activator-sbt*
11+
src_managed/
12+
target/
513

614
# Worksheets (Eclipse or IntelliJ)
715
*.sc
816

9-
# Eclipse
10-
.cache
17+
# Scala-IDE specific
1118
.classpath
1219
.project
1320
.scala_dependencies
1421
.settings
15-
.target
1622
.worksheet
1723

1824
# IntelliJ
19-
.idea
25+
*.iml
26+
*.iws
27+
.idea/
28+
/classes/
29+
/out/
30+
31+
# ScalaTest
2032
exportToHTML
2133

2234
# Mac
2335
.DS_Store
2436

25-
# Log files
26-
*.log
37+
# Windows
38+
desktop.ini
39+
thumbs.db

README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
# Simple HTML5 Canvas game ported to Scala.js
55

66
Original tutorial in Javascript :
7-
[how-to-make-a-simple-html5-canvas-game](http://www.lostdecadegames.com/how-to-make-a-simple-html5-canvas-game/)
7+
[How to make a simple HTML5 Canvas game](http://www.lostdecadegames.com/how-to-make-a-simple-html5-canvas-game/)
88

9-
Play the [live demo](http://goo.gl/oqSFCa).
9+
Play the [live demo](http://goo.gl/oqSFCa). Scala doc is [here](https://amsterdam-scala.github.io/Sjs-Simple-HTML5-canvas-game/docs/api/index.html#nl.amsscala.package).
10+
11+
Further Resources, Notes, and Considerations

build.sbt

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
name := "Simple Game"
2-
version := "0.0-SNAPSHOT"
3-
4-
// ** Meta data **
5-
description := "Simple HTML5 Canvas game ported to Scala.js."
6-
startYear := Some(2016)
7-
licenses += ("EUPL v.1.1", url("http://joinup.ec.europa.eu/community/eupl/og_page/european-union-public-licence-eupl-v11"))
8-
9-
organization := "nl.amsscala"
10-
organizationName := "Amsterdam.scala Meetup Group"
1+
name := "Simple Game"
2+
version := "0.0"
3+
description := "Simple HTML5 Canvas game ported to Scala.js."
4+
organization := "nl.amsscala"
5+
organizationName := "Amsterdam.scala Meetup Group"
116
organizationHomepage := Some(url("http://www.meetup.com/amsterdam-scala/"))
12-
homepage := Some(url("http://github.com/amsterdam-scala/Sjs-Full-Window-HTML5-Canvas"))
7+
homepage := Some(url("http://github.com/amsterdam-scala/Sjs-Full-Window-HTML5-Canvas"))
8+
startYear := Some(2016)
9+
licenses += "EUPL v.1.1" -> url("http://joinup.ec.europa.eu/community/eupl/og_page/european-union-public-licence-eupl-v11")
1310

1411
// KEEP THIS normalizedName CONSTANTLY THE SAME, otherwise the outputted JS filename will be changed.
15-
normalizedName := "main"
16-
12+
normalizedName := "main"
1713

1814
// ** Scala dependencies **
1915
scalaVersion in ThisBuild := "2.11.8"
2016

2117
libraryDependencies ++= Seq(
22-
"be.doeraene" %%% "scalajs-jquery" % "0.9.0",
23-
"org.scala-js" %%% "scalajs-dom" % "0.9.1",
24-
"org.scalatest" %%% "scalatest" % "3.0.0" % "test",
25-
"com.lihaoyi" %%% "scalatags" % "0.6.0"
18+
"be.doeraene" %%% "scalajs-jquery" % "0.9.0",
19+
"com.lihaoyi" %%% "scalatags" % "0.6.0",
20+
"org.scala-js" %%% "scalajs-dom" % "0.9.1",
21+
"org.scalatest" %%% "scalatest" % "3.0.0" % "test"
2622
)
23+
skip in packageJSDependencies := false // All JavaScript dependencies to be concatenated to a single file
24+
25+
scalacOptions in (Compile,doc) ++= Seq("-doc-root-content", baseDirectory.value+"/src/main/scala-2.11/root-doc.md",
26+
"-groups", "-implicits")
2727

2828
// ** Scala.js configuration **
29-
lazy val root = (project in file(".")).enablePlugins(ScalaJSPlugin)
29+
// lazy val root = (project in file(".")).
30+
enablePlugins(ScalaJSPlugin)
3031

3132
// Necessary for testing
3233
jsDependencies += RuntimeDOM
3334
scalaJSUseRhino in Global := false
34-
//testFrameworks += new TestFramework("utest.runner.Framework")
3535

3636
// If true, a launcher script src="../[normalizedName]-launcher.js will be generated
3737
// that always calls the main def indicated by the used JSApp trait.
@@ -47,15 +47,16 @@ persistLauncher in Test := false
4747

4848
// Workbench settings **
4949
if (sys.env.isDefinedAt("CI")) {
50-
println("Workbench disabled", sys.env.getOrElse("CI", "?"))
50+
println("Workbench disabled ", sys.env.getOrElse("CI", "?"))
5151
Seq.empty
5252
} else {
5353
println("Workbench enabled")
5454
workbenchSettings
5555
}
5656

5757
if (sys.env.isDefinedAt("CI")) normalizedName := normalizedName.value // Dummy
58-
else refreshBrowsers <<= refreshBrowsers.triggeredBy(fastOptJS in Compile)
58+
else // Update without refreshing the page every time fastOptJS completes
59+
updateBrowsers <<= updateBrowsers.triggeredBy(fastOptJS in Compile)
5960

6061
if (sys.env.isDefinedAt("CI")) normalizedName := normalizedName.value
6162
else // Workbench has to know how to restart your application

src/main/scala-2.11/nl/amsscala/simplegame/Page.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ protected trait Page {
1010
// Create the canvas
1111
private[simplegame] val canvas = dom.document.createElement("canvas").asInstanceOf[dom.html.Canvas]
1212
canvas.setAttribute("crossOrigin", "anonymous")
13-
private[this] val ctx = canvas.getContext("2d") // .asInstanceOf[dom.CanvasRenderingContext2D]
13+
private[simplegame] val ctx = canvas.getContext("2d").asInstanceOf[dom.CanvasRenderingContext2D]
1414
private[this] val (bgImage, heroImage, monsterImage) = (Image("img/background.png"), Image("img/hero.png"), Image("img/monster.png"))
1515

1616
/**
@@ -64,7 +64,7 @@ protected trait Page {
6464
}
6565

6666
canvas.width = dom.window.innerWidth.toInt
67-
canvas.height = dom.window.innerHeight.toInt - 24
67+
canvas.height = dom.window.innerHeight.toInt - 25
6868
println(s"Dimension of canvas set to ${canvas.width},${canvas.height}")
6969
canvas.textContent = "Your browser doesn't support the HTML5 CANVAS tag."
7070

src/main/scala-2.11/nl/amsscala/simplegame/game.scala

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ protected trait Game {
6262
* @param monstersCaught The score
6363
* @param newGame Flags new game
6464
*/
65-
private case class GameState(
65+
case class GameState(
6666
hero: Hero[Int],
6767
monster: Monster[Int],
6868
monstersCaught: Int = 0,
@@ -132,7 +132,7 @@ private case class GameState(
132132
* @param pos Monsters' position
133133
* @tparam T Numeric generic abstraction
134134
*/
135-
private class Monster[T: Numeric](val pos: Position[T]) {
135+
class Monster[T: Numeric](val pos: Position[T]) {
136136
override def equals(that: Any): Boolean = that match {
137137
case that: Monster[T] => this.pos == that.pos
138138
case _ => false
@@ -143,15 +143,15 @@ private class Monster[T: Numeric](val pos: Position[T]) {
143143
pos.isValidPosition(Position(canvas.width, canvas.height).asInstanceOf[Position[T]], Hero.size.asInstanceOf[T])
144144
}
145145

146-
private object Monster {
146+
object Monster {
147147
// def apply[T: Numeric](pos: Position[T]) = new Monster(pos)
148148
def apply[T: Numeric](x: T, y: T) = new Monster(Position(x, y))
149149
}
150150

151-
private class Hero[A: Numeric](override val pos: Position[A]) extends Monster[A](pos)
151+
class Hero[A: Numeric](override val pos: Position[A]) extends Monster[A](pos)
152152

153153
/** Compagnion object of class Hero */
154-
private object Hero {
154+
object Hero {
155155
val size = 32
156156
val speed = 256
157157

src/main/scala-2.11/root-doc.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
This is the documentation for a simple HTML5 Canvas game written in Scala, and cross compiled to run in the browser targeting the HTML5 Canvas.
2+
3+
== Package structure ==
4+
5+
Notable packages include:
6+
7+
- [[nl.amsscala.simplegame `nl.amsscala.simplegame`]]

src/test/scala-2.11/nl/amsscala/simplegame/GameSuite.scala

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -76,26 +76,12 @@ class GameSuite extends SuiteSpec {
7676
game.updateGame(1D, mutable.Map(Down -> dummyTimeStamp, Right -> dummyTimeStamp), canvas) shouldBe games.last
7777

7878
}
79-
it("sad path") {
80-
// Illegal key code
79+
it("sad path") { // Illegal key code
8180
game.updateGame(1D, mutable.Map(0 -> dummyTimeStamp), canvas) shouldBe game
8281
}
8382
it("bad path") { // No move due a of out canvas limit case
8483
game.updateGame(1.48828125D, mutable.Map(Right -> dummyTimeStamp, Down -> dummyTimeStamp), canvas) shouldBe game
8584
}
86-
it("experiment") {
87-
88-
println(games.mkString("\n"))
89-
90-
val gs = new GameState(canvas, -1, false)
91-
canvas.setAttribute("crossOrigin", "anonymous")
92-
val ctx = canvas.getContext("2d").asInstanceOf[dom.CanvasRenderingContext2D]
93-
94-
val y: scala.collection.mutable.Seq[Int] =
95-
ctx.getImageData(0, 0, canvas.width, canvas.height).data // .asInstanceOf[js.Array[Int]]
96-
97-
println(s"Data, ${y.hashCode()}")
98-
}
9985

10086
}
10187
}

src/test/scala-2.11/nl/amsscala/simplegame/PageSuite.scala

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,47 @@ package nl.amsscala.simplegame
22

33
import org.scalajs.dom
44

5-
class PageSuite extends SuiteSpec /*with Page*/ {
6-
val page = new Page {}
5+
import scala.scalajs.js
6+
import scalatags.JsDom.all._
7+
8+
class PageSuite extends SuiteSpec {
9+
val page = new Page {
10+
canvas.width = 1242 // 1366
11+
canvas.height = 674 // 768
12+
}
13+
714
describe("A Hero") {
815
describe("should tested within the limits") {
916

1017
it("good path") {
18+
{
19+
page.render(GameState(Hero(621, 337), Monster(0, 0), 0, false))
20+
val imageData: scala.collection.mutable.Seq[Int] =
21+
page.ctx.getImageData(0, 0, page.canvas.width, page.canvas.height).data
22+
23+
imageData.hashCode() shouldBe -1753260013
24+
}
25+
26+
{
27+
page.render(GameState(Hero(365, 81), Monster(0, 0), 0, false))
28+
29+
dom.document.body.appendChild(div(
30+
cls := "content", style := "text-align:center; background-color:#3F8630;",
31+
canvas
32+
).render)
33+
34+
val imageData = page.ctx.getImageData(0, 0, page.canvas.width, page.canvas.height)
35+
36+
// imageData.data.sum shouldBe -1753260013
37+
}
38+
39+
{
40+
page.render(GameState(Hero(877, 593), Monster(0, 0), 0, false))
41+
val imageData: scala.collection.mutable.Seq[Int] =
42+
page.ctx.getImageData(0, 0, page.canvas.width, page.canvas.height).data
43+
44+
imageData.hashCode() shouldBe -1753260013
45+
}
1146

1247
}
1348

0 commit comments

Comments
 (0)