2010年10月23日土曜日

オブジェクトの描画

object ACT3D.initに以下を追加

GL11.glClearColor(0, 0, 0, 0)
GL11.glEnable(GL11.GL_DEPTH_TEST)
GL11.glViewport(0, 0, width, height)
GL11.glMatrixMode(GL11.GL_PROJECTION)
GL11.glLoadIdentity
GL11.glFrustum(-halfWidth, halfWidth, -halfHeight, halfHeight, 100, 10000)

次に、 オブジェクトの描画です。

GLUTオブジェクトを使って簡単に何か描こうと思っていたのですが、LWJGLにはGLUTはない模様・・・
なので、GLUオブジェクトを使って描きます。

object ACT3D
@throws(classOf[LWJGLException])
def run {
  val sphere = new Sphere
  sphere.setDrawStyle(GLU.GLU_LINE)
  while (running) {
    Display.update
    if (Display.isCloseRequested) {
      running = false
    } else {
      GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT)
      GL11.glMatrixMode(GL11.GL_MODELVIEW)
      GL11.glLoadIdentity
      GLU.gluLookAt(0, 150, 50, 0, 0, 0, 0, 1, 0)
      GL11.glColor3f(1, 1, 1)
      sphere.draw(50, 10, 10)
      Display.swapBuffers
      Display.sync(fps)
    }
  }
}

これを実行すると、


 こんな感じで、球が描画されます。

今回使っているglFrustumやgluLookAtは、私にはまだ到底説明できないものなので、Googleなどで調べてもらえるとありがたいです。
読み込み中
クリックでキャンセルします
画像が存在しません

2010年10月10日日曜日

ディスプレイの表示

まずは、ディスプレイの設定と作成です。

object ACT3D
@throws(classOf[LWJGLException])
def init {
  val mode = Display.getAvailableDisplayModes.find(m => m.getWidth == width && m.getHeight == height) match {
    case Some(m) => m
    case None => {
      println("ウィンドウサイズが正しくありません。")
      throw new Exception
    }
  }
  Display.setDisplayMode(mode)
  Display.setTitle(title)
  Display.setVSyncEnabled(true)
  Display.setSwapInterval(1)
  Display.create
}

setDisplayModeのところですが、利用可能なディスプレイモードから指定した横幅、縦幅のディスプレイモードを取得し、それを設定をしています。
ディスプレイモードの設定以外はやらなくても動きます。垂直同期は有効にするとちらつきがなくなるそうです。

次にディスプレイの更新をします。

object ACT3D
@throws(classOf[LWJGLException])
def run {
  while (running) {
    Display.update
    if (Display.isCloseRequested) {
      running = false
    } else {
      Display.sync(fps)
    }
  }
}

これでクローズがリクエストされるまで指定のFPSでディスプレイが更新されます。
最後に後処理です。ACT3Dのcleanupにこの一行を加えます。

Display.destroy

これでディスプレイが表示できるはずです。
実行するときの注意ですが、VM引数に-Djava.library.path="ネイティブライブラリへのパス"を忘れないようにしましょう。

次回は、ディスプレイに何か表示しようと思います。

2010年10月9日土曜日

LWJGLについてと、プログラムの基本的な流れ

このゲームはLWJGLというライブラリを使います。
このライブラリの説明を見ると、

「LWJGLはOpenGL、OpenALなどのクロスプラットフォームライブラリのラッパーや、ゲームコントローラーを扱うライブラリを提供しています。」

といった感じですが、正直なところ、OpenGLのような低次元ライブラリでプログラムを組むのは大変だと思います。
私がこのライブラリを選んだのは、プログラミングの勉強のためなので、冗長な処理を書きたくないというのであれば、他のライブラリをお勧めします。

さて、前置きはこのくらいにしておいてプログラムを書き始めましょう。

package com.halcat.game.act3d

object ACT3D {

  def init {
  }

  def run {
  }

  def cleanup {
  }

  def main(args: Array[String]) {
    try {
      init
      run
    } catch {
      case e => {
          e.printStackTrace
          exit(1)
        }
    }
    finally {
      cleanup
    }
    exit(0)
  }

}

こんな感じでしょうか?
initで初期化して、runで実行、最後にcleanupで後処理をして終了。
これが、このプログラムの基本的な流れになります。
このあと、initの中でいろいろなものを設定して、runの中にゲームループを作っていくのですが、とりあえず今回はここまでです。

次回はディスプレイの表示をしようと思います。

2010年10月5日火曜日

開発環境について

私がScalaでプログラミングするときに使っているIDEはEclipseですが、IntelliJ IDEANetBeansなどScalaには様々なIDEがあります。
IDEを使わずとも、テキストエディタとMavenなどのプロジェクト管理ツールを使えばスムーズに開発できることでしょう。
ScalaはJVMで動くのでJavaのインストールも忘れずに。

自分好みの環境を作って楽しくプログラミングしましょう!

次のエントリーは、使うライブラリについてと、少しプログラムを書いてみようと思います。

ゲーム制作開始

こんにちは!

色々と忙しくて2ヶ月ほど放置していたのですが、そろそろ真面目になにかプログラムについて書いていこうかな〜なんて思い、
「Scala+LWJGLでつくる3D格闘ゲーム」
というものを作っていこうと思います。

・・・・う〜ん、これはハードル高くて途中で投げ出すかもしれないですねー
めげずにがんばろうとおもいます。

次のエントリーでは、開発環境について少し書きます。