Ren'Py にはマウスで画面上を移動できるドラッグドロップ displayable があります。ドラッグの使用法としては次があります :
ウィンドウの位置合わせ、ウィンドウ位置を記憶できるようにする。
カードを画面上でドラッグする必要のあるカードゲーム ( 例えばソリティア )。
アイテムシステム。
ドラッグで並び順を変えるシステム。
ドラッグドロップ displayable は、上記やその他の場面においてドラッグドロップを実装できるようにします。ここに関係する2つのクラスがあります。 Drag クラスは、スクリーン上をドラッグできるもの、またはその上にドロップされたドラッグ可能なものを受け取れるもの、その両方が出来るもののいずれかを表します。 DragGroup クラスは Drag のグループを表します。ドラッグドロップを実行するためには、両方の Drag が同じドラッググループに属していなければなりません。
ドラッグドロップシステムは スクリーン言語 を通してか、または直接 displayable として使用できます。作成後に作成した Drag を参照する必要がないときは、スクリーン言語を使用すると良いでしょう。これはドラッグ可能オブジェクトが、ユーザーがスクリーン上に配置したウィンドウである場合などです。作成後も作成した Drag を参照する必要がある場合は、直接 Drag を作成し、それらを DragGroup に追加すると良いでしょう。
Drag
(d=None, drag_name=None, draggable=True, droppable=True, drag_raise=True, dragging=None, dragged=None, dropped=None, drag_handle=(0.0, 0.0, 1.0, 1.0), drag_joined=..., clicked=None, hovered=None, unhovered=None, mouse_drop=False, **properties) linkそれを囲んでいる領域上でドラッグ可能なオブジェクトを表わす displayable です。 Drag は他の Drag がドロップ可能な領域も表現できます。
その内側で Drag が移動可能なものを親と呼びます。一般的には親は Fixed()
か DragGroup
であるはずです。
Drag は子を一つ持ちます。子の状態はドラッグドロップ処理の状態を反映します。 :
selected_hover
ドラッグされている時。
selected_idle
その上にドロップ可能な時。
hover
- マウスがクリックされればドラッグ可能オブジェクトがドラッグされる時。
idle
それ以外。
ドラッグで持てる部分はその子の内側の長方形です。ドラッグやクリックを実行するためにはマウスが Drag のその部分のピクセル上になければなりません。 focus_mask
プロパティーが True なら、さらにそのピクセルが不透明でなければなりません。
新しく作成されたドラッグ可能なオブジェクトはデフォルトの DragGroup に追加されます。 ドラッグ可能オブジェクトは 一つの DragGroup にのみ所属できます。二つ目のグループに追加すると、最初のものからは削除されます。
Drag が最初にレンダリングされる時に、それが所属する DragGroup からその座標を決定できない場合その左上の座標が基本的なレイアウトアルゴリズムを使用して算出されます。いったん座標が算出されると、その Drag に保存された座標を優先し、レイアウトプロパティーは無視されます。
与えられると、この Drag の子になります。 None でなければ Drag はこれに優先して child スタイルを使用します。
None を指定するかこのドラッグ可能オブジェクトの名前を指定します。これはドラッグ可能オブジェクトの name プロパティーとして利用できます。もし同じ名前の Drag がその DragGroup に所属しているまたはしていたならこの Drag の最初の座標はそのドラッグ可能オブジェクトから受け取ります。
True の場合、Drag はスクリーン上をマウスでドラッグできます。
True なら他の Drag がこの Drag 上にドロップ可能です。
True ならこの Drag がドラッグされたときにトップまで持ち上げられます。他の Drag と接続されていたら、すべての接続された Drag も持ち上げられます。
Drag 上でマウスが押されたとき呼び出されるコールバック ( またはコールバックのリスト ) です。ドラッグされている Drag のリストを引数に呼び出されます。このコールバックの返り値は無視されます。
Drag がドラッグ中に呼び出されるコールバック ( またはコールバックのリスト ) です。それは1つの引数で呼び出され、ドラッグされている Drag のリストです。コールバックが None 以外の値を返すと、その値はインタラクションの結果として返されます。
Drag がドラッグされた時に呼び出されるコールバック ( またはコールバックのリスト ) です。それは二つの引数で呼び出されます。一つ目はドラッグされている Drag のリストです。二つ目はその上にドロップされている Drag か、ドロップが起きていないなら None です。コールバックが None ではなく値を返すとその値はインタラクションの結果として返されます。
Drag がドロップされた時に呼び出されるコールバック ( またはコールバックのリスト ) です。それは二つの引数で呼び出されます。一つ目はその上にドロップされている Drag 二つ目はドラッグされている Drag のリストです。コールバックが None 以外の値を返すと、その値はインタラクションの結果として返されます。
dragged と dropped のコールバックが同じイベントで起こされると、 dropped コールバックは dragged が None を返したときのみ呼び出されます。
Drag が移動せずにクリックされると、引数なしで呼び出されるコールバックです。ドロップ可能オブジェクトはフォーカスを持ち、クリックすることも可能です。 コールバックが None ではなく値を返したら、その値はインタラクションの結果として返されます。
Drag が(デスクトップの場合)右クリックされるか動かさないで長押し(モバイル)すると実行されるアクションです。このトリガーがモバイルプラットフォームで早すぎる場合は config.longpress_duration
を大きくする必要があります。
子内部のドラッグ有効範囲の位置を与える (x, y, width, height) のタプルです。このタプルでは、整数はピクセルの定数として、少数は子のサイズに対する割合として解釈されます。
これは現在の Drag を引数として呼び出されます。ひとかたまりでドラッグしているドラッグ可能オブジェクトのタプル [ (drag, x, y) ] を返すことが期待されます。 x, y は Drag の互いに対するオフセットで、この drag に対するものではありません。
drag が画面外へ動かせるかの条件を判定します。 drag_joined やサイズを変更出来る drag に使用すると、その drag が完全に画面外に出て画面に戻す方法がなくなる可能性があるため危険になり得ます。
True なら、 drag はカーソル下の最初の droppable にドロップされます。デフォルトでは False で drag は重なりがもっとも大きい droppable にドロップされます。
現在ドラッグしているもののこれへのドロップを許可するか決定するコールバックです。二つの引数で呼び出され、一つ目はドロップを受け取る Drag, 二つ目はドラッグされている Drag のリストです。
d を除いてパラメーターのすべてはその Drag オブジェクトでフィールドとして ( 同じ名前で ) 利用可能です。さらに Drag がレンダリングされた後は次のフィールドが利用可能になります。
ピクセルでのその親に対する Drag の位置
ピクセルでのその親に対するドラッグ開始時のその Drag の位置
Drag の子のピクセルでの幅と高さです。
bottom
(self) linkこの displayable をその DragGroup の最下端にします。
set_child
(d) linkこの Drag の子を d に変更します。
snap
(x, y, delay=0) linkDrag の位置を変更します。 Drag が表示されていないと位置の変更は瞬間です。そうでなければ、位置の変更は delay 秒かかり、等速で移動するアニメーションが表示されます。
top
(self) linkこの displayable をその DragGroup のトップに持ち上げます。
DragGroup
(*children, **properties) linkDrag のグループを表します。ドラッグはその DragGroup 内部に制限されます。ドロップは同じ DragGroup に所属する Drag 間でのみ働きます。 Drag はそれが DragGroup の内側にあるときのみ持ち上げられます。
Fixed()
と同様に DragGroup はレイアウトされます。
DragGroup のコンストラクターに渡されるすべての位置パラメーターはその DragGroup に追加される Drag であるべきです。
ドロップが受け入れられる最小のオーバーラップするピクセル数を表す整数です。
add
(child) linkchild をこの DragGroup に追加します。 child は Drag でなければいけません。
get_child_by_name
(name) linkname の drag_name を持つ DragGroup の最初の子を返します。
remove
(child) linkDragGroup から child を除去します。
以下の say スクリーンの例では、スクリーン上をドラッグしてユーザーがウィンドウの位置を選べます。
screen say:
drag:
drag_name "say"
yalign 1.0
drag_handle (0, 0, 1.0, 30)
xalign 0.5
window id "window":
# Ensure that the window is smaller than the screen.
xmaximum 600
has vbox
if who:
text who id "who"
text what id "what"
こちらはより複雑な例で、どのようにゲームプレイにドラッグを使用して影響を与えられるかを示します。どのようにキャラクターをドラッグしてある場所に移せるかを表わしています。
init python:
def detective_dragged(drags, drop):
if not drop:
return
store.detective = drags[0].drag_name
store.city = drop.drag_name
return True
screen send_detective_screen:
# A map as background.
add "europe.jpg"
# A drag group ensures that the detectives and the cities can be
# dragged to each other.
draggroup:
# Our detectives.
drag:
drag_name "Ivy"
child "ivy.png"
droppable False
dragged detective_dragged
xpos 100 ypos 100
drag:
drag_name "Zack"
child "zack.png"
droppable False
dragged detective_dragged
xpos 150 ypos 100
# The cities they can go to.
drag:
drag_name "London"
child "london.png"
draggable False
xpos 450 ypos 140
drag:
drag_name "Paris"
draggable False
child "paris.png"
xpos 500 ypos 280
label send_detective:
"We need to investigate! Who should we send, and where should they go?"
call screen send_detective_screen
"Okay, we'll send [detective] to [city]."
さらに複雑なシステムを作るには、高度なプログラミングスキルが必要です。 Ren'Py cardgame framework は、複雑なゲームにおけるドラッグドロップの例を示すとともに、カードゲームの作成を容易にします。
as
節を使用して drag と変数を結び付け、その Drag のメソッドを呼び出すのに使用出来るようにします。
screen snap():
drag:
as carmen
draggable True
xpos 100 ypos 100
frame:
style "empty"
background "carmen.png"
xysize (100, 100)
vbox:
textbutton "London" action Function(carmen.snap, 450, 140, 1.0)
textbutton "Paris" action Function(carmen.snap, 500, 280, 1.0)