ブロックを積む(8)
「はじめてのVectorScript」と題して連載を始めるわけですが、本連載は「Vectorworksは持っているけどVectorScriptって何?」、「プログラミングって難しいんでしょ?」「アイデアはあるんだけど...」という人が「それ、VectorScriptでやれば簡単だよね」と言えるくらいになるのが目標です。
VectorworksはMacintosh版とWindows版とのマルチプラットホーム環境でありながらも、VectorScriptはOSを意識することのなくプログラミングが可能で、どちらでプログラミングしてもソースコードの変更なしでMacintosh、Windowsどちらでも実行が可能です。そしてVectorworksを持っていればいますぐにでも始められます。
ゲーム機の場合、DQ7(ソフト)で遊びたいという理由で3DS(ハード)を選ぶと思います。「このソフト(あなたが書いたスクリプト)を使いたいためにVectorworksを選びました」と言わせるようなプログラムを目指してがんばりましょう。自分のアイデアをプログラム化しブログで公開なんてことも夢ではありません。
第8章 図形属性の変更
Vectorworksの図形には様々な属性があります。線でいえば、色、太さ、破線の種類などがあります。
メッセージウインドウがでたら成功です。
では、四角形に色を付けてみましょう。
色を付ける手続きは
手続きSetFillBack(h : HANDLE; colorR, colorG, colorB : LONGINT);
関数LNewObj:HANDLE;
を使います。
SetFillBackは先頭の引数に図形のハンドルを与え、残りの3つでRGBをセットします。
LNewObjは直前に描かれた図形のハンドルを返す関数です。これを直接SetFillBackのハンドルに直接渡します。
Rect( 10, 20, 60, 50 ); SetFillBack( LNewObj, 39321, 26214, 13107 );{ブラウン}
柱状体で色を付けるどうなるでしょう。
BeginXtrd( 0, 30 ); Rect( 10, 20, 60, 50 ); SetFillBack( LNewObj, 39321, 26214, 13107 ); EndXtrd;
FOR文で繰り返すことで、2次元的に展開するとどうでしょう。
PROCEDURE sample; VAR ii, jj : INTEGER; BEGIN FOR jj := 0 TO 4 DO BEGIN FOR ii := 0 TO 8 DO BEGIN BeginXtrd( 0+jj*30, 30+jj*30 ); Rect( 10+ii*50, 20, 60+ii*50, 50 ); SetFillBack( LNewObj, 39321, 26214, 13107 ); EndXtrd; END; END; END; Run( sample );
さらにここで、ある条件にしたがって色を付けたり付けなかったりしてみましょう。
条件分岐をするにはIF文を使います。
IF 条件 THEN BEGIN {条件に対して真の場合の処理} END ELSE BEGIN {条件に対して偽の場合の処理} END;
では、偶数個目の場合に色を付けてみましょう。
PROCEDURE sample; VAR ii, jj : INTEGER; BEGIN FOR jj := 0 TO 4 DO BEGIN FOR ii := 0 TO 8 DO BEGIN BeginXtrd( 0+jj*30, 30+jj*30 ); Rect( 10+ii*50, 20, 60+ii*50, 50 ); IF ii MOD 2 <> 0 THEN BEGIN SetFillBack( LNewObj, 39321, 26214, 13107 ); END; EndXtrd; END; END; END; Run( sample );
続いて、段数の方でも偶数段目、奇数段目を条件分けしてみましょう。
条件を追加するには、
IF 条件1 THEN BEGIN {条件1に対して真の場合の処理} END ELSE IF 条件2 THEN BEGIN {条件2に対して真の場合の処理} END ELSE BEGIN {条件1、2に対して偽の場合の処理} END;
PROCEDURE sample; VAR ii, jj : INTEGER; BEGIN FOR jj := 0 TO 4 DO BEGIN FOR ii := 0 TO 8 DO BEGIN BeginXtrd( 0+jj*30, 30+jj*30 ); Rect( 10+ii*50, 20, 60+ii*50, 50 ); IF ( jj MOD 2 = 0 ) AND ( ii MOD 2 <> 0 ) THEN BEGIN SetFillBack( LNewObj, 39321, 26214, 13107 ); END ELSE IF ( jj MOD 2 <> 0 ) AND ( ii MOD 2 = 0 ) THEN BEGIN SetFillBack( LNewObj, 39321, 26214, 13107 ); END; EndXtrd; END; END; END; Run( sample );
最後に、何段目かによって個数を変えるにはどうすればよいでしょう。
PROCEDURE sample; VAR ii, jj : INTEGER; BEGIN FOR jj := 0 TO 4 DO BEGIN FOR ii := jj TO 8 DO BEGIN BeginXtrd( 0+jj*30, 30+jj*30 ); Rect( 10+ii*50, 20, 60+ii*50, 50 ); IF ( jj MOD 2 = 0 ) AND ( ii MOD 2 <> 0 ) THEN BEGIN SetFillBack( LNewObj, 39321, 26214, 13107 ); END ELSE IF ( jj MOD 2 <> 0 ) AND ( ii MOD 2 = 0 ) THEN BEGIN SetFillBack( LNewObj, 39321, 26214, 13107 ); END; EndXtrd; END; END; END; Run( sample );