#@(SharpAt) Language
【 #@(SharpAt) Language -Manual- 】

|
#@ Language - Down Load - Ver 1.01
(#@のプログラム本体と全ソース、サンプルプログラムを同封)
<#@(SharpAt)言語について>
・StudioGIW(スタジオギウ)が開発したコンピューター言語。
・短い命令文と高速描画が特徴。
・インストール不要な為、配布し易い。
・本体をオープンソースで公開。(機能を追加し易い)
|
#@プログラムの実行方法
・SharpAt.exe を実行すると、SharpAt.txt(通常のテキストファイル)に書かれたプログラムが実行される。
(ダウンロード後の SharpAt.txt にはサンプルプログラムが書かれている)
又は、#@プログラムを書いたテキストファイルを、SharpAt.exeにドラッグすることで、そのファイルを実行できる。
|
Comment(コメント行など)
・// 以降は、コメント行(プログラム以外の文字)として処理される。
・コメント行、スペース、Tab、改行は、実行時に省略される。
省略後のソースは、tmp_(実行したファイル名).txtに保存される。(デフォルトの SharpAt.txt なら tmp_SharpAt.txt.txt に保存)
|
Memory(メモリ・変数・配列)
・メモリは全て固定メモリで、a0〜a999、b0〜b999、・・・、z0〜z999の26000個ある。
・1個のメモリは4バイトで、整数のプラスとマイナスを扱える。(C言語のint型と同じ)
・メモリは全て繋がっている。C言語の場合、int a[1000], b[1000], …, z[1000];と宣言されている状態。
・各0番目の変数は、0を省略できる。例えば、a0はa、b0はbと表記できる。
・使用例↓
#@言語の例 | C言語での書き方 | 説明 |
a=10 | a[0]=10; | 変数a0に10を入れる |
a+10 | a[0]+=10; | 変数a0に10を足す |
a-a99 | a[0]-=a[99]; | 変数a0にa99の値を引く |
a=b a+c | a[0]=b[0]+c[0]; | 同時に複数の計算はできない為、分割して計算させる ※拡張関数のCC〜を使えば計算可能(後述) | a=ba+c | 同上 | 式と式の間は開けなくても動作する |
a=b; a+c; | 同上 | C言語のように、;(セミコロン)で区切ることもできる |
a=b a%c a*5 a/d | a[0]=5*(b[0]%c[0])/d[0]; | 通常の算術演算子も使用可能 %は「割った余り」を求める演算子 |
a>b | a[0]=a[0]>b[0] | 大小の比較も可能 a0がb0より大きければ、a0に1が入り、そうでなければ0が入る |
a(b=10 | a[b[0]]=10; | 変数aのb0番目に10を入れる 仮に、b0が99なら「a99=10」と同じ a(1000や、a(-100等、範囲外を指定するとエラーメッセージが表示される |
|
@ Pinter(@ポインタ)
・#@では、ポインタを1つだけ使用できる。名前は「@ポインタ」。
・使用例↓
#@言語の例 | C言語での書き方 | 説明 |
@:a | int *p=&a[0]; | a0のアドレスを@ポインタに設定 以降、C言語側は *p を @ポインタの代わりとする |
@=10 | *p=10; | @ポインタが示すメモリに10を入れる |
@=a | *p=a[0]; | @ポインタが示すメモリにa0の値を入れる |
a=@ | a[0]=*p; | a0に、@ポインタの中身を入れる |
a=@(1 | a[0]=*(p+1); | a0に、@ポインタ+1の中身を入れる |
a=@(b | a[0]=*(p+b); | a0に、@ポインタ+b0の中身を入れる 尚、a=@(@ という書き方は不可 |
@>10 | p+=10; | @ポインタの位置を10足す |
@<10 | p-=10; | @ポインタの位置を10引く |
@>1000 | p+=1000; | メモリは全て繋がっている為、例えば、a999の次はb0になる |
@+10 | *p+=10; | @ポインタの中身に10を足す *や/等、他の演算子も使用可能。但し、比較演算子は使えない |
・尚、メモリの範囲外にはアクセスできないようになっている。(#@プログラムからの不正操作はできない)
|
Jump(分岐・繰り返し)
・変数の値が、0かそれ以外かによって分岐させる。
・使用例↓
#@言語の例 | C言語での書き方 | 説明 |
a[a=0]; | if(a[0]) a[0]=0; | 変数を使った分岐 a0の値が0以外なら、[]内の処理を実行する 尚、a>b等の条件式を使う場合は、 a>b でaに0か1を入れた後、a[a=0]; を行う必要がある |
a[a=0][b=0]; | if(a[0]) a[0]=0; else b[0]=0; | a0の値が0以外なら、最初の[]内の処理を実行し、 0だったら、次の[]内の処理を実行する |
a[ a=b b+5 ][ b=0 ]; | if(a[0]){ a[0]=b[0]; b[0]+=5; } else { b[0]=0; } | C言語のように、改行やTabを使って表記することもできる |
a=10 [a-1 a]; | a[0]=10; do{ a[0]--; }while(a[0]); | 変数を使った繰り返し文 a] で、aが0以外なら [ まで戻り、0なら次へ進む |
b[a-1 a]; | if(b[0]){ do{ a[0]--; }while(a[0]); } | 分岐と繰り返しを混ぜることも可能 |
a[a=0] b=0 | if(a[0]) a[0]=0; b[0]=0; | このように、] の後が [ 以外なら、] の後の ;(セミコロン)は省略できる |
|
Function(関数の作成・関数の実行)
・関数は、#0〜#999までの1000個を定義できる。
・使用例↓
#@言語の例 | C言語での書き方 | 説明 |
#0{a=0} | void Sharp0(){ a[0]=0; } | 関数 #0 を定義 繰り返し文と同じで、必要なら改行やTabも使用可能 |
#0 | Sharp0(); | 関数 #0 を実行 |
#a |
typedef void(*P_PROC)();
P_PROC pProc[1000]=
{
Sharp0,
Sharp1,
: // 省略
:
Sharp999
};
pProc[a[0]]();
|
| 変数を使って関数を手軽に実行することもできる |
#@ | ほぼ同上 | @ポインタを使って関数を実行することもできる @ポインタの場合は、@ポインタの中身の値が関数名として使用される 尚、この特殊な関数実行方法が、言語名「#@」の由来 |
#0{a[.] b=0} | void Sharp0(){ if(a[0]) return; b[0]=0; } | 関数内で .(ピリオド)を使うと、その関数から戻ることができる |
#0{a=0} #0 // 上の#0を実行 #0{a+1} // #0を再定義 #0 // 再定義された#0を実行 | 不可能 | 同じ名前の関数を再定義可能(最後に定義された方が有効になる) 例えば、関数内でローカル関数を定義して使い、他の関数内でも同じ名前のローカル関数を作って使う、ということができる |
尚、引数や戻り値は、メモリを使って行う。
例えば、戻り値を a に入れておくとか、引数に x と y を使う等、自身でルールを決めておく。
注意)メモリは全てグローバル変数である為、関数内で使うメモリ名には注意する必要がある。
|
【 Extension(拡張機能・拡張関数) 】
#@には、独自の拡張機能(拡張関数)を追加できる。
拡張関数は、「大文字のアルファベット1文字」を識別子として使う。
例えば、デバッグ用の拡張関数なら D を。 描画用の拡張関数なら G を識別子として用いる。
<拡張関数のルール>
・最初の1文字は識別子(大文字のアルファベット)。
・拡張関数の最後は必ず、;(セミコロン)を付けること。
・識別子と;(セミコロン)の間にある文字や数字は、そのまま拡張関数に送られる。
例えば、D"ABCDEFG100"; とした場合、"ABCDEFG100"の部分がそのまま D に送られる。
・a=Da; という感じで戻り値を受け取れる。
|
↓は、デバッグ用に使う拡張機能「D」
D:Debug(デバッグ用の拡張関数)
・文章や数値をメッセージボックスで表示できる。
#@言語の例 | 説明 |
Da; | 変数a0の値を表示 |
D"ABCDEFG"; | D と ; の間にある文字列を表示 分かりやすく " で括っているが、無くても問題ない また、「あいうえお」等、日本語も使用できる |
|
↓は、計算用に使う拡張機能「C」
C:Calculation(計算用の拡張関数)
・この拡張関数は、最初の1文字だけでなく、次の1文字も識別子として使っている
#@言語の例 | 説明 |
a=CR; | 乱数を取得する (値が大きいので、通常はここから a%100等で使い易い値にする) |
a=CC-10/a+b*((5+c)%8); | CCの後の計算式を計算し、結果を返す |
a=CC(a>=10)&&((b+5)==0)); | CCの後の計算式には、>= や && 等の論理演算も可能 |
a=CHx,y,x2,y2,s1,s2; | HitTest用 x,yの値が、矩形(x2,y2,s1,s2)内にあれば1を返し、そうでなければ0を返す s1,s2は矩形のサイズ |
h=CLx,y,x2,y2,n; | LINE位置を計算する処理 x,yからx2,y2までの線上で、nピクセル進んだ座標を、#@の変数x0とy0に設定する 戻り値は、進む方向を8方向に分割した際の方向値(上が0で右回り) ※詳しくはサンプルプログラムを参照 |
・cos、sin、sqrtやその他の特殊な計算は、必要に応じて追加していく
|
以降は、ゲーム制作用に追加した、実装済みの拡張関数を解説する。
G:Graphic(描画用の拡張関数)
・起動時に、dtフォルダにある画像、G0.png〜G999.pngを自動的に読み込む。(画像が無ければパス)
#@言語の例 | 説明 |
GS640,480; | 画面サイズを変更(デフォルトは640x480ピクセル) |
G0,100,200; | 渡す順番は、「画像番号,x座標,y座標」 の順 この例では、G0.pngを100,200の位置に描画 もちろん、数字だけでなく、変数やポインタで指定することも可能 |
GF; | 絵を画面に表示させる為の「Flip命令」を行う 上記の描画命令では裏の画面に描画している為、まだ画面には表示されない GF;を実行することで、裏の画面を表の画面に切り替え、絵を実際の画面に表示させることができるする (これによって、画面のチラ付きを無くし、高速に描画することができる) |
GM4; | 描画時の座標に、指定の数値を掛けるようにする 例えば、GM4;なら4倍で、G0,10,10;の場合、x=40,y=40に描画することになる メリットは、プログラムの文字数を減らすことができること(例えば GM4;なら、120という座標を30と書ける為) |
GA40; | 描画時のアルファ値(透明度)を設定 0なら表示されない。50なら50%の透明度。100なら通常の描画と同じ この命令は再設定されるまで有効 |
GC; | 画面を黒で塗り潰す(GA??;によるアルファ値も有効) |
GCr,g,b; | 画面を指定のRGB値で塗りつぶす(GA??;によるアルファ値も有効) |
GW50; | Flip前(GF;命令時)に、ウエイトを入れるようにする 値はミリ秒単位(1000で1秒) ウエイト無し(GW0;)の場合、約60fps(1秒間に60回、画面が更新される)になる 尚、Shiftキーを押している間、このウエイトが無効になる(ユーザーがゲーム速度を任意に高速化できる) |
GT10,20"・・・"; | "内の文字列を10,20の位置に描画(文字サイズはデフォルト) 日本語版のWindowsなら、日本語フォントも使える |
GT10,20,a; | a0の値を10,20の位置に描画(文字サイズはデフォルト) |
|
K:Keyboard(キーボードやマウス取得用の拡張関数)
・指定のキーが押されているかどうかを返す。1なら押されている、0なら押されていない。
#@言語の例 | 説明 |
a=KUP; | キーボードの上下左右の状態を取得 KUP;がUP, KDW;がDOWN, KLF;がLEFT, KRT;がRIGHT |
a=KEn; | キーボードのEnter等の状態を取得 KEn;=Enter, KEs;=Esc, KTa;=Tab, KCt;=Ctrl, KSp;=Space, KSh;=Shift |
a=KML; | マウスのボタンの状態を取得 KML;=マウスの左クリック, KMR;=マウスの右クリック |
a=KMX; | マウスの位置を取得 KMX;=マウスのX座標, KMY;=マウスのY座標 |
(未対応) a=K_A; | (今後対応予定の命令) キーボードのA〜Zと0〜9を取得 |
|
S:Sound(効果音や曲再生用の拡張関数)
・起動時に、dtフォルダにある音データ S0.ogg〜S99.ogg を自動的に読み込む。(ファイルが無ければパス)
#@言語の例 | 説明 |
SP0; | S0.oggを1回再生 |
SS0; | S0.oggの再生を停止 |
SL0; | S0.oggをループ再生 |
SM0; | 曲用の M0.mp3 をループ再生。曲用のファイルは命令を実行した時に読み込む |
SM-1; | 曲の再生を停止 |
|
以降は、拡張予定の機能。
F:File(ファイル操作用の拡張関数):未対応
・安全の為、固定のファイルしか操作できないようにする。
・例
F0; … 0番ファイルを開く。
FC; … 開いているファイルを閉じる。
FW@4,50; … 1個を4バイトとして、@ポインタから50個分のメモリをファイルに書き込む。
FR@1,50; … 1個を1バイトとして、ファイルから50個分の値を、@ポインタに読み込む。
FS-10; … ファイル位置を10バイト戻す
FS+10; … ファイル位置を10バイト進める
|
R:Robot(ロボットやAI操作用の拡張関数):未対応
・どのような制御方法なのかによって拡張方法が異なる為、元のソースを使い、各自が追加していくことになる。
(元ソースの説明はこちら)
・例
R0M=10; … ID0番の移動力を10に設定。
a=R0IM; … ID0番の移動力を取得。
|
|