2010年11月19日金曜日

EmacsでScalaプログラミング

1週間ぐらい前ですが、Scalaでの開発はEclipseからEmacsにかえました。
理由は、Eclipseが補完をするときに動作がとても重くなることで、これはちょっとしたストレスになっていました。
そこで、今勉強中のEmacsでScalaの開発ができるプラグインを探したところ、ENSIME という素晴らしいものを見つけました。

Emacs+sbt+ENSIME+ECB


ENSIMEの導入は、scala-modeやyasnippet必要なので少し面倒かもしれません。
私は、よりIDE風にするため、ECB(Emacs Code Browser)も使っています。

ENSIMEはEclipseのプラグインよりも動作が軽く、sbtやmavenとの連携も楽にできるのでとてもおすすめです。

2010年11月7日日曜日

コントローラーを使用する

コントローラーを作成、選択するために以下のものを作成しました。

Controller.scala
package com.halcat.game

import org.lwjgl.input._
import org.lwjgl.util.input._
import org.eclipse.swt._
import events._
import layout._
import widgets._

object Controller {

  private var controller: Controller = _

  def create {
    Controllers.create
    val display = new Display
    val shell = new Shell(display, SWT.DIALOG_TRIM)
    val count = Controllers.getControllerCount
    var index = 0
    if (count != 0) {
      shell.setLayout(new GridLayout(1, false))
      shell.setText("コントローラーの選択")
      val label = new Label(shell, SWT.CENTER)
      label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER))
      label.setText("使用するコントローラーを選択してください。")
      label.pack
      val group = new Group(shell, SWT.SHADOW_OUT)
      group.setLayout(new FillLayout(SWT.VERTICAL))
      for (i <- 0 to count) {
        val radioButton = new Button(group, SWT.RADIO)
        if (i == 0)
          radioButton.setSelection(true)
        if (i == count)
          radioButton.setText("何も選択しない")
        else
          radioButton.setText(Controllers.getController(i)
            .getName)
        radioButton.addSelectionListener(new SelectionAdapter {
          override def widgetSelected(e: SelectionEvent) {
            index = i
          }
        })
        radioButton.pack
      }
      group.pack
      val okButton = new Button(shell, SWT.PUSH)
      okButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END))
      okButton.setText("OK")
      okButton.addSelectionListener(new SelectionAdapter {
        override def widgetSelected(e: SelectionEvent) {
          shell.dispose
        }
      })
      okButton.pack
      shell.pack
      shell.open
      while (!shell.isDisposed)
        if (!display.readAndDispatch)
          display.sleep
      display.dispose
      controller = if (index != count)
        Controllers.getController(index)
      else
        new ControllerAdapter
    } else {
      controller = new ControllerAdapter
    }
  }

  def destroy = Controllers.destroy

  def poll = Controllers.poll

}

認識したコントローラーの名前を表示し、選択したラジオボタンのインデックスからコントロラーを作成しています。

ACT3D.initの先頭にController.createを追加し、ACT3D.cleanupにController.destroyを追加します。

実行すると、


このようなウィンドウが表示され、コントローラーを選択できるようになります。
「何も選択しない」を選ぶと、controllerにはダミーが入れられます。
 controllerにダミーが入っている場合は、キーボード操作になる予定です。

このプログラムにはSWTが使われていますが、LWJGLが環境依存なので、それに合わせて使っているだけです。
SwingやAWTでも特に問題はないです。
読み込み中
クリックでキャンセルします
画像が存在しません

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格闘ゲーム」
というものを作っていこうと思います。

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

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

2010年8月3日火曜日

ブログはじめました

ブログはじめましたー・・・・・いや、移転といった方がいいのかな?やはり、自分で管理するよりも企業に頼る方がよっぽど楽ですねぇ・・・記事を書くのもこちらの方が簡単ですし。
このブログでは、プログラミングのことについていろいろと書きたいと思っております。まだまだ未熟者なので、なにか間違いなどがありましたらコメントをいただけるとありがたいです。