金子邦彦研究室人工知能,実世界DBJava でキーボード,マウス,テキスト描画,2次元グラフィックス,画像描画(Java, Jirr を使用)Jirr を使ったポップアップウインドウ

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.マウス左ボタン = マウス左ボタン;
    }
}