2-4.変数・型・属性


 [前のページ]   [目次に戻る]   [次のページ] 

属性について・概略

属性とは

Famous Writerでの属性とは、一般的なプログラミング言語の型みたいなもので、「整数系属性」「文字系属性」があります。
基本的には、整数系属性には整数値を、文字系属性には文字列を入れて使います。
命令の右辺や、変数は、この属性の種別に従って、適切に記述してゆきます。

さらに、整数系は整数型・論理型・カラー型・位置型に別れ、文字系は文字型・テキスト型・ファイル型に別れます。
同じ系統のものは、相互に使えます。

2-4-1

型に近いものですので、属性内に変数や数式を使って記述することが出来ます。
ただし、細かいルールがいくつかございますので、慣れるまでは指定の数値・文字のみを使うといいでしょう。

命令マニュアルでの記述

それぞれの属性型で簡単な記述ルールや省略形、エイリアスがあります。
例えば、かんたん命令の&EzCGは、
   &EzCG = int1, file, int2;
と表され、&EzCGが命令、int1はint型属性でレイヤー番号、fileはfile型属性で読み込むファイル、int2はint型属性で画面効果番号となります。
命令マニュアルでは、以上のような表記で書かれています。

型変換

整数型と文字型は相互変換されます。
つまり、整数系属性を取る所に文字型変数をいれると、それを無理に数値として変換します(REALbasicのStr関数丸投げ…)。
同様に、文字系属性に整数型変数を入れると、その数値の文字列に変換します(REALbasicのVal関数丸投げ…)。
いずれにしろ、タイプミスマッチ的なエラーが出るようにはなってませんので、注意してください。

単項での表記

整数系属性

# アクティブレイヤー番号を指定する命令です
&Layer.No = 128;
# レイヤーのαブレンドモードを指定します
&Layer.AlphaBlend = True;

# 数値で指定するとこんな感じ
&Layer.AlphaBlend = 1;

# いわゆるフラグも、Bool型で扱うと楽です
%Flag1 = on;
%Flag2 = off;
# 色はHTMLと同じように書くことができます
&Layer.Fill = #000033;
&Layer.Fill = gray;

3-3-1

# (200,180)の位置を指定
&Layer.Pos= 200,180;

# 横方法だけ相対指定で動かしたい場合
&Layer.Pos= -40,+0;

# 横方向を相対指定で20px右に、縦方向を絶対座標の下寄せで指定
&Layer.Pos= +20,bottom;

文字系属性

# ボタンに[3]のキーを割り当てます
&B.Key = 3;
# レイヤーにテキストを描きます
&Layer.Text = これは&c=red&レイヤー3&c=&です。;
# ファイルの頭に飛ぶジャンプ命令です
&Jmp = /scenario/hoge.txt;

# ファイルの特定のアンカーに飛ぶこともできます
&Jmp = /txt/chapter2.txt@section2;

# BGMトラックにファイルを読み込みます
&BGM.Load = /aac/bgm16.m4a;

# 同じフォルダの画像を読み込みます
&Layer.Load = ./sub.jpg;

変数

概要

多項式で属性を指定するルールの前に、変数についてご説明いたします。

変数には、ローカル変数とグローバル変数があり、また、それぞれに整数型と文字型があります。
使用にあたって特に定義や宣言は必要なく、使いたい場所でいきなり使用可能です。PerlやPHPみたいに使っていただければと。

変数名は、半角英数字を使って下さい。全角文字を使った時の動作は保証いたしません。
また、=+-*/^!#$%&_<>など、命令内で使用する文字と紛らわしいものは使わないでください。

変数の記述方法や、サンプルコード等は、命令マニュアルをご参照下さい。

変数の範囲

属性と同様、整数型は±2,147,483,648(32bit)の範囲で、文字型は文字数に制限はありません。
仕様上は、ローカル整数型/ローカル文字型/グローバル整数型/グローバル文字型、それぞれ2,147,483,648個(約21億個)まで識別します。
従って、事実上無制限と言えると思います。

ローカル変数とグローバル変数

ローカル変数は1プレイが終了する(Famous Writerを終了させる)と消えてしまう変数で、グローバル変数は全てのプレイに共通の変数になります。
一般的なプログラム言語とは「ローカル」と「グローバル」の意味(スコープ)が根本的に異なりますので、プログラムの経験がある方は注意してください。

例えば、ローカル変数はゲームの進行フラグなどを保存、グローバル変数にはゲームのクリアデータなどを保存、という使い分けができます。
仕様としては、セーブファイルに保存されるものがローカル変数、FmWr.iniに保存されるものがグローバル変数です。

グローバル変数の動作仕様

グローバル変数は、FmWr.iniファイルに保存されます。
以下のような記述方法で、ローカル変数に近い「代入」の形を取りますが、その都度FmWr.iniへ読み書きのため、ディスクアクセスが発生いたします。

%!hoge = True;
%foo = %!hoge

ディスクアクセスは、ハードウェア的にいわゆる「重い」動作です。
頻繁に使うと、ノートパソコン等、HDDが非力なパソコンではパフォーマンスが低下します。
従って、なるべく演算や条件判断は、ローカル変数にコピーして行っていただき、終わったら戻すようにしてください。
また、そのような使用を意図してるため、演算命令がございません。

多項式と変数の利用

はじめに

属性は、整数値または文字だけでなく、変数や数式で記述することができます。
ローカル変数だけでなく、グローバル変数も項のひとつとして使えますが、速度とパソコンに負荷がかかる問題があります。
グローバル変数の動作仕様をご理解いただき、適切に使用してください。

数式を使う場合は、各項と演算子の間のホワイトスペースは無視します。
これもお好きなように、タブやスペースでテキストを整形できます。

# 以下の2行は同じ
%var=(1+2)*3;
%var = (  1 + 2  )   *3;

# グローバル変数を使った例
%a = %Flag1 * %!Flag0

整数系属性

Famous Writerは、加(+)減(-)乗(*)除(/)と、べき乗(^)を使った数式を解釈します。
ただし、負の値を示したい時は、減算の-と区別がつかないので、(-1)などと項をカッコでくくってください。
同様に、システム変数など、頭に*がつくものもカッコでくくります。

項の頭に#をつけた項は、16進数として扱われます。表記はビッグエンディアンです。
各項は、内部では全て整数型で扱われ、32bitで格納されます(16進数は符号付きとして扱われます)。

# 16進数でも指定できますが、マニア向け
&Layer.No = #80;

# True/Falseなどは定数なので、項として使えます
&Layer.Visible = %Flag * true;

# 負の値はカッコをつけます
%foo = ( (-2) * %var - 5 ) / 4

# システム変数の場合もカッコを
%seconds = (*system.hour) *3600 + (*system.minute) *60 + (*system.second)
本日の経過秒数は%seconds%秒です。

# 数式を使うとこんなこともできます
&Rnd = 255; %red = &Rnd; %green = &Rnd; %blue = &Rnd; 
&Layer.Fill = %red * #10000 + %green * #100 + %blue;
&Layer.Fill = %red * 65536 + %green * 256 + %blue; # 10進数

# 色を変数として使っても便利かも
%DarkRed = #330000;
&Layer.Fill = %DarkRed;

# Pos型の自動計算も、数式の中に入れることができます
&Layer.Pos = center -8, (topcenter +10) /2;

# 例えば絶対座標の(-10,-20)の位置にしたい場合、
&Layer.Pos = -10, -20;
# だと相対位置と見なされるので
&Layer.Pos = 0-10, 0-20;
# と書くか、もしくは変数を使うこと
%x = -10; %y = -20
&Layer.Pos = %x, %y;

# 変数で相対位置にしたい場合は、以下の通り
%x = 10; %y = 20
&Layer.Pos = - %x, - %y;

文字系属性

「+」演算子のみ、連結に使えます。
他の演算子はすべて文字とみなします。

演算の仕様

演算子の優先順位は、以下の通り(数学と同じです)。

  1. ()
  2. ^
  3. * と /
  4. + と -

内部の演算アルゴリズムは、上の優先順位をつけたスタック型の方法で行っております。
具体的には「逆ポーランド記法」に少し手を加えた方法です。
コンパイルの時に、項のエラーチェックと逆ポーランド記法への変換をし、実行エンジンで(項が変数の場合は解決しつつ)計算いたします。


 [前のページ]   [目次に戻る]   [次のページ]