なんじゃくにっき

プログラミングの話題中心。

Scalaでゲーム作り(1) Slickを使ってHello, Worldまで

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を作成 


set SCRIPT_DIR=%~dp0
java -Xmx512M -jar "%SCRIPT_DIR%sbt-launch-0.7.3.jar" %*
とりあえず一度sbtを実行してプロジェクトのディレクトリを作成して終了させる。
 
 
次に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._

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()
}
}

これだけでHello, Worldが黒い画面に表示される。ついでにFPSも。
java.lang.UnsatisfiedLinkError: no lwjgl in java.library.pathとか出る場合は、
JOGLのネイティブライブラリにパスが通っていない。