Kotlin on GradleからAltseedを使う

Altseedとは



言わずと知れたゲームエンジン
.Net Framework/JVMで動くすごいやつ.
ゲームエンジン - Altseed -

環境(ざっくりと)



IntelliJ IDEA
Gradle
JDK 1.8.0_162
注意:Macだと,現在のAltseedのJava版が若干古くて,エラーで起動時に終了しました.プロジェクト自体は作れます.

プロジェクトを作る



こちらの記事を読んでください.

biacco42.hatenablog.com

僕の場合はsrc/main/kotlin/wraiknyapp/Main.ktとしました.

AltseedをライブラリとしてIntelliJに追加する



こちらの記事を参考にしました.
qiita.com

Altseedの公式ページから,AltseedのJava版をダウンロードします.
IntelliJ左側のProject欄の一番上,「project_name ~/IdeaProjects/project_name」と表示されている部分,
ここに,Altseed.jar をドラッグ&ドロップしてプロジェクトに追加します.
Altseed.jarをIntelliJ上で右クリックし,Add as Libraryでライブラリに追加します.
build.gradleを開き,dependenciesの中を以下の様にします.

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile files('Altseed.jar')
}

あとは
Main.ktでasdと打つと,コード補完が働いて候補が表示されます.
IntelliJは予測の際に大文字と小文字の区別がデフォルトでされているので,オフにすることをお勧めします.
(Altseedの他言語版とは,先頭の大文字/小文字が異なる場合がある)

この状態で一度,先ほどの
20 分で IntelliJ IDEA と Gradle で Kotlin 開発環境を作って fatJar ビルドしてコマンドラインツールしたり Kotlin Playground したりする話 - たのしい人生
の記事にあるfatJarのタスクを実行することで,build/libs/以下に実行ファイルである.jarが生成されます.
この場所に
Altseed_code.dll (Windows)
libAltseed_code.dylib (Mac)
(自分のOSに合うもの,あるいは両方)をドラッグ&ドロップして追加します.

コード例


ウィンドウを表示する.

Main.kt

package hoge

fun main(args: Array<String>) {
    val isMac = System.getProperty("os.name").toLowerCase().startsWith("mac")
    val isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows")

    val path = System.getProperty("user.dir")

    when {
        isMac -> System.load(path + "/libAltseed_core.dylib")
        isWindows -> System.load(path + "/Altseed_core.dll")
        else -> {
            println("Unexpected OS: " + System.getProperty("os.name"))
            return
        }
    }

    asd.Engine.Initialize("Test", 640, 480, asd.EngineOption())

    while(asd.Engine.DoEvents()) {
        asd.Engine.Update()
    }
    asd.Engine.Terminate()
}

JVM言語では,ダイナミックリンクライブラリの読み込みを明示的に書く必要があるそうです.
以下の記事を参考にしました.
mocha-java.com

四角形を表示する.

Main.kt

package hoge

class Shikaku : asd.GeometryObject2D() {init {
    val size = asd.Vector2DF(100f, 100f)
    val rect = asd.RectangleShape()

    rect.drawingArea = asd.RectF(-size.X/2.0f, -size.Y/2.0f, size.X, size.Y)

    this.shape = rect
    this.position = asd.Vector2DF.DivideByScalar(asd.Engine.getWindowSize().To2DF(), 2.0f)
    this.color = asd.Color(255, 255, 255)
}
}

fun main(args: Array<String>) {
    val isMac = System.getProperty("os.name").toLowerCase().startsWith("mac")
    val isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows")

    val path = System.getProperty("user.dir")

    when {
        isMac -> System.load(path + "/libAltseed_core.dylib")
        isWindows -> System.load(path + "/Altseed_core.dll")
        else -> println("Unexpected OS: " + System.getProperty("os.name"))
    }

    asd.Engine.Initialize("Test", 640, 480, asd.EngineOption())

    val shikaku = Shikaku()
    asd.Engine.AddObject2D(shikaku)

    while(asd.Engine.DoEvents()) {
        asd.Engine.Update()
    }
    asd.Engine.Terminate()
}

Kotlinには演算子オーバーロードがあるのですが,Javaにはありません.
その影響で,演算子オーバーロードは使えません.
不便ですね,拡張できたらしてみようかなとも思います.

また,JavaではプロパティがないのでgetXX(), setXX()形式でメソッドが定義されています.
しかしKotlinにはプロパティがあり,その様な形式に対応していたため,C#と同じ様に書けました.
ただし,asd.Engine.WindowSizeに関しては,getWindowSize() / setWindowSize()の形で書く必要がありました.
内部でSwigがどういった変換を施しているのでしょうね.

まとめ

Kotlinからも簡単にAltseedを扱えたので,この機会に使ってみてはどうでしょうか.
今回のレポジトリは
github.com
に置いてあります.
.gitignoreは参考にでもしてください.