2ヶ月近くブログをサボっていたけれど、トップがいつまでも4月馬鹿なのもアレなので、
久しぶりに更新。
ScalaとJOGLを用いたゲームをダラダラと作成途中。
Scala勉強会でもScalaで作ったゲームの発表をされている方がいます。
@halcatさん
http://www.slideshare.net/SanshiroYoshida/scala-6833319
@chimerastさん
http://www.slideshare.net/chimerast/scala-realtime3dprogramming
JOGLはそのままだとかなり低レベルなので、ライブラリを使った方が楽。
・LWJGL(Light Weight Java Game Library)
JOGLを使ったゲームを作るためのライブラリ。2Dも3Dも作れる。
・Slick
2Dゲーム専用。LWJGLを使っている。
・GTGE(Golden T Game Engine)
2Dゲーム専用。JOGLを使う場合はJOGLプラグインかLWJGLプラグインのどちらかを用いる。
Java 1.4
SlickかGTGEでちょっと迷ったが、GTGEは最近は更新が活発ではないようなので、
Slickを使うことにした。
とりあえず今回はScala + SlickでHello, Worldまで。
1. プロジェクト作成
※開発環境はWindows XP, sbt + Eclipse
環境が違う人は適宜読み替えて下さい。
sbtのサイトから、sbt-launch.x.x.xをダウンロードしてきて、
それと同じフォルダにsbt.batを作成
とりあえず一度sbtを実行してプロジェクトのディレクトリを作成して終了させる。
set SCRIPT_DIR=%~dp0
java -Xmx512M -jar "%SCRIPT_DIR%sbt-launch-0.7.3.jar" %*
次にSlickのライブラリをダウンロードしてきて解凍(ライブラリ単体の方ではなくて、Full Distrbution Download)。
プロジェクトの[PROJECT_HOME]/libにlwjgl.jarとslick.jarを突っ込む。
適当なディレクトリにネイティブライブラリを突っ込む(ここでは[PROJECT_HOME]/lib/lwjgl/native/windows)。
Eclipseで読み込めるプロジェクトを作成するためのプラグインを
[PROJECT_HOME]/project/pluginsに作成。
ここでは名前はMySbtProjectPlugins.scala
import sbt._class MySbtProjectPlugins(info: ProjectInfo) extends PluginDefinition(info) {
lazy val eclipse = "de.element34" % "sbt-eclipsify" % "0.7.0"
}
[PROJECT_HOME]/project/buildにプロジェクトの設定ファイルを作成。
ここでは名前はSlickDemoProject.scala
import sbt._
import de.element34.sbteclipsify._class SlickDemoProject(info: ProjectInfo) extends DefaultProject(info) with Eclipsify {
val scalaTest = "org.scalatest" % "scalatest" % "1.0"override def fork = Some(new ForkScalaRun {
val os = System.getProperty("os.name").split(" ")(0).toLowerCase match {
case "linux" => "linux"
case "mac" => "macosx"
case "windows" => "windows"
case x => x
}val newPath = System.getProperty("java.library.path") + ("lib"/"lwjgl"/"native"/os)
override def runJVMOptions = super.runJVMOptions ++ Seq("-Djava.library.path=" + newPath)override def scalaJars = buildScalaInstance.libraryJar :: buildScalaInstance.compilerJar :: Nil
})
}
これで
sbt update
とするとEclipseで読み込めるプロジェクトが生成される。
2. Hello, World
import org.newdawn.slick._これだけでHello, Worldが黒い画面に表示される。ついでにFPSも。class SimpleTest(title: String) extends BasicGame(title: String) {
override def init(container: GameContainer ): Unit = {}
override def update(container: GameContainer, delta: Int): Unit = {}
override def render(container: GameContainer, g: Graphics): Unit = {
g.drawString("Hello, World!", 0, 100)
}
}object SimpleTest {
def main(args: Array[String]): Unit = {
val app = new AppGameContainer(new SimpleTest("Demo!"))
app.start()
}
}
java.lang.UnsatisfiedLinkError: no lwjgl in java.library.pathとか出る場合は、
JOGLのネイティブライブラリにパスが通っていない。