Jirr を使ったポップアップウインドウ
Jirr を使った,ポップアップウインドウの簡単なサンプルプログラムです. Jirr のインストールについては,jirr インストールの Web ページを見てください.
マウス・イベント処理について, MyEventReceiver で,イベントの種類を判別します.スペースキー等が押されたとき(これもイベントの一種), 内部状態を更新するとともに,新しいウインドウを開く,というプログラムです. 半透明表示(アルファ値)の設定も行なっています.
Demo.java
import net.sf.jirr.*; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; public class Demo { static { System.loadLibrary("irrlicht_wrap"); } static class MyEventReceiver extends IEventReceiver { private 内部状態 state = null; private IrrlichtDevice device = null; public void setState(内部状態 state) { this.state = state; } public void setDevice(IrrlichtDevice device) { this.device = device; } public void doToolBox( boolean b ) { // bがtrue ならば新しくウインドウを開く操作を行い,falseなら閉じる操作を行なう if ( b ) { this.createSubWindow(/* id */ 5000, 10, 10, 400, 200, /* text */ "ToolBox", /* alpha */ 180 ); } else { // 上記のidと一致させてください. IGUIEnvironment guienv = device.getGUIEnvironment(); IGUIElement root = guienv.getRootGUIElement(); IGUIElement e = root.getElementFromId(/* id */ 5000, true); if ( e != null ) e.remove(); } } public void createSubWindow( int id, int x, int y, int width, int height, String text, long alpha ) { // remove tool box if already there IGUIEnvironment guienv = device.getGUIEnvironment(); IGUIElement root = guienv.getRootGUIElement(); IGUIElement e = root.getElementFromId(id, true); if ( e != null ) e.remove(); // ウインドウを開く IGUIWindow w = guienv.addWindow(new recti(x,y,width,height), /* modal */ false, /* text */ text, /* parent */ null, id ); //ウインドウの透過度を設定 for( EGUI_DEFAULT_COLOR c : EGUI_DEFAULT_COLOR.values() ) { SColor col = guienv.getSkin().getColor(c); col.setAlpha(alpha); guienv.getSkin().setColor(c, col); } return; } public boolean OnEvent(SEvent event) { /* * キーボード・イベントの表示 */ if (event.getEventType() == EEVENT_TYPE.EET_KEY_INPUT_EVENT && event.isKeyInputPressedDown()) { // キーが押された.あるいは押し続けられている. System.out.println( "Key Press Down: " + event.getKeyInputKey() ); } if (event.getEventType() == EEVENT_TYPE.EET_KEY_INPUT_EVENT && !event.isKeyInputPressedDown()) { // キーが上がった. System.out.println( "Key Up: " + event.getKeyInputKey() ); } /* * マウス・イベントの表示 */ if (event.getEventType() == EEVENT_TYPE.EET_MOUSE_INPUT_EVENT) { System.out.println( "Mouse Event: " + event.getMouseInputEvent() ); } /* * キーコードは,マニュアルの Enum EKEY_CODE の項目を見てください */ if (event.getEventType() == EEVENT_TYPE.EET_KEY_INPUT_EVENT && event.isKeyInputPressedDown()) { if ( event.getKeyInputKey() == EKEY_CODE.KEY_RIGHT ) { state.add_x(); } else if ( event.getKeyInputKey() == EKEY_CODE.KEY_LEFT ) { state.sub_x(); } else if ( event.getKeyInputKey() == EKEY_CODE.KEY_UP ) { state.sub_y(); } else if ( event.getKeyInputKey() == EKEY_CODE.KEY_DOWN ) { state.add_y(); } // シフトキー else if ( event.getKeyInputKey() == EKEY_CODE.KEY_SHIFT ) { state.turnツールボックスオープン(); doToolBox( state.isツールボックスオープン() ); } // コントロールキー else if ( event.getKeyInputKey() == EKEY_CODE.KEY_CONTROL ) { state.turnツールボックスオープン(); doToolBox( state.isツールボックスオープン() ); } // スペースキー else if ( event.getKeyInputKey() == EKEY_CODE.KEY_SPACE ) { state.turnツールボックスオープン(); doToolBox( state.isツールボックスオープン() ); } // エスケープキー else if ( event.getKeyInputKey() == EKEY_CODE.KEY_ESCAPE ) { System.exit(0); } // Qキー else if ( event.getKeyInputKey() == EKEY_CODE.KEY_KEY_Q ) { System.exit(0); } } // マウス・イベントが無いときは,マウスホイールの値は 0 にしたい state.setマウスホイール(0); if (event.getEventType() == EEVENT_TYPE.EET_MOUSE_INPUT_EVENT) { switch(event.getMouseInputEvent()) { case EMIE_MOUSE_MOVED: { state.setマウスX( event.getMouseInputX() ); state.setマウスY( event.getMouseInputY() ); break; } case EMIE_LMOUSE_PRESSED_DOWN: { state.setマウス左ボタン(true); break; } case EMIE_LMOUSE_LEFT_UP: { state.setマウス左ボタン(false); break; } case EMIE_RMOUSE_PRESSED_DOWN: { state.setマウス右ボタン(true); break; } case EMIE_RMOUSE_LEFT_UP: { state.setマウス右ボタン(false); break; } case EMIE_MOUSE_WHEEL: { state.setマウスホイール( event.getMouseInputWheel() ); break; } } } return false; } } // メイン public static void main(String argv[]) { // イベントレシーバ MyEventReceiver receiver = new MyEventReceiver(); // 内部状態 内部状態 state = new 内部状態(); receiver.setState(state); // デバイス IrrlichtDevice device = Jirr.createDevice(E_DRIVER_TYPE.EDT_DIRECT3D9, new dimension2di(640, 480), /* bits */ 16, /* fullscreen */ false, /* stencilbuffer */ false, /* vsync */ false, /* receiver */ receiver); /* IrrlichtDevice device = Jirr.createDevice(E_DRIVER_TYPE.EDT_OPENGL, new dimension2di(640, 480), 16, false, false, false, receiver); */ receiver.setDevice(device); System.out.println("idevice = " + device); String windowCaption = "Java@Hello World! - Irrlicht Engine Demo"; device.setWindowCaption(windowCaption); IVideoDriver driver = device.getVideoDriver(); ISceneManager smgr = device.getSceneManager(); IGUIEnvironment guienv = device.getGUIEnvironment(); String text = new String(); recti rect = new recti(10, 10, 400, 30); IGUIStaticText staticText = guienv.addStaticText(text, rect, true, true, null, -1); while (device.run()) { int a = 0; int r = 100; int g = 100; int b = 100; text = "x = " + state.getX() + ", y = " + state.getY() + ", mouse x = " + state.getマウスX() + ", mouse y = " + state.getマウスY() + ", mouse wheel = " + state.getマウスホイール() + ", mouse L = " + state.isマウス左ボタン() + ", mouse R = " + state.isマウス右ボタン(); staticText.setText(text); driver.beginScene( /* backbuffer */ true, /* zbuffer */ true, new SColor(a, r, g, b)); smgr.drawAll(); guienv.drawAll(); driver.endScene(); try { // Thread.sleep(5); } catch (Exception e) { text = "Exception "; staticText.setText(text); } } device.closeDevice(); } }
内部状態.java
public class 内部状態 { private int x = 0; private int y = 0; private int マウスX = 0; private int マウスY = 0; private float マウスホイール = 0; private boolean マウス右ボタン = false; private boolean マウス左ボタン = false; private boolean ツールボックスオープン = false; public boolean isツールボックスオープン() { return ツールボックスオープン; } public void setツールボックスオープン(boolean ツールボックスオープン) { this.ツールボックスオープン = ツールボックスオープン; } public void sub_x() { x = x - 1; } public void add_x() { x = x + 1; } public void sub_y() { y = y - 1; } public void add_y() { y = y + 1; } public void turnツールボックスオープン() { this.ツールボックスオープン = !this.ツールボックスオープン; } /* * セッター,ゲッター */ public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getマウスX() { return マウスX; } public void setマウスX(int マウスx) { マウスX = マウスx; } public int getマウスY() { return マウスY; } public void setマウスY(int マウスy) { マウスY = マウスy; } public float getマウスホイール() { return マウスホイール; } public void setマウスホイール(float マウスホイール) { this.マウスホイール = マウスホイール; } public boolean isマウス右ボタン() { return マウス右ボタン; } public void setマウス右ボタン(boolean マウス右ボタン) { this.マウス右ボタン = マウス右ボタン; } public boolean isマウス左ボタン() { return マウス左ボタン; } public void setマウス左ボタン(boolean マウス左ボタン) { this.マウス左ボタン = マウス左ボタン; } }