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