
import "sample_app.rs" ;


class	SpriteActionRunnable
			implements Runnable, SampleApp.InputDispatcher
{
	// スプライト優先度
	public static const int	PRIORITY_NORMAL		= 0 ;
	public static const int	PRIORITY_MSGBOX		= -100 ;
	public static const int	PRIORITY_CURTAIN	= -200 ;


	public SampleApp		m_app ;
	public BasicFormParser	m_formParser ;
	public RectangleSprite	m_sprBlack ;


	public SpriteActionRunnable( SampleApp app )
	{
		m_app = app ;
		m_formParser = new BasicFormParser() ;

		initialize() ;
	}

	// 初期化
	public void initialize( void )
	{
		m_formParser.openPackage( "msgbox.noa" ) ;
		m_formParser.loadForm( "msgbox.xmlfrm" ) ;
		m_formParser.closePackage() ;
		m_formParser.buildImageAtlas() ;
	}

	// メイン関数
	public void run( void )
	{
		Sprite	sprGroup = new Sprite() ;

		// 矩形準備
		RectangleSprite	sprRect = new RectangleSprite() ;
		sprRect.setRectangleSize( 512, 512 ) ;
		sprRect.setRectangleColor( 0xff0080ff ) ;
		sprRect.setCenterPosition( 256, 256 ) ;
		sprRect.setPosition( 640, 360 ) ;
		sprGroup.addChild( sprRect ) ;

		// 回転アクション
		SpriteAction	action = new SpriteAction() ;
		action.setRotationTo( sprRect, 360, 1, 1 ) ;
		action.setActionType( SpriteAction.actionLoop ) ;
		action.setDuration( 3000 ) ;
		sprRect.addAction( action ) ;

		// 表示開始とフェードイン
		sprGroup.changePriority( PRIORITY_NORMAL ) ;
		sprGroup.setTransparency( 0x100 ) ;
		sprGroup.setActionLinearTo( 1000, 0 ) ;
		m_app.getWindow().addChild( sprGroup ) ;
		m_app.waitFor( function() : boolean { return !sprGroup.isAction() ; } ) ;

		// 仮想ジョイスティック ① ボタン押下待ち
		// ※input_filter.xml で 'Z' / Return / マウス左ボタン割り当て
		VirtualInput	input = m_app.getInput() ;
		input.resetJoyButtonPushed( VirtualInput.joyButton1 ) ;
		//
		m_app.waitFor( function() : boolean
			{ return input.getJoyButtonPushed(VirtualInput.joyButton1) >= 1 ; } ) ;

		// フェードアウト
		sprGroup.setActionLinearTo( 1000, 0x100 ) ;
		m_app.waitFor( function() : boolean { return !sprGroup.isAction() ; } ) ;

		m_app.getWindow().detachChild( sprGroup ) ;
		sprGroup.detachChild( sprRect ) ;
	}

	// コマンド処理
	public boolean onCommand( VirtualInput.Command cmd, int modal )
	{
		if ( modal < SampleApp.MODAL_EXCLUSIVE )
		{
			if ( cmd.strID == VirtualInput.Command.AppExit )
			{
				m_app.pushModal( SampleApp.MODAL_EXCLUSIVE ) ;
				onCommandAppExit() ;
				m_app.popModal() ;
				return	true ;
			}
		}
		else
		{
			// MODAL_EXCLUSIVE では処理しない
			return	true ;
		}
		return	false ;
	}

	public boolean onInputEvent( VirtualInput.InputEvent iev, int modal )
	{
		return	false ;
	}

	// 終了確認メッセージボックス
	public void onCommandAppExit( void )
	{
		// メッセージボックス・フェードイン
		Sprite	sprMsgBox = m_formParser.createFormedSprite( "msgbox_exit" ) ;
		sprMsgBox.changePriority( PRIORITY_MSGBOX ) ;
		sprMsgBox.setCenterPosition
			( SampleApp.SCREEN_WIDTH / 2, SampleApp.SCREEN_HEIGHT / 2 ) ;
		sprMsgBox.setPosition
			( SampleApp.SCREEN_WIDTH / 2, SampleApp.SCREEN_HEIGHT / 2 ) ;
		sprMsgBox.setZoom( 0.1, 0.1 ) ;
		sprMsgBox.setTransparency( 0x100 ) ;
		m_app.getWindow().addChild( sprMsgBox ) ;
		sprMsgBox.setActionLinearTo
			( 300, 0, null, new Vector2D( 1, 1 ), 2, 0 ) ;

		// 入力ループ
		VirtualInput	input = m_app.getInput() ;
		VirtualInput.Command
						cmd = new VirtualInput.Command() ;
		boolean			fResultYes = false ;
		input.resetAllJoyButtonPushed() ;
		for ( ; ; )
		{
			if ( input.getCommand( cmd ) )
			{
				if ( cmd.strID == "msgbox_exit_yes" )
				{
					fResultYes = true ;
					break ;
				}
				if ( cmd.strID == "msgbox_exit_no" )
				{
					break ;
				}
				if ( cmd.strID == VirtualInput.Command.AppExit )
				{
					continue ;
				}
				// ※ MODAL_EXCLUSIVE 中なので実質何も起きないはず
				m_app.dispatchCommand( cmd ) ;
			}
			if ( input.getJoyButtonPushed(VirtualInput.joyButton2) >= 1 )
			{
				// ESC / X キー / マウス右クリック / ジョイスティック 2 ボタン
				break ;
			}
			// ※ 本当は m_app.dispatchInput も呼んだほうがいいが省略
		}

		if ( !fResultYes )
		{
			// キャンセルする場合にはメッセージボックスをフェードアウト
			sprMsgBox.setActionLinearTo
				( 300, 0x100, null, new Vector2D( 0, 0 ), 0, 2 ) ;
			m_app.waitFor( function() : boolean { return !sprMsgBox.isAction() ; } ) ;
			m_app.getWindow().detachChild( sprMsgBox ) ;

			// メインループに戻る前に入力状態をリセットしておく
			input.resetAllJoyButtonPushed() ;
			input.flushInputQueue() ;

			return ;
		}

		// 「はい」を選んだ場合には画面をフェードアウトする
		m_sprBlack = new RectangleSprite() ;
		m_sprBlack.changePriority( PRIORITY_CURTAIN ) ;
		m_sprBlack.setRectangleSize
			( SampleApp.SCREEN_WIDTH, SampleApp.SCREEN_HEIGHT ) ;
		m_sprBlack.setRectangleColor( 0xff000000 ) ;
		m_sprBlack.setPosition( 0, 0 ) ;
		m_sprBlack.setTransparency( 0x100 ) ;
		m_sprBlack.setActionLinearTo( 500, 0 ) ;
		m_app.getWindow().addChild( m_sprBlack ) ;

		m_app.waitFor( function() : boolean { return !m_sprBlack.isAction() ; } ) ;
		m_app.getWindow().detachChild( sprMsgBox ) ;

		m_app.escapeAppExit() ;
	}

	public void finalize( void )
	{
		if ( (m_app != null) && (m_sprBlack != null) )
		{
			m_app.getWindow().detachChild( m_sprBlack ) ;
			m_sprBlack = null ;
		}
	}

}


int main( String[] args )
{
	SampleApp	app = new SampleApp() ;
	app.initialize( "Sprite Action Sample" ) ;
	try
	{
		app.run( new SpriteActionRunnable(app) ) ;
	}
	finally
	{
		app.release() ;
	}
	return	0 ;
}


