【 #@(SharpAt) Language -Manual- 】



#@ Language - Down Load - Ver 1.08
(#@のプログラム本体と全ソース、サンプルプログラムを同封)

<#@(SharpAt)言語について>
StudioGIW(スタジオギウ)が開発したコンピューター言語。
・短い命令文と高速描画が特徴。
・インストール不要な為、配布し易い。
・本体をオープンソースで公開。(機能を追加し易い)


#@プログラムの実行方法

・SharpAt.exe を実行すると、SharpAt.txt(通常のテキストファイル)に書かれたプログラムが実行される。
 (ダウンロード後の SharpAt.txt にはサンプルプログラムが書かれている)
 又は、#@プログラムを書いたテキストファイルを、SharpAt.exeにドラッグすることで、そのファイルを実行できる。

NEW

デバッグ関連

・実行ファイルと同じ位置に debug.ini ファイルがある時、確認無しでウインドウモードで実行される。
 (ファイルの中身は不要)

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=10a[0]=10;変数a0に10を入れる
a+10a[0]+=10;変数a0に10を足す
a-a99a[0]-=a[99];変数a0にa99の値を引く
a=b a+ca[0]=b[0]+c[0];同時に複数の計算はできない為、分割して計算させる
※拡張関数のCC〜を使えば計算可能(後述)
a=ba+c同上式と式の間は開けなくても動作する
a=b; a+c;同上C言語のように、;(セミコロン)で区切ることもできる
a=b a%c a*5 a/da[0]=5*(b[0]%c[0])/d[0];通常の算術演算子も使用可能
%は「割った余り」を求める演算子
a>ba[0]=a[0]>b[0]大小の比較も可能
a0がb0より大きければ、a0に1が入り、そうでなければ0が入る
a(b=10a[b[0]]=10;変数aのb0番目に10を入れる
仮に、b0が99なら「a99=10」と同じ
a(1000や、a(-100等、範囲外を指定するとエラーメッセージが表示される

@ Pinter(@ポインタ)

・#@では、ポインタを1つだけ使用できる。名前は「@ポインタ」。
・使用例↓
#@言語の例C言語での書き方説明
@:aint *p=&a[0];a0のアドレスを@ポインタに設定
以降、C言語側は *p を @ポインタの代わりとする
@=10*p=10;@ポインタが示すメモリに10を入れる
@=a*p=a[0];@ポインタが示すメモリにa0の値を入れる
a=@a[0]=*p;a0に、@ポインタの中身を入れる
a=@(1a[0]=*(p+1);a0に、@ポインタ+1の中身を入れる
a=@(ba[0]=*(p+b);a0に、@ポインタ+b0の中身を入れる
尚、a=@(@ という書き方は不可
@>10p+=10;@ポインタの位置を10足す
@<10p-=10;@ポインタの位置を10引く
@>1000p+=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=0if(a[0])
 a[0]=0;
b[0]=0;
このように、] の後が [ 以外なら、] の後の ;(セミコロン)は省略できる

Function(関数の作成・関数の実行)

・関数は、#0〜#999までの1000個を定義できる。
・使用例↓
#@言語の例C言語での書き方説明
#0{a=0}void Sharp0(){
 a[0]=0;
}
関数 #0 を定義
繰り返し文と同じで、必要なら改行やTabも使用可能
#0Sharp0();関数 #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で右回り)
※詳しくはサンプルプログラムを参照
NEW
a=C_Cn;
cosine計算。全て整数の為、100倍の値を使用する。
NEW
a=C_Sn;
sine計算。100倍の値を使用する。
NEW
a=C_Tn;
tangent計算。100倍の値を使用する。
NEW
a=C_Qn;
ルート計算。100倍の値を使用する。


以降は、ゲーム制作用に追加した、実装済みの拡張関数を解説する。

G:Graphic(描画用の拡張関数)

・起動時に、dtフォルダにある画像、G0.png〜G999.pngを自動的に読み込む。(画像が無ければパス)

#@言語の例説明
GS640,480;画面サイズを変更(デフォルトは640x480ピクセル)
G0,100,200;渡す順番は、「画像番号,x座標,y座標」 の順
この例では、G0.pngを100,200の位置に描画
もちろん、数字だけでなく、変数やポインタで指定することも可能
NEW 座標を省略した場合、x,yのメモリが参照される
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??;によるアルファ値も有効)
NEW
GP;
点を描画。r,g,bのメモリが色値。x,yのメモリが表示座標(アルファ値対応)
NEW
GB;
四角を描画。r,g,bのメモリが色値。x,y,x1,y1のメモリが表示座標とサイズ(アルファ値対応)
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 を自動的に読み込む。(ファイルが無ければパス)

#@言語の例説明
S0;S0.oggを1回再生
SS0;S0.oggの再生を停止
SL0;S0.oggをループ再生
SM0;曲用の M0.mp3 をループ再生。曲用のファイルは命令を実行した時に読み込む
SM-1;曲の再生を停止

NEW

F:File(ファイル操作用の拡張関数)

・/dt/file??.dat へのファイル操作が可能。
・ファイル番号は 0〜99 まで。
・1度に開けるファイルは1つまで。
※メモリ範囲を超えないようにしてある為、不正操作等はできないようにしてあります。

#@言語の例説明
F0;0番ファイルを開く
FC;開いているファイルを閉じる
FW50;@ポインタから50個分のメモリを開いてるファイルに書き込む
FR50;開いてるファイルから50個分の値を、@ポインタに読み込む
FS-10;ファイル位置を10個分戻す(1個分=4バイト)
FS10;ファイル位置を10個分進める

例)
@:f F0;FW10;FC; // f0〜f9 までを file0 へ書き込む
@:f F0;FR10;FC; // file0 から f0〜f9 へ読み込む

NEW

T:Text(テキスト用の拡張関数)

・/dt/t??.dat へのファイル操作が可能。
・ファイルは、改行単位で文章を入れておく。0行からの行数で使用する文字列を指定する。
・文章内に \n を入れると、表示時に改行される。
・文章内に $ を入れると、TB系の命令で文字列操作が可能。

#@言語の例説明
TL0; /dt/t0.dat からstring専用領域へ読み込む
(既に読み込み済みのstringは上書きされる)
戻り値:読み込んだ文字列数
TG0,x,y;string専用領域の0行目を、x,yの位置に表示
戻り値:表示後のY座標。改行コードで移動する。
TB0;作業バッファにstring専用領域の0行目をコピー
戻り値:文字数(バイト数)
TBSa;作業バッファ内の最初の $ 位置にstring専用領域のa行目を挿入
戻り値:挿入した文字数(バイト数)
TBIa;作業バッファ内の最初の $ 位置に変数aの値を挿入
戻り値:挿入した文字数(バイト数)
TBGx,y;作業バッファの文字列を、x,yの位置に表示
戻り値:表示後のY座標。改行コードで移動する。

例)
dt/t0.dat に
$の攻撃! $のダメージ!
スライム
として、
TL0; // 全文字列読み込み(1度読み込めば上書きするまで保持される)
t=1 // 敵名のあるテキスト位置
n=100 // 与えたダメージ
TB0; // バッファへ0番目の文字列をコピー
TBSt; // バッファの最初の$へt番目の文字列を挿入
TBIn; // バッファの最初の$へnの数値を挿入
TBG0,0; // バッファの文字列を表示
を実行すると、下記が表示される
スライムの攻撃! 100のダメージ!


以降は、拡張予定の機能。

R:Robot(ロボットやAI操作用の拡張関数):未対応

・どのような制御方法なのかによって拡張方法が異なる為、元のソースを使い、各自が追加していくことになる。
 (元ソースの説明はこちら
・例
 R0M=10; … ID0番の移動力を10に設定。
 a=R0IM; … ID0番の移動力を取得。




[ StudioGIW TOPページ ]