サイトトップ

Director Flash 書籍 業務内容 プロフィール

Macromedia Director非公式テクニカルノート

ビヘイビアインスタンス間のメッセージ[上級テクニック]

ID: FN0108007 Product: Director

Platform: All
Viersion: 7.0 and above

1. ビヘイビアのインスタンスとメッセージ
ビヘイビアのインスタンスメッセージのやりとりに関しては、Macromediaテクニカルノート[DR0265]「ビヘイビアのインスタンスとメッセージ(1)」および[DR0266]「同(2)」、[DR0267]「同(3)」に詳しい解説があります。本稿では、上級テクニックとしてその応用例をご紹介します(前掲テクニカルノートの理解を前提としますので、必要に応じてこれらをご参照ください)。

2. オートタブのサンプルビヘイビア
複数スプライトのビヘイビア間でインスタンスを持ち合う手法のサンプルとして、編集可能フィールドをtabキーで移動させるビヘイビアをご紹介します。Directorのフィールドキャストメンバープロパティには、オプションとしてこの設定があります。けれど、shift + tabで逆戻りができません。このビヘイビアを複数のフィールドスプライトに設定すると、tabでつぎのフィールドスプライト、shift + tabで前のフィールドスプライトにカーソルが移動します。この順序は、スプライト番号の小さい順です。

-- [オートタブビヘイビア]
-- フィールドスプライトに設定
property spriteNum, plInstances

on beginSprite(me)
  sendAllSprites(#xCollectInstance, [])
-- パラメータとしてリストを渡す
  sprite(me.spriteNum).member.editable = true
end

on endSprite(me)
  plInstances.deleteOne(me)
end

on xCollectInstance(me, lListPointer)

  -- インスタンスをリストに格納
  plInstances = lListPointer
  lListPointer.append(me)
end

on keyDown(me)
  if the key = tab then
-- tabキーが押されたら
    me.xAutoTabing() -- フォーカスを移す
  else -- タブ以外のキーが押されたら
    pass -- フィールドに入力
  end if
end

on xAutoTabing(me)
  -- つぎにフォーカスを移すインスタンスを取得
  oNextInstance = me.xGetNextInstance()
  -- そのインスタンスに直接メッセージを送る
  oNextInstance.xFocus()
end

on xGetNextInstance(me)

  -- 現在フォーカスのあるフィールドのリスト中の位置を取得
  nCurrentPos = plInstances.getOne(me)
  -- リストのインスタンスの個数を取得
  nAmount = plInstances.count()
  -- つぎにフォーカスを移すフィールドのリスト中の位置を取得
  nNextPos = ((nCurrentPos + the shiftDown * (nAmount - 2)) mod nAmount) + 1
  -- フォーカスを移すフィールドのインスタンスを返す
  return plInstances.getAt(nNextPos)
end

on xFocus(me)

  -- キーボードのフォーカスを移す
  the keyboardFocusSprite = spriteNum
end

ビヘイビアの構造は、コメントに記述してあります。ポイントだけ、説明しましょう。まず、'on beginSprite'の第1ステートメントで、メッセージ#xCollectInstanceとともにリストをパラメータとして渡しています。前出Macromediaテクニカルノート「ビヘイビアのインスタンスとメッセージ(3)」で紹介されている複数ビヘイビア間でインスタンスを持ち合う手法です。第2ステートメントは、単にフィールドキャストメンバーを編集可能に設定しているだけです。スコア上で別途設定してあれば、必要ありません。

on xCollectInstanceハンドラでは、第1ステートメントで、渡されたリストへの参照をプロパティplInstancesに割り当てています。つぎに第2ステートメントで、リストにはスプライト番号ではなくビヘイビアインスタンス自身を格納しています。したがって、plInstancesは、インスタンスのリストとなり、インスタンスに対して直接メッセージが送れることになります。これが、このビヘイビアの第1のポイントです。

'on keyDown'ハンドラでは、押されたキーがtabキーのときにxAutoTabingを実行します。on xAutoTabingハンドラはキーボードのフォーカスを移す処理をしています。この第1ステートメントは、ユーザー定義関数xGetNextInstanceにより、つぎにフォーカスを移すフィールドスプライトのビヘイビアインスタンスを取得しています。これがこのビヘイビアのポイントの2つ目です。これはプロパティplInstancesが、インスタンスのリストを保持しているからできることです。第2ステートメントで、その取得したインスタンスに対し直接xFocusメッセージを送ります。すると、つぎにフォーカスを移すスプライトのビヘイビアインスタンスだけにxFocusメッセージが送られることになります。ですから、そのメッセージを受けたビヘイビアインスタンスのon xFocusハンドラだけが実行され、キーボードのフォーカスがそのフィールドスプライトに移るのです。

on xGetNextInstanceハンドラは、つぎにフォーカスを移すスプライトのインスタンスを、plInstancesから取り出して返します。'keyDown'メッセージを受取ったのは現在フォーカスのあるスプライトですから、そのmeパラメータで自分のインスタンスは特定できます。第1ステートメントは、リストplInstances中の自分の位置を取得しています。押されたのがtabのみでしたらリスト中のつぎ、shiftキーも押されていたらリスト中手前の位置のインスタンスが、つぎにフォーカスを移す対象になります。しかし、リストの一番最後でtabキーを押されたら1番目に、1番目でshit + tabを押されたら最後に戻る必要があります。

その準備として第2ステートメントはリスト中のインスタンスの個数を取得しています。第3ステートメントが、このハンドラ中のポイントです。通常なら'shftDown'を判定する'if...then'構文にするところを1行の式で済ませています。'shiftDown'は真か偽かにより、1か0を返します。それを式の中で利用して、つぎにフォーカスを移すインスタンスの位置を計算しています。ここは、nCurrentPosやnAmountにどういう値を入れると、どういう値が返るかを計算して確かめてみるとよいでしょう。最後のステートメントで、つぎにフォーカスを移す位置にあるインスタンスを取り出して、返しています。

最後に1点補足しておきます。on xGetNextInstanceハンドラの第2ステートメントで、毎回インスタンスの個数を数えるのは非効率に思われるかもしれません。しかし、このビヘイビアはダイナミックにフィールドのスプライト数が変わることを想定しています。したがって、途中でフィールドスプライトが減っても、正しく動作します。それは、'on endSprite'ハンドラでplInstancesから自分のインスタンスを削除しているからです。また、フィールドスプライトが加わっても、今度はその'on beginSprite'でプロパティplInstancesのインスタンスが設定し直されます。

_____

作成者: 野中文雄
更新日: 2003年7月6日 Macromediaテクニカルノートのリンク切れ修正
作成日: 2001年8月13日


Copyright © 2001-2006 Fumio Nonaka.  All rights reserved.