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でも特に問題はないです。
読み込み中
クリックでキャンセルします
画像が存在しません