Doc:JA/2.4/Tutorials/Game Engine/Resources/BGE Tutorials/Python Tutorials/Position To Mouse

提供: wiki
移動先: 案内検索

General

Goal

(目的)

このチュートリアルは、Mouse センサーからマウスの位置を読むスクリプトの書き方をお見せするものです。この情報は、オブジェクトの位置を操作するのに使われます。

Remarks

(注意点)

この答えはたくさんあります。ご覧のように他にもたくさんチュートリアルがあります。

Direct Copy

(直接コピー)

このチュートリアルは、マウス位置の値をオブジェクトの中心に直接コピーします。

Advantages

(利点)

  • コードが短い
  • 実装が容易
  • 理解しやすい

Downside

(欠点)

  • 非常に柔軟性に欠ける

Preparation

(準備)

  • デフォルトのシーンを使って始めます
  • Game Engine モードに切り替えます
  • Cube オブジェクトが一つあることを確認してください
  • Cubeに、以下のロジックを施します

Sensors

(センサー)

初めにいつも行うべきなのは、いつコードを実行すべきか考えることです。わたしたちの場合

  • マウスカーソルの位置が変わるたびに、オブジェクトの位置を更新したい

言い換えると:

  • マウス位置が変化しなければ更新しません

どうやってこれができるでしょう? マウスセンサーを Movement モードで使います。マウスカーソルが動いたときと止まったときに、これで Python コントローラーを作動させます。

「変わるたびに」と言いましたが、マウスカーソルが動くたびに、Python コントローラーを確実に作動させる必要があります。True Pulse モードを有効化してこれを行います。

False Pulse モードは必須ではなく、パフォーマンスを低下させるでしょう。

Controllers

(コントローラー)

ひとつだけコントローラーが必要です。MODULE モードの Python コントローラーです。 テキスト項目に入力してください:

DirectCopy.mouseXYToObjXZ

マウスセンサーを Python コントローラーに接続します。

Python Code

(Python コード)

このチュートリアルは Module モードを使います!

新規テキストブロックを開きます。"DirectCopy.py" という名前にしてください。

Module モード用に、Python コントローラーから呼び出し可能なモジュールメンバー(関数)が必要です。こうした関数はパラメーターを持たないか、1つ持てます。このパラメーターは実行中のコントローラーへの参照です。 メンバー名には役割を推測でき、コードを読む必要がなくなるような意味のある名前を選んでください。

わたしたちは "mouseXYToObjXZ" という名前を選びました。

def mouseXYToObjXZ(cont):

ここで、Python コードがいつ実行されるのか思い出す必要があります。接続しているセンサーがコントローラーを作動させたときです。今回はセンサーはひとつ - マウスの動きのセンサーです。コントローラーが Python コードを実行するのは:
A) マウスカーソルが動き始めたとき
B) マウスカーソルが動いているとき
C) マウスカーソルが動きを止めたとき

C) の場合はコードを実行する必要はありません。したがってはじめに行うのはセンサーの状態を調べることです:

def mouseXYToObjXZ(cont):
  sensor = cont.sensors[0] # 接続しているセンサーのリスト中、最初のセンサー
  if not sensor.positive:
    return # マウスカーソルが動くのをやめれば抜ける

この先は次のことが言えます

  • マウスカーソルが動いた
  • センサーはひとつしか接続していないので、sensor はマウスセンサーである

ですからマウス位置を取得しましょう。

  ...
  mouseXY = sensor.position # マウス位置の X と Y 位置を含むリストを返します

オブジェクトを取り出してその位置を変更しましょう。今回はコントローラーを所有するオブジェクトです:

  ...
  own = cont.owner # own はこれで GameObject への参照になります

次はオブジェクトの位置を操作します。でも待ってください。オブジェクトの位置を、シーン(World)と親(Local)のどちらに相対的に操作したいのか決める必要があります。わたしたちの Cube は誰とも親子関係にないので結果は同じですが、あとで考えが変わる可能性もあります。親(Local)に相対的にするほうがよいでしょう。

まずは現在位置を取り出します

  ...
  currentPosition = own.localPosition

それから位置を操作します

  ...
  currentPosition[0] = mouseXY[0] # idx 0 = X
  currentPosition[2] = mouseXY[1] # idx 2 = Z; idx 1 = Y

それを書き戻します

  ...
  own.localPosition = currentPosition
Blender 2.5+

最後のステップは 2.5 では必須ではないかもしれませんが、行ったほうがよいでしょう。

最後に:

  • P でゲームを開始します

おめでとうございます、あなたはもう、マウスでオブジェクトを動かすことができます。