017

Revolution でお絵描き 3 / 革命絵図師養成講座 実行編
パレットを使う
グループをバックグラウンドに扱う
パレットからカードを作成、パレットからカードを削除
サブスタックを独立したスタックファイルとして保存

the style of stack stackname
the defaultStack to stackname
create card, delete this card
clone stack stackname


RR Player に 017.rev と入れてスタックをダウンロードしてください。
Revolution の開発環境がある方は、メッセージボックスに
go stack url "http://www.kenjikojima.com/runrev/handbook/download/017.rev"
とタイプしてリターンキーを叩く事でもダウンロードできます。

最近のRunrevバージョンでは、このスクリプトで働かないツールがあります。修正版は今のところ作る予定はありませんから、ご自分で工夫してください。

さて、この型録はお絵描きアプリケーション作成が目的ではないのですが、この 2 回の流れからもう少しお絵描きアプリケーションの発展系で、Revolution の部品を考えて行く事にしました。初期のハイパーカードに影響を受けた考えなのか、XTalk で何か作ったりする時に絵本を作成したいという目的が時々あるので、絵本が配布できるファイルの作り方を考えてみます。

お絵描き自体は、もっと他の使いやすい(またはアンチエイリアスなどが使える) アプリケーションで描いたイメージを、インポートするという方が実用的ですが、ここでは作ったペイントツール類をパレットに入れています。今回の中心となる内容は、Revolution のスタンドアロンで作ったサブスタックを、メインスタックのファイルとして保存することです。その他、ページを増やしたり削ったり、いくつかの絵本を作るための部品も用意しました。絵本だけでなく、アプリケーションで作ったスタックを配布できるファイルにする、いろいろな事に応用できるかと思っています




017.rev の構成はこのふたつのウインドウです。ウインドウタイトルが「My Book」(スタック名 は myBook) となっている方が絵本のファイルになります。今回はパブリッシュが目的ですから、スタック myBook からは、ページ数表示以外の要素は取り除きました。通常こういった見かけからすると、 My Book がメインスタックですが、この017.rev では、左に見えているパレットがメインスタック(スタック名 tPalette) で、My Book はサブスタックで作られています。理由はパレットの内容は、変更する必要がないものだけで構成されて、一方 My Book は必ず変更、保存がされるためです。

まずこのスタック 017.rev が開かれる時に、メインスタック tPalette のスクリプトからこのふたつのスタックに指示を与えます。



on preOpenStack
set the style of me to palette
end preOpenStack

on openStack
open stack "myBook"
end openStack



スタックがオープンされる前に preOpenStack で、メインスタック(tPalette = me) のスタイルをパレットにします。これは開発環境の最後でこのアプリケーションを保存する時に、メインウインドウのスタイルをパレットにしておけば良いのですが、説明上ここでスクリプトを入れています。メインスタック tPalette がオープンされると同時に、サブスタック "myBook" をオープンすると上図の状態になります。

サブスタック myBook のスタックスクリプトには、パブリッシュ後のためと編集中のために、ページ数を表示するスクリプトを入れています。これ以外のスクリプトは、サブスタック myBook にありません。



on openCard
put the num of this cd &" / "& \
the num of cds of this stack into fld "tPage"
end openCard



ほぼこれと同じスクリプトが、パレットからmyBook のページを削除した時に、ページ数が正しく表示されるよう、openMyBook というハンドラーで実行されます。


ここから先は開発環境での話になります。

パレット上では、開発環境の編集用のポインターツールが働きませんから、その他の方法でスクリプトを書き込んだり、ウインドウを toplevel (オブジェクトが編集できる普通のウインドウスタイル)に直してオブジェクトの操作をします。

ひとつは、オブジェクトのスクリプトエディターを開けるショートカットを使います。例えばパレットにあるボタン「新しいページを作る」の上にブラウズツールを持っていって、オプション + コマンド(MacOS)、Cntrl + Alt (Windows) を押さえると、そのスクリプトエディターが開かれます。

もうひとつの方法は、ブラウズツールでウインドウ上(オブジェクト上) のどこでもシフト+コントロール+コマンド(MacOS) で押さえると、下の図のようにコンテクスチュアル・メニューが現れて Stack Mode からスタック(ウインドウ) のスタイルを Toplevel に変えることができます。Windows では Sift + Ctrl + 右クリックです。



注意:メインスタック tPalette をToplevel にして編集中に、ペイントツールを選んで他のペイントツールに切り替えたり、パレット上をクリックしたりすると、パレットにイメージオブジェクトが自動作成されてペイントされてしまいます。下に詳しい説明があります。

上図の Stack Mode にあるToplevel は編集可能な標準のウインドウ、Modeless、Modal はカスタムダイアログのため、そしてPalette はパレットのためのウインドウスタイルです。



では、パレットにあるボタンを上から順に説明します。

ボタン「新しいページを作る」



on mouseUp
set the defaultStack to "myBook"
create card
end mouseUp



新しいカードを、今見えているカードの次に作成するスクリプトは create card ですが、それだけではパレット上に新しいカードが作られてしまいます。新しいカードが作られるのは、Revolution では常に the defaultstack 上なので、始めに the defaultStack を "myBook" と設定すれば、サブスタック myBook にカードが作られます。

次のボタンの説明に入る前に、サブスタック myBook 上でペイントされるイメージオブジェクトが、新しいカード上でどう生成されるかを説明します。Tools メニューから Application Browser でサブスタック myBook のカードを見てみると(下図)、


グループ化されたフィールド tPage がひとつだけあります。コントロールの数としてはふたつですが。この図にある group id 1110 をオブジェクトインスペクターで見てみると(フィールドオブジェクトtPage ではなくて、グループのほうです)



一番下の「Behave like a background」にマークを付けていますから、新しく作成されるカードには自動的にそのグループが作成されます。グループとバックグラウンドの関係は、初め少し分かりにくいかもしれませんが、少しなれるといろいろと便利な点も出てきます。グループはフラッシュのシンボルと少し似ているような所もありますが、カード上に置いた時すべてのカードで同じポジションとなりますから、ひとつのカードには複数の同じグループを置く事はできません。またこの欠点からすべてのカード上のグループのポジションは、ひとつのカードのグループのポジションを変えることで統一できます(欠点は反面、だいたいは利点です)。

これによって、ページ数のフィールドが各カードに作成されるのがわかったと思いますが「それじゃペイントされるイメージはどうなっているんだー」という疑問が出てきますね。ご安心ください。私も今まで深くペイントツールを扱ったことがなかったので、知らなかったのですが、ペイントツールでウインドウスタイルがToplevel のカード上をマウスダウンした時に、ウインドウサイズのイメージオブジェクトが自動生成されます。(いやー、知りませんでした!)このパレットにあるペイントツールでしたら、鉛筆、ブラシ、バケツ、スプレイカンをカードで使った時に下の図のようにイメージオブジェクトがトップのレイヤーに作り出されます。



ですから、虫メガネツールはイメージオブジェクトがないと働かないので、

if the num of images of stack "myBook" is 0 then
beep

で、アラートを入れました。


ボタン「このページを削除」のスクリプトは以下です。



on mouseUp
if the num of cds of stack "myBook">1 then
set the defaultStack to "myBook"
put the num of this cd of stack "myBook" into tPageNum
lock screen
delete this card
open cd tPageNum-1 of stack "myBook"
openMyBook
else
beep
end if
end mouseUp



スタック "myBook" には必ず1枚のカードを残さなくてはいけないので、その条件を満たした場合だけカードが削除されます。このスクリプトも delete this card を使っていますから、デフォルトスタックを myBook に設定しないと、パレットのカードが削除されてしまいます。

delete this card

は、スクリプトを実行すると削除された次のカードがスタック上に見えるので、削除された前のカードが見える操作を入れました。そのあと openMyBook でページ数の正しい調整をしています。


さて、この017.rev の中心テーマ、ボタン「ファイルにして保存」です。



on mouseUp
ask file "" with "myStack.rev"
if it is not "Cancel" then
put it into tPath
lock screen
clone stack "myBook"
set the name of stack "copy of myBook" to "myStack"
save stack "myStack" as tPath
delete stack "myStack"
end if
end mouseUp



ask file でどこに保存するか、ファイルパスを tPath に入れたら、

clone stack "myBook"

で、スタック"myBook" の複製を作ります。スタック"myBook" から作られた複製は "copy of myBook" と言う名前になるので、スタック名を "myStack" という名前に変えます。次にその "myStack" をtPath にあるファイルパスに save します。最後に作った複製はもう必要ないので、削除します。

これでパブリッシュする絵本スタックは、独立したファイルに作り変えられます。ここでは必要と思われる最小限のスクリプトを書いていますが、スタック myStack にはナビゲーションのためのパレットを付け加えたり、その他必要なスクリプトを書き加えたりするのが良いかと思います。

最後にまた新しい絵本を描き始めるために、スタック myBook を最初の状態に戻すボタン「デフォルトのカード1に」です。



on mouseUp
repeat with i = the number of cards of stack "myBook" down to 2
delete card i of stack "myBook"
end repeat
get the num of images of stack "myBook"
if it >0 then delete image 1 of stack "myBook"
openMyBook
save stack "myBook"
end mouseUp



最後から順にカード2 までを削除して、カード1にイメージオブジェクトがあったらそのイメージを削除します。その後ページ数の調整をしてスタックを保存します。


メインスタックに以下のスクリプトを入れておくと



on closeStack
save this stack
end closeStack



この017.rev が終了する時に、すべてのサブスタックの変更が保存されます。


ファイルを見るのは、この革命部品工作型録と同じにプレイヤーを配布すれば、Windows でもMacintosh でも同一のファイルを見る事ができます。プレイヤーの作成は
http://www.kenjikojima.com/runrev/handbook/download/RRPlayer.rev
を参考にしてください。Macはコントロールキーを押して、ファイルをダウンロードします。
Win では、右クリックでファイルをダウンロードします。




016 / 017 / 018

わかりにくい事がありましたら、遠慮なくメールしてください。
index@kenjikojima.com