<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24337787</id><updated>2011-04-22T11:11:03.018+09:00</updated><title type='text'>STG製作日記</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24337787.post-115244914405454892</id><published>2006-07-09T21:05:00.000+09:00</published><updated>2006-07-09T21:45:44.066+09:00</updated><title type='text'>ハッカーのたのしみ</title><content type='html'>　ハッカーのたのしみという本が面白いらしいので読んでみた。&lt;br /&gt;&lt;br /&gt;本の冒頭に紹介されていたコードにちょっと疑問を感じたので、考えてみた。&lt;br /&gt;それはasciiコードの'0'から'9'、'a'から'f'を入力して、対応する16進数を出力する&lt;br /&gt;C2n(x)&lt;br /&gt;　　{return  x%87%48;}&lt;br /&gt;というコードである。しかし、この場合だと剰余を2回使用している。つまり除算を2回使うことになり、計算コストが高い。また、'A'から'F'を入力した場合、正しく変換できない。 &lt;br /&gt;&lt;br /&gt;　'0'は、48なので2進で表すと、110000である。このビットの並びを眺めると、LSBの4ビット以外を0にしてやれば、0から9の数値が得られそうであることが分かる。つまり、x &amp; 15とすることで、'0'から'9'という入力から数値の0から9が得られる。&lt;br /&gt;　'a'から'f'の場合、x&amp;amp;15を計算すると、&lt;br /&gt;'a'の場合、 1&lt;br /&gt;'b'の場合、 2&lt;br /&gt;'c'の場合、 3&lt;br /&gt;'d'の場合、 4&lt;br /&gt;'e'の場合、 5&lt;br /&gt;'f'の場合、 6&lt;br /&gt;となる。'a'は10なので、9だけ足りない。9を足してやれば求めたい答えになる。そこで、'a'の1100001の7ビット目をフラグとして使用することを考える。'0'から'9'では7ビット目は0であるが、'a'から'f'の場合7ビット目に1になる。7ビット目が1のときだけ9を加えればよい。9は2進数だと1001である。1のビットが２つある。1のビットが１つだけになるように、9を8+1に分解する。8は2進数で1000であり、1になっているビットが１つだけになる。1は2進数でも1なので、当然1のビットは１つだけである。&lt;br /&gt;((x &amp; 64)&gt;&gt;3)で、7ビット目が1のときだけ、8となる。&lt;br /&gt;((x &amp;amp; 64)&gt;&gt;6)で、7ビット目が1のときだけ、1となる。&lt;br /&gt;これを組み合わせて、&lt;br /&gt;y = (x &amp; 15) + ((x &amp;amp; 64) &gt;&gt; 3) + ((x &amp; 64) &gt;&gt; 6);&lt;br /&gt;というコードでasciiから16進数に変換することが出来る。このコードは、本で紹介されていた剰余を使うコードより高速だと思う。また、このコードの場合、'A'から'F'を与えた場合でも正常に変換することができるという利点もある。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115244914405454892?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115244914405454892/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115244914405454892' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115244914405454892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115244914405454892'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/07/blog-post.html' title='ハッカーのたのしみ'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115202529557512095</id><published>2006-07-04T23:35:00.000+09:00</published><updated>2006-07-05T00:02:58.186+09:00</updated><title type='text'>関数ポインタを使って、配列に用意したx86コードを実行してみる</title><content type='html'>#include ＜stdio.h＞&lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;static int num = 0;&lt;br /&gt;&lt;br /&gt;void op1(void){&lt;br /&gt;　　printf("命令1を実行します\n");&lt;br /&gt;　　num = 5;&lt;br /&gt;}&lt;br /&gt;void op2(void){&lt;br /&gt;　　printf("命令2を実行します\n");&lt;br /&gt;　　num *= 2;&lt;br /&gt;}&lt;br /&gt;void op3(void){&lt;br /&gt;　　printf("命令3を実行します\n");&lt;br /&gt;　　num += 2;&lt;br /&gt;}&lt;br /&gt;int main(void){&lt;br /&gt;　　unsigned char *p;&lt;br /&gt;　　unsigned char buf[100];&lt;br /&gt;　　int j = 0;&lt;br /&gt;&lt;br /&gt;　　// OP1のバイナリをbufにコピー&lt;br /&gt;　　p = (unsigned char *)op1;&lt;br /&gt;　　for (int i = 0; p[i] != 0xC3; i++) {&lt;br /&gt;　　　　printf("%02X ", p[i]);&lt;br /&gt;　　　　buf[j++] = p[i];&lt;br /&gt;　　}&lt;br /&gt;　　// OP2のバイナリをbufにコピー&lt;br /&gt;　　p = (unsigned char *)op2;&lt;br /&gt;　　for (int i = 0; p[i] != 0xC3; i++) {&lt;br /&gt;　　　　printf("%02X ", p[i]);&lt;br /&gt;　　　　buf[j++] = p[i];&lt;br /&gt;　　}&lt;br /&gt;　　// OP3のバイナリをbufにコピー&lt;br /&gt;　　p = (unsigned char *)op3;&lt;br /&gt;　　for (int i = 0; p[i] != 0xC3; i++) {&lt;br /&gt;　　　　printf("%02X ", p[i]);&lt;br /&gt;　　　　buf[j++] = p[i];&lt;br /&gt;　　}&lt;br /&gt;　　buf[j] = 0xC3; // RET(0xC3)を最後に付け加える&lt;br /&gt;　　printf("\n");&lt;br /&gt;　　&lt;br /&gt;　　// 関数ポインタを定義&lt;br /&gt;　　void (*fn)(void);&lt;br /&gt;　　// bufの先頭アドレスをfnにセットする&lt;br /&gt;　　fn = (void (*)(void))(&amp;buf[0]);&lt;br /&gt;　　&lt;br /&gt;　　// fnを呼び出す&lt;br /&gt;　　(*fn)();&lt;br /&gt;　　&lt;br /&gt;　　printf("num=%d\n", num);&lt;br /&gt;　　return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;　うひょ～これはヤバいコードだぞ（笑）。でも動くんだなこれが。このプログラムでは何をしてるかといえば、bufという配列にx86のバイナリコードを書き込んで、それを実行している。しかも、x86のコードはあらかじめ用意してあるわけではなく、op１、op2、op3という関数のバイナリコードを使用している。&lt;br /&gt;　op1、op2、op3関数のそれぞれの先頭アドレスから見ていって、RETという命令(16進であらわすと0xc3)が表れるまで、バイナリをbufに繋げてコピーしている。そしてbufを関数ポインタfnにセットして、fn()を呼び出すとop1、op2、op3を連続して実行したのと同じ結果が得られる。つまり、op1、op2、op3の3つを合成した関数が出来上がったわけである。これが意味するところは、スクリプトエンジンの仮想マシンの命令に対応する関数群を用意しておいて、それをスクリプトの記述に従って配列やmalloc等で用意した領域にコピーしていくことで、極めて簡単にスクリプトの記述をx86命令にコンパイルして実行できるということだ。&lt;br /&gt;　まあ、最近のCPUだとこういうヤバイコードを実行するのを防ぐ機構（NXビットとかそういうやつ）がついていたりするはずなので、そういう環境だとこの方法では動かせないだろう。bufを確保する場所を、コードセグメントにすれば大丈夫かもしれないが、よく分からない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115202529557512095?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115202529557512095/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115202529557512095' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115202529557512095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115202529557512095'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/07/x86.html' title='関数ポインタを使って、配列に用意したx86コードを実行してみる'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115114093674773890</id><published>2006-06-24T15:59:00.000+09:00</published><updated>2006-06-24T18:22:16.756+09:00</updated><title type='text'>各言語でベンチマーク</title><content type='html'>　StgScriptの構文は、ほとんどC言語と同じである。C言語と同様の構文を持つ言語は他にも色々ある。そこで、C言語、Java、JavaScript、StgScriptで同じプログラムを実行させてベンチマークを行ってみた。プログラムは、&lt;br /&gt;xa = 0.0;&lt;br /&gt;xb = 1.0;&lt;br /&gt;s = 0.0;&lt;br /&gt;eps = 1e-6;&lt;br /&gt;k = 65536*32;&lt;br /&gt;h = (xb-xa)/k;&lt;br /&gt;for (i = 1; i &lt; k-1; i++) {&lt;br /&gt;　　a = xa + i * h;&lt;br /&gt;　　a = 1-a*a;&lt;br /&gt;　　x = 0;&lt;br /&gt;　　do {&lt;br /&gt;　　　　x++;&lt;br /&gt;　　} while (a &gt; x*x);&lt;br /&gt;　　do {&lt;br /&gt;　　　　x-=dx=(x*x-a)/(2*x);&lt;br /&gt;　　} while (dx*dx &gt; eps);&lt;br /&gt;　　s += 4*x;&lt;br /&gt;}&lt;br /&gt;s *= h;&lt;br /&gt;print_num(s);&lt;br /&gt;こんな感じである。&lt;br /&gt;StgScriptでは、print_num(s)が数字を画面出力する関数である。ここをそれぞれの言語にあわせて書き換える。実行結果は、&lt;br /&gt;　　VisualC++の場合766[ms]&lt;br /&gt;　　Javaの場合1011[ms]&lt;br /&gt;　　STG Scriptの場合12427[ms]&lt;br /&gt;　　JavaScriptの場合83640[ms]&lt;br /&gt;となった。&lt;br /&gt;まとめると、&lt;br /&gt;　　VisualC++のコードは、Javaのコードより、約1.3倍速い&lt;br /&gt;　　Javaのコードは、STG Scriptのコードより、約12.3倍速い&lt;br /&gt;　　STG Scriptのコードは、JavaScriptより、約6.7倍速い&lt;br /&gt;という事になる。これを例えるならば、&lt;br /&gt;　　JavaScriptは、徒歩&lt;br /&gt;　　STG Scriptは、原付自転車&lt;br /&gt;　　Javaは、新幹線&lt;br /&gt;　　VisualC++は、ゼロ戦&lt;br /&gt;という感じだろうか。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115114093674773890?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115114093674773890/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115114093674773890' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115114093674773890'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115114093674773890'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/blog-post_24.html' title='各言語でベンチマーク'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115095875739192554</id><published>2006-06-22T15:43:00.000+09:00</published><updated>2006-06-22T15:45:57.406+09:00</updated><title type='text'>MIPS値を計測する</title><content type='html'>　スクリプトエンジンの実行速度がどの程度なのか気になったので、計測してみることにした。何度もループするようなスクリプトを実行させて、実行時間と実行した命令数（仮想マシンコードの命令数）をカウントする。実験に使うスクリプトは、円周率を計算させるプログラムである。　実行結果は、&lt;br /&gt;　　　Instraction count = 244444609&lt;br /&gt;　　　Time = 10785[ms]&lt;br /&gt;　　　MIPS = 22.6652[MegaInstraction/sec]&lt;br /&gt;という数値になった。つまり1秒間に0.22億回命令を実行している。ちなみにこの数値を計測したPCの環境は、&lt;br /&gt;　　　Intel PentiumIII Coppermine&lt;br /&gt;　　　L1 I-Cache 16KB&lt;br /&gt;　　　L1 D-Cache 16KB&lt;br /&gt;　　　L2 Cache 256KB&lt;br /&gt;　　　Internal Clock 600MHz&lt;br /&gt;　　　System Clock 100MHz&lt;br /&gt;という感じである。CPUのクロックが600MHzで22MIPS実行できたということなので、このスクリプトエンジンは速くはないが遅くも無いといった感じだろうか。システムの機能が完成してきたら、この辺はもうちょっと最適化を行いたいと思う。現状だとfloatからintへの型キャストがかなり多いのが一番のネックだろう。スタック領域とコード領域を64bit境界でアラインさせるとか、いろいろと最適化のポイントは残されていると思う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115095875739192554?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115095875739192554/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115095875739192554' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115095875739192554'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115095875739192554'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/mips.html' title='MIPS値を計測する'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115088005131430237</id><published>2006-06-21T17:49:00.000+09:00</published><updated>2006-06-21T22:15:17.823+09:00</updated><title type='text'>スクリプトの言語仕様</title><content type='html'>　スクリプトの言語仕様を見直しました。&lt;br /&gt;&lt;br /&gt;１、変数の宣言を不要に&lt;br /&gt;　BASICやJavaScript風に変数の宣言を書かなくても良いことにしました。 int hoge;等としなくても変数を使えます。&lt;br /&gt;&lt;br /&gt;２、=で変数へ代入を行うと、それが宣言の代わりとなる&lt;br /&gt;　hoge = 100;という具合に、代入を行ったときに変数が定義されます。代入を一度も行っていない変数の左辺値を使おうとするとコンパイルエラーになります。たとえば、&lt;br /&gt;　　a=100;&lt;br /&gt;　　a=a+5;&lt;br /&gt;　　b+=5;&lt;br /&gt;　　a=a+c;&lt;br /&gt;と書いた場合は３行目と４行行目がコンパイルエラーになります（bとcが初期化されていない為）。これによって、未初期化の変数に対してアクセスしてしまうことを防ぎます。また、変数名をタイプミスした場合でも結果的にコンパイルエラーになることが期待できます。変数の宣言無しの言語では、TYPOが発見しずらいという問題があるのですが、「代入を行ったときに変数が定義される」というルールにすることで、TYPOをコンパイルエラーとして検出することが出来ます。例えば、&lt;br /&gt;　　hoge=100;&lt;br /&gt;　　hogu++;&lt;br /&gt;と記述してしまった場合（２行目をタイプミスしている）でも、コンパイル時にエラーが報告されます。このような間違いの場合でも、古典的なBASICではそのまま実行されてしまいます。しかし、&lt;br /&gt;　　hoge=100;&lt;br /&gt;　　hogu=hoge+1;&lt;br /&gt;と書いた場合では、このスクリプトでもそのまま実行されてしまうので完璧ではありません。&lt;br /&gt;&lt;br /&gt;３、明示的に変数の宣言を書くことも出来る&lt;br /&gt;　var hoge;で変数hogeの宣言ができます。初期化を省略した場合、0で初期化されます。&lt;br /&gt;&lt;br /&gt;４、組み込み関数の追加&lt;br /&gt;ジョイスティックの状態を返す関数&lt;br /&gt;　　　stick_x()、stick_y()&lt;br /&gt;ボタンの状態を返す関数&lt;br /&gt;　　　botton()&lt;br /&gt;プレイヤー位置を返す関数&lt;br /&gt;　　　get_px()、get_py()&lt;br /&gt;プレイヤー位置の方向に向きを変える関数&lt;br /&gt;　　　look_at_player()&lt;br /&gt;スクリプトの実行を終了する関数&lt;br /&gt;　　　 destroy()&lt;br /&gt;BGMを再生する関数&lt;br /&gt;　　　play()&lt;br /&gt;効果音を鳴らす関数&lt;br /&gt;　　　sound()&lt;br /&gt;得点を加算する関数&lt;br /&gt;　　　add_score()&lt;br /&gt;&lt;br /&gt;　変数や関数の名前が、いまいち統一感が無い感じがします。初めの頃に作った変数はキャピタライズされていますが、最近作った関数は全部小文字＋アンダーバーになっています。ここは全体的に見直す必要があるかもしれません。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115088005131430237?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115088005131430237/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115088005131430237' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115088005131430237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115088005131430237'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/blog-post_21.html' title='スクリプトの言語仕様'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115062883074805668</id><published>2006-06-18T19:34:00.000+09:00</published><updated>2006-06-18T20:07:10.776+09:00</updated><title type='text'>VisulalStudioExpressEditionに一本化</title><content type='html'>　STGの本体のプログラムは、VisualStudio Express Editionで開発していたのだが、スクリプトコンパイラはVisualC++6.0で開発していた。この二つのバージョンのVisualC++はうまい具合に同居できたので、同時に立ち上げて開発したりしていた。古めのPCで開発環境を構築しようと思ったのだが、VC6.0とExpressEditionの二つとPlatoformSDKとDirectXSDKをインストールすると、かなりディスクスペースを食うので、ロースペックなPCではきついものがある。しかたないので、ExpressEditionでも開発できるようにスクリプトコンパイラのソースコードを修正した。古い形式の関数を呼び出している部分を全部修正しようかと最初は思ったのだが、&lt;br /&gt;#define _CRT_SECURE_NO_DEPRECATE&lt;br /&gt;っていう一行を書いておけばとりあえずWarningの嵐はおさまるので、書き換えは最小限で済ませることにした。これで一応は、ExpressEditionだけあれば開発できるようになった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115062883074805668?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115062883074805668/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115062883074805668' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115062883074805668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115062883074805668'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/visulalstudioexpressedition.html' title='VisulalStudioExpressEditionに一本化'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115035576895605303</id><published>2006-06-15T16:12:00.000+09:00</published><updated>2006-06-15T16:16:08.966+09:00</updated><title type='text'>ガンマ補正</title><content type='html'>　Windows2000の環境で、STGを起動したら画面が真っ黒だった。しかし音は出ている。特に問題となるようなデバックメッセージも出ていない。グラフィックカードがへぼいから画面が出なくなるんだろうかと一瞬思ったが、よーく目を凝らして画面を見るとかすかにキャラクタらしきものが動いているのが見えた。ほとんど真っ暗なんだけど、液晶を斜めから見たりするとうっすら見える。これはプログラムに問題があると思い、ソースコードを眺めたりしていたのだが、原因がさっぱりわからなかった。　テクスチャ画像（PNG形式）をなにげなくクリックしてみたとき、変なことに気が付いた。表示されたサムネイルが真っ黒だった。XPの環境では普通だったはずなのに。PNGの画像がおかしいか、Windows2000のPNGをデコードするAPIとかがおかしいかのどちらかである。このPNG画像から怪しいニオイがプンプンしたので、とりあえずPNGのヘッダ情報を見てみることにした。ちなみに使用したソフトは&lt;a href="http://entropymine.com/jason/tweakpng/"&gt;http://entropymine.com/jason/tweakpng/&lt;/a&gt;にあったものを使わせていただいた。　そうしたところ、ガンマ値が0.0に設定されている。これは怪しい。これを0.4にしたところ正常に表示されるようになった。このPNG画像を作るためにPhotoShop5.0を使ったのだが、これのPNG出力はどうやらダメダメなのかもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115035576895605303?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115035576895605303/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115035576895605303' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115035576895605303'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115035576895605303'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/blog-post_15.html' title='ガンマ補正'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-115007771535883575</id><published>2006-06-12T10:27:00.000+09:00</published><updated>2006-06-12T15:21:59.883+09:00</updated><title type='text'>DirectX</title><content type='html'>　STGのコア部分がようやく出来上がってきたので、いろいろな環境（会社のPCとか、会社のPCとか）で動作確認を行ってみた。まず大前提として、今回のプログラムはDirectX9が動く環境で動作する。よってOSはDirectX9が動作するものに限定される。具体的にはWindows98以降ならDirectX9がインストールできるので、開発中のSTGも動く可能性がある（しかし、しょぼいディスプレイドライバしか無い等の理由で、DirectX9がインストール出来たからといって、開発中のSTGも必ずしも動くとは限らない）。&lt;br /&gt;　まず、Windows2000で動作テストしてみる。しかし、起動せず。d3dx9_29.dllが無いと怒られる。DirectX9cのランタイムはインストールしてあるのに何故？というわけで検索してみると、d3dx9_29.dllはDirectX 10.0 (February 2006)に含まれているらしい(参考ページ：http://www.nbrains.net/php/pukiwiki/index.php?link%BD%B8%2FDirectX)。同じDirectX9でもバージョンがたくさんあってややこしいことになっている。仕方なくDirectXのランタイムをバージョンアップすると、とりあえずSTGのプログラムは起動した。しかし、会社のマシンはサウンドカードが入って無いので、サウンド関係の初期化処理の部分から先に処理が進まなくなる。サウンドカードが入ってないPCなんかサポート外という仕様にしてしまってもまあ、問題ないかと思うが、一応サウンドドライバが無い環境では、この辺の処理を自動的にスキップするようにしないとまずいと思った。また、文字コードの関係で問題が出る。UNICODEを使用してプログラムを開発していたのだが、Windows2000のWin32APIでは対応していない部分もある様である。デバックメッセージの出力などがうまく動いていない。また、Windows98、Windows98SE、WindowsMEは、UNICODEのAPIはほとんど実装されていないらしく、全滅である（WinMainで最初に行う処理である、RegisterClassがUNICODE対応していない為に失敗する)。UNICODE用にプログラムを書き換える前の古いバージョンのプログラム（S-JIS用)では、Windows98でも動作した。Windowsアプリケーションの開発でUNICODEを何も考えずに使うと、動作するOSがWindowsXPに限定されてしまう様である。Windows2000や98でも動作するUNICODE関連のAPIだけを使うようにすれば、それらのOSでも動作させることが出来るが、面倒な話である。今回のSTGの場合、ゲーム本編では2バイト文字を扱うような部分は存在せず、デバックメッセージ等で2バイト文字を使っているだけである。それだけのために動作するOSがWindowsXPに限定されてしまうのは本末転倒な話である。&lt;br /&gt;　動作確認の結果をまとめると、&lt;br /&gt;1、ターゲットとするDirectXのバージョンを明確にする&lt;br /&gt;2、XP以外も動作保証するならば、文字コードをS-JISにする&lt;br /&gt;3、サウンドカードの無い環境では音関係の処理をスキップする&lt;br /&gt;以上3点の改修を行う必要がある。意味もなく新しいバージョンのDirectXが必要になるようにした場合、このプログラムを動かそうとしたエンドユーザから動作しないというクレームがくるはめになりそうである。DirectX9C以後なら、動作するようなバージョンで開発するべきだと思った。d3dx9_29.dllとかは、DirectX9SDKに含まれているのだが、DirectX10におけるDirect3DのTechnology Previewっていう位置付けのものらしい。DirectX10がちゃんとサポートされるのはWindows Vista以後らしい。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-115007771535883575?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/115007771535883575/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=115007771535883575' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115007771535883575'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/115007771535883575'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/directx.html' title='DirectX'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114993003956239588</id><published>2006-06-10T17:18:00.000+09:00</published><updated>2006-06-11T02:33:52.700+09:00</updated><title type='text'>ひさしぶりに</title><content type='html'>コーディングは間が空いてしまうと、どんどんやらなくなってしまう。一ヵ月も時間が経つと自分のソースコードも他人の書いたのと同じようなも のであると思う。VisualC++を立ち上げても、ソースを解析するところから始めなければならない。そんなときに、自分が書いたBlogを読んでみる と思考の過程を知ることが出来るので、コードを組むときに考えていたことを思い出すことができる。最近忙しくてなかなか時間が取れないが、思いついたこと を無駄にしないように、Blogにメモとして残しておきたい。&lt;br /&gt;generate(),texture(),child()等の組み込み関数のparse処理を行っている関数は、parser.cpp内の parse_function()である。そのparse_function()では、typeという変数にパースした関数の種類が格納されるので、それ を見てスクリプトリストを書き出す処理を加えれば良い。&lt;br /&gt;generate("filename")の"filename"という文字列リテラルは、parse_expression()でパー スされる。現状では、node = make_node(type, parse_expression(), null); というコードで構文木を作っているので、この処理を分割してparse_expression()の左辺値を変数に取っておく。現状では、nodeは expressionであれば、コンパイルが通ってしまうので、typeが示している組み込み関数の引数として、node-&gt;typeの種類が正しいかチェックする必要がある。具体的に は、&lt;br /&gt;switch (type) {&lt;br /&gt;   case T_GENERATE:&lt;br /&gt;   case T_CHILD:&lt;br /&gt;       if (node-&gt;type == T_STRING) {&lt;br /&gt;  //構文木を作る処理&lt;br /&gt;} else {&lt;br /&gt;  // コンパイルエラーのメッセージを出す処理&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;のような処理が必要になる。generateとchild関数は、引数にstring型の変数を１つだけ渡せる関数なので、このようなチェックを行い、ifの条件がtrueにならなかった場合はコンパイルエラーにしなければならない。&lt;br /&gt;int list_set(char *key)という関数に、スクリプトのファイル名をキーとして渡してやり、int型のユニークな番号を戻り値で受け取る。具体的なコードは、&lt;br /&gt;unique_num = list_set(node-&gt;str);&lt;br /&gt;で ある。list_set()では、呼ばれるごとにスクリプトリストのファイルを開いて、なかにkeyと同じ行が無いか探す。同じ行が見付かった場合、その 行番号を返す。見付からなかった場合は、スクリプトリストの最後の行にkeyを追加して、その行番号を返す。その行番号がスクリプトのファイル名に対応す るユニーク番号となる。&lt;br /&gt;受け取ったユニークな番号を構文木に埋め込む処理であるが、まずnode-typeがT_STRINGになっているのをnode-&gt; type = T_NUMにする。そして、node-&gt;dbl_num = unique_numとして、スクリプトのファイル名をユニークコードで置き換える。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114993003956239588?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114993003956239588/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114993003956239588' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114993003956239588'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114993003956239588'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/06/blog-post.html' title='ひさしぶりに'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114457436355377071</id><published>2006-04-09T18:11:00.000+09:00</published><updated>2006-04-09T18:19:23.566+09:00</updated><title type='text'>コンパイル時間</title><content type='html'>　それにしても、C++側のソースコードのコンパイルに時間がかかるようになってきたなあ。およそ３分ぐらい待たされる。逆に、スクリプトコンパイラのソースコードのコンパイル（ってややこしいな）は、あっという間（５秒ぐらい）で終わる。スクリプトコンパイラではC++のリッチな機能を使わずに組んであることが、コンパイル時間が短い理由だと思われる。&lt;br /&gt;　もし、敵キャラクタのアルゴリズム等もC++側で作りこんだ場合、ソース修正のたびに３分も待たされたらけっこう大変だと思う。その意味では、スクリプトエンジンを組み込むという構想は成功しているのかもしれない（でも、スクリプトエンジン自体のデバッグがかなり大変なんだけどね・・・）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114457436355377071?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114457436355377071/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114457436355377071' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114457436355377071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114457436355377071'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/blog-post_114457436355377071.html' title='コンパイル時間'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114456853701595236</id><published>2006-04-09T16:36:00.000+09:00</published><updated>2006-04-09T16:42:17.040+09:00</updated><title type='text'>ジャンプ命令</title><content type='html'>　スクリプトの命令セットには分岐関係の命令が3つある。条件無し分岐のJMP、スタックが０以外な分岐するJNE、スタックが０なら分岐するJEの３つである。分岐先のアドレスだが、現在は３２ビット値で指定するようになっている。しかし、スクリプトなのでそんなにアドレス空間は広くする必要もない。相対ジャンプなら、-128から127の範囲でジャンプできればほとんどの場合大丈夫だろう。その方がコードサイズが小さくなる。というわけで、ジャンプ先のアドレスを8ビット、16ビット、32ビット、それぞれのサイズで指定できるように命令を追加した。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114456853701595236?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114456853701595236/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114456853701595236' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114456853701595236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114456853701595236'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/blog-post_09.html' title='ジャンプ命令'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114449716731352623</id><published>2006-04-08T20:12:00.000+09:00</published><updated>2006-04-08T20:52:47.326+09:00</updated><title type='text'>超CISC</title><content type='html'>　スクリプトコンパイラの出力するバイナリコードのニモニックは、1バイトのサイズである。仮想マシンのような構造であるスクリプトインタプリタだが、それ用のニモニックは単なる識別子としての役割しかないため、０～２５５の範囲に自由に割り当てることが出来る。ハードウェアのCPUに与えられるニモニックは、CPUの制御回路に与えられる制御信号であるため、仮想マシンのニモニックの様に自由に割り当てることはできない。&lt;br /&gt;　スクリプトインタプリタの命令セットは、なるべく多機能にするのが良い。その方が高速化できる可能性があるからだ。RISCの場合は命令セットを単純化して、その代わりに1つの命令を高速に実行できる機構を持っている。スクリプトインタプリタの高速化は、RISCとはまったく逆のアプローチと言える。命令をなるべく多機能にして、1回の命令実行で行える処理を多くするわけである。これを私は超CISCと名づけた。&lt;br /&gt;　というわけで、超CISCの思想に基づいて、命令をいくつか追加した。バイナリサイズをなるべく小さくするために、&lt;br /&gt;push_imm_byte&lt;br /&gt;push_imm_word&lt;br /&gt;push_imm_dword&lt;br /&gt;push_imm_float&lt;br /&gt;という命令を追加した。また、０や１という数値はプログラム中でよく現れる値なので、専用の命令&lt;br /&gt;push_imm_0&lt;br /&gt;push_imm_1&lt;br /&gt;というのも作ってみた。これによって、コードサイズは半分程度に激減したようである。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114449716731352623?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114449716731352623/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114449716731352623' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114449716731352623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114449716731352623'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/cisc.html' title='超CISC'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114441611497265224</id><published>2006-04-07T22:10:00.000+09:00</published><updated>2006-04-07T22:21:54.986+09:00</updated><title type='text'>最適化</title><content type='html'>optimizerをちょっと改良した。optimizerってのはコードの最適化を行う、スクリプトコンパイラのモジュールである。 C言語の場合だが、以下のように、意味の無い式を書いてもコンパイルは通る。&lt;br /&gt;void main() {&lt;br /&gt;　　int a;&lt;br /&gt;　　a;&lt;br /&gt;}&lt;br /&gt;この場合、a；だけの式は何もしない式である。これに対してコード生成を行うのは無駄である。しかし、今までスクリプトコンパイラはこのような意味の無い式に対してもコード生成を行っていた。&lt;br /&gt;int a;&lt;br /&gt;a;&lt;br /&gt;と記述した場合、&lt;br /&gt;push a&lt;br /&gt;pop&lt;br /&gt;というコードが出力されていた。つまりaの中身をスタックにプッシュするが、その後何もせずにpopするわけである。このような意味の無い式を検出して、削除するようにoptimizerを改良した。これで余計なコードが減るので、出力されるコードサイズがけっこう小さくなった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114441611497265224?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114441611497265224/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114441611497265224' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114441611497265224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114441611497265224'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/blog-post_07.html' title='最適化'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114414532090920691</id><published>2006-04-04T18:52:00.000+09:00</published><updated>2006-04-04T19:08:40.923+09:00</updated><title type='text'>スクリプトリスト</title><content type='html'>えーと、下2回で書いた内容はやっぱやめ（笑）。もっとシンプルな方法でいこう。ハッシュとか使うと複雑になりすぎるね。&lt;br /&gt; まず、スクリプトリストについて。これはスクリプトのファイル名が列挙して書いてあるテキストファイルである。スクリプトのファイル名というのは、バイナリファイル名じゃなくて、ソースファイル名にする。また、スクリプトリストの生成を行うのは、スクリプトコンパイラの役目とすることにした。スクリプトコンパイラは以下のような手順でスクリプトリストを作る。&lt;br /&gt;１、スクリプトリストをロードする。&lt;br /&gt;２、コンパイルするソースファイル名が、スクリプトリスト中に含まれるかどうかをチェックする。含まれて居た場合３へ、含まれて居ない場合は４の処理へ。&lt;br /&gt;３、ソースファイル名がスクリプトリストに含まれていたのが何行目かを変数に保存しておく。&lt;br /&gt;４、スクリプトリストの末尾にソースファイル名を追加して、その行番号を変数に保存しておく。&lt;br /&gt;この処理を経て、変数に行番号が入るわけである。この番号を、そのスクリプトのユニークコードとして用いる。この方法ならば、連番になっているユニークコードとなる。ハッシュで生成したユニークコードでは得られない性質である。&lt;br /&gt;例として、test.txtにおいて以下のような記述がされている場合、&lt;br /&gt;//text.txt&lt;br /&gt;x = 10; y = 20;&lt;br /&gt;generate("enemy1.txt");&lt;br /&gt;frame(10);&lt;br /&gt;generate("enemy2.txt");&lt;br /&gt; このコードをコンパイルすると、スクリプトリストは以下のように生成される。&lt;br /&gt;text.txt&lt;br /&gt;enemy1.txt&lt;br /&gt;enemy2.txt&lt;br /&gt;これは、text.txtを0、enemy1.txtを１、enemy2.txtを２という、ユニークコードを割り付けたことになる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114414532090920691?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114414532090920691/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114414532090920691' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114414532090920691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114414532090920691'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/blog-post.html' title='スクリプトリスト'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114397914404074312</id><published>2006-04-02T20:53:00.000+09:00</published><updated>2006-04-02T20:59:04.050+09:00</updated><title type='text'>double撤廃</title><content type='html'>バイナリ中に埋め込まれる定数を、doubleからfloatに変更した。doubleは8バイト、floatは4バイトなので、コードサイズがけっこう小さくなった。また、余分な型キャストの回数が減ったので、スクリプトの実行速度が速くなったかもしれない。この修正作業は、スクリプトコンパイラのソース中の"double"という文字を"float"に全部置換した。 何も考えず置換を行ったが、うまくいったようだ（笑）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114397914404074312?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114397914404074312/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114397914404074312' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114397914404074312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114397914404074312'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/04/double.html' title='double撤廃'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114380724430784533</id><published>2006-03-31T19:49:00.000+09:00</published><updated>2006-03-31T21:14:04.326+09:00</updated><title type='text'>TODO　その３</title><content type='html'>　カラーキーだが、普通は何色をカラーキーにするものなんだろうか。まあ何でもいいのだと思うが、0x00FF00(原色の緑）とかでいいのかな。 あんまり目には優しくない色だけど（笑）。下では、スクリプト中でカラーキーを指定できるようにしたい、と書いたが、スクリプトはなるべく簡単に書けるのが理想なので、カラーキー指定をスクリプト中でやるのはやっぱり止めようかな。ロードした画像の一番左上、つまり(x,y)=(0,0)の色を調べて、それが０ｘ００ｆｆ００だったらカラーキー有りとする。それ以外の色だった場合は、カラーキー無しとすれば良いような気がする。これならカラーキーの色をいちいち指定しなくてもいいので楽だ。&lt;br /&gt;　スクリプトからスプライトは生成されるわけだが、STGの場合はスプライトの生成と消失を何度も繰り返すわけで、ここの処理は高速に行えないとまずい。スクリプト中では、スプライトの生成をgenerate("filename.bin")という記述で行うつもりである。スクリプトのファイル名を指定しているわけだが、generate関数が呼ばれるたびにファイルを読みに行くような実装では、STGでは使い物にならない。&lt;br /&gt;　ところで、generate関数と同様なインタフェースを持つ関数として、texture関数がある。これもファイル名だけを指定すれば、あとは勝手にシステム側がうまく処理するという設計思想に基づいて作ってある。texture関数の場合、ロード済みのテクスチャのファイル名のmap（連想配列）を内部に持っていて、それを使って、いまtexture関数で指定されたファイル名がすでにロードされているか、されていないかを調べる。この仕組みによって、同じテクスチャを重複してビデオメモリにロードしてしまうのを回避している。この仕組みをスクリプトのロード時にも行えば良いと最初は思っていたのだが、mapに登録されているか否かを調べるのは、スプライトの生成毎に行う処理としては重すぎるように思う。&lt;br /&gt;　この問題を解決する方法として、プログラムの起動時に全てのスクリプトを読み込んでしまう設計にしようと思う。テクスチャと違って、スクリプトは１つのファイルが大きくても1kb程度なのでメモリ使用量は対したこと無い。全てのスクリプトを前もってロードするためには、*.binというファイルをプログラム起動時に検索するという手段も考えられるが、これは実装が面倒くさいと思う。全スクリプトのリストが用意してあればプログラムとして実装するには楽だ。全スクリプトのリストというのは、&lt;br /&gt;player.bin&lt;br /&gt;enemy1.bin&lt;br /&gt;enemy2.bin&lt;br /&gt;tama1.bin&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;   .&lt;br /&gt;という単にファイル名が1行ごとに書いてあるテキストファイルにしようと思う。プログラム起動時に、このリストを見てスクリプトをロードしていくわけである。このリストは手作業で書いてもよいと思うが、バッチファイルで作るようにすれば簡単だろう。スクリプトコンパイラは、generate("test.bin");という記述に対して、"test.bin"からユニークなコードを生成して、ファイル名の代わりに埋め込むようにしようと思う。不定長の文字列から、固定長のユニークコードを生成するには、ハッシュ関数を使うのが普通だと思う。プログラム起動時に、スクリプトのリストにしたがってスクリプトをロードしながら、そのファイル名のユニークコードを作成する。そうすれば、バイナリ中に埋め込まれたユニークコードが何のファイルを指定したものなのか、判別することが出来る。このハッシュ関数のアルゴリズムだが、さすがにMD５とかを持ってくるのは大げさなので、簡単な方法を自分で実装しようと思う。できればコリジョンが無いアルゴリズムに出来れば楽なんだけどな・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114380724430784533?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114380724430784533/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114380724430784533' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114380724430784533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114380724430784533'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/todo_31.html' title='TODO　その３'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114372908961245215</id><published>2006-03-30T23:05:00.000+09:00</published><updated>2006-03-30T23:31:29.626+09:00</updated><title type='text'>TODO　その２</title><content type='html'>　カラーキーをスクリプト中で指定できるようにしたい。ファイル名の後にR,G,Bを指定して、&lt;br /&gt;texture("filename.png", R, G, B);&lt;br /&gt;の様にすればいいと思う。しかし、カラーキーの色は全部の画像ファイルで統一してあれば、固定でもかまわないわけで、&lt;br /&gt;texture("filename.png");&lt;br /&gt;とカラーキーを省略した場合、デフォルトとして指定してあるカラーキーの値を使うことにしよう。カラーキーが要らない場合は、&lt;br /&gt;texture("filename.png", 0, 0, 0);&lt;br /&gt;と全部に0を指定することにしよう。&lt;br /&gt;　スプライトの速度(vx,vy)を指定したら、その速度ベクトルの方向に対してテクスチャの絵が正面が向くように、自動的にスプライトが回転してくれたら楽だ。速度から、自動的にスプライトの角度を設定する関数、&lt;br /&gt;AutoRotation();&lt;br /&gt;みたいなのを作ろうかと思う。詳細は後から考えよう。&lt;br /&gt;　プレイヤーの座標がスクリプトから得られないのでは、かなり問題がある。そこで、&lt;br /&gt;GetPlayerX();&lt;br /&gt;GetPlayerY();&lt;br /&gt;ってのが必要だろう。&lt;br /&gt;　あとは、BGMや効果音をスクリプトから制御する関数も必要だ。インタフェースは単純に、&lt;br /&gt;PlayBGM("hoge.ogg");&lt;br /&gt;PlaySound("fuge.ogg");&lt;br /&gt;PlayBGMLoop("hoge.ogg");&lt;br /&gt;みたいなのがよろしいかと思う。関数の多重定義風に、&lt;br /&gt;PlayBGMLoop("hoge.ogg", A, B);&lt;br /&gt;でABリピートするようにしよう。AとBには何を指定すればいいのかは分からないので、NPK氏に後で聞いておこう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114372908961245215?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114372908961245215/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114372908961245215' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114372908961245215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114372908961245215'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/todo.html' title='TODO　その２'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114372561015513777</id><published>2006-03-30T22:10:00.000+09:00</published><updated>2006-03-30T22:37:44.613+09:00</updated><title type='text'>またスプライトクラスの設計修正</title><content type='html'>またちょっと、スプライトクラスの設計を修正した。こんなことを何回やってるんだろうか（笑）。最終的に、スプライトクラスが全てのクラスの中心的役割を担うようになった。 ゲームの進行に関係ある変数を保持しているのは、スプライトクラスだけである。どのテクスチャとスクリプトを使用しているか、という情報もスプライトクラスが保持している。テクスチャクラスとスクリプトクラス側からは、どのスプライトから参照されているか、というのは知らないわけである。&lt;br /&gt;　スプライトクラスは、自分のペアとなるテクスチャやスクリプトを選びたい放題の八方美人である。いろんなテクスチャやスクリプトと関係を持つ節操が無いクラスである。もはや貞操観念というものが抜け落ちている。しかし、スプライトクラスは、一度関係を持ったクラスには、自分の全てを捧げるという、また違った一面も持っている。&lt;br /&gt;&lt;br /&gt;//スプライトに関連づけされた、スクリプトを実行する&lt;br /&gt;void Sprite::ExecuteScript()&lt;br /&gt;{&lt;br /&gt;　　　//私(this)の全てを捧げます&lt;br /&gt;　　　　script-&gt;Execute(this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;これで、スクリプトは、スプライトを思うがままに出来る。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114372561015513777?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114372561015513777/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114372561015513777' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114372561015513777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114372561015513777'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114372561015513777.html' title='またスプライトクラスの設計修正'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114368282385425913</id><published>2006-03-30T10:12:00.000+09:00</published><updated>2006-03-30T10:47:22.506+09:00</updated><title type='text'>文字コードとか</title><content type='html'>スクリプト中では、単にテクスチャ等のファイル名を指定しておくだけでよく、リソースの管理などはしなくて良い構造にしようと思っている。 具体的には、テクスチャは以下のようにして指定する&lt;br /&gt;texture("filename");。&lt;br /&gt;当然、同じテクスチャを複数のスクリプトで使う場合もある。単純にスクリプトで指定されたテクスチャのファイルを毎回ロードしていたのでは、あっという間にビデオメモリを消費し尽すだろう。texture関数は、ロード済みのテクスチャを覚えておいて、重複してテクスチャをロードしてしまうことを回避するような構造にする必要がある。これを実現するために、STLのmapを&lt;br /&gt;map＜string, IDirect3DTexture9*＞&lt;string,&gt; fileName2Texture;&lt;br /&gt;と定義して、ファイル名とテクスチャへのポインタの対応表を作ろうとした。しかし、wchar_tでファイル名は与えられるが、それをstringに変換してくれるようなstringの代入演算子やコンストラクタは用意されて無いっぽい。どうしたらいいか分からなくて困っていたら、ワイド文字列版のstringであるwstringが有るらしいので、wsrtingを使うことにした。しかし、今度はwstringで&lt;br /&gt;map＜wstring, IDirect3DTexture9*＞&lt;wstring,&gt; fileName2Texture;&lt;br /&gt;とやろうとすると、コンパイラが文句を言ってくる。STLのソースコードの行番号を表示して、定義を確認してくださいとかほざくのである。そんなの無理です（笑）。いい加減、ワイド文字列で処理するのが面倒になってきたので、UNICODEからマルチバイト文字に変換するWinAPIで変換してしまおうか、という考えが頭をよぎる。しかし、テクスチャを指定するたびに、文字コード変換するAPIを呼ぶのはいかがなものだろうか。多分、文字コード変換は軽い処理では無いはずだ。スクリプトエンジンのパフォーマンスに影響を与えるに違いない。あーめんどくせー。&lt;/wstring,&gt;&lt;/string,&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114368282385425913?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114368282385425913/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114368282385425913' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114368282385425913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114368282385425913'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114368282385425913.html' title='文字コードとか'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114365163405769776</id><published>2006-03-30T01:40:00.000+09:00</published><updated>2006-03-30T06:47:50.250+09:00</updated><title type='text'>スタックオーバーフロー</title><content type='html'>　スクリプト実行時に、スタックオーバーフローと無限ループに入ってしまう場合があるバグが直った。 原因はコード生成するルーチンに抜けがあった為だった。バグは比較演算子の!=などで発生していた。parserは!=のトークンに対して、T_NEという識別の為の定数をもつ構文木のノードを作る。しかし、T_NEノードに対して適切なコードを生成する部分を、code generatorに追加するのを忘れていたようだった。結果として、!=は無かったのと同じことになってしまっていた。私は、あまり!=を使わないでプログラムを書くので、今までこのバグが発覚しなかった様だ。&lt;br /&gt;　例えば、擬似的な表記ではあるが、&lt;br /&gt;if (A!=B) { L1: ...} else { L2: ...}&lt;br /&gt;という記述から生成されるコードは、&lt;br /&gt;push A&lt;br /&gt;push B&lt;br /&gt;sub&lt;br /&gt;je L2&lt;br /&gt;L1:&lt;br /&gt;...&lt;br /&gt;L2:&lt;br /&gt;...&lt;br /&gt;こんな感じになる。今回のバグの場合、!=に対してのコード生成が行われなかった為、&lt;br /&gt;push A&lt;br /&gt;push B&lt;br /&gt;je L2&lt;br /&gt;...&lt;br /&gt;L2:&lt;br /&gt;...&lt;br /&gt;このようになっていた。subが無い場合スタックからAの値がpopされないままになってしまう。また、je L2では、Bが０か？という判定だけを行い、L2に飛ぶので場合によっては無限ループになっていたわけである。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114365163405769776?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114365163405769776/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114365163405769776' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114365163405769776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114365163405769776'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_30.html' title='スタックオーバーフロー'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114359983321968739</id><published>2006-03-29T11:34:00.000+09:00</published><updated>2006-03-29T11:37:13.236+09:00</updated><title type='text'>変数の宣言　続き</title><content type='html'>下で書いた通り、C++風にどこでも変数の宣言が出来るように、スクリプトコンパイラを修正した。これでちょっとだけスクリプトが書きやすくなった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114359983321968739?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114359983321968739/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114359983321968739' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114359983321968739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114359983321968739'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114359983321968739.html' title='変数の宣言　続き'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114359712827051366</id><published>2006-03-29T10:17:00.000+09:00</published><updated>2006-03-29T10:53:27.666+09:00</updated><title type='text'>変数の宣言</title><content type='html'>STGスクリプトの、プログラムは、ブロック、である。&lt;br /&gt;なんだか意味が分からない文章だが、BNF記法風に書くならこうなる。&lt;br /&gt;&lt;プログラム&gt;:=&lt;ブロック&gt;&lt;br /&gt;さらに、ブロックは、宣言リストか、文か、ブロックの繰り返し、である。&lt;br /&gt;&lt;ブロック&gt;:=&lt;宣言リスト&gt;|&lt;文&gt;|&lt;ブロック&gt;*&lt;br /&gt;ブロックっていうのは、{ }で囲まれた部分のことであり、宣言リストというのは、int x; float f; char str;などと、宣言が並んでいる部分のことである。&lt;br /&gt;　現状の実装の場合、STGスクリプトでは、宣言はブロックの先頭でのみ行うことができる。しかし、ブロックはブロックの中にいくつでも作れる。つまり、ブロックを作ってやれば、いつでも宣言が出来ることになる。宣言がブロックの先頭でしか出来ない、というのはC言語と同じである。C++になると、宣言はどこでも出来るようになった。このSTGスクリプトの場合、変数のスコープというものが無いので、ブロックの先頭でしか宣言が出来ないという制限を与える意味も無いかもしれない。ここはC++風に改めた方がいいかもしれない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114359712827051366?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114359712827051366/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114359712827051366' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114359712827051366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114359712827051366'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_29.html' title='変数の宣言'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114356984802458405</id><published>2006-03-29T03:15:00.000+09:00</published><updated>2006-03-29T03:17:28.043+09:00</updated><title type='text'>スクリプトSDK</title><content type='html'>現時点で出来上がっている、スクリプト開発用のツールとドキュメントをまとめた。サンプルを見れば、おおよその記述方法は分かると思う。&lt;br /&gt; http://park19.wakwak.com/~usapyon/ScriptSDK.zip&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114356984802458405?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114356984802458405/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114356984802458405' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114356984802458405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114356984802458405'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/sdk.html' title='スクリプトSDK'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114355061541205582</id><published>2006-03-28T21:08:00.000+09:00</published><updated>2006-03-28T22:02:31.106+09:00</updated><title type='text'>スクリプトのバグ？</title><content type='html'>スクリプトコンパイラもしくはインタプリタにあるバグの原因を突き止めやすくするために、スクリプトコンパイラの生成するバイナリに、トレース情報を埋め込むオプションをつけた。ここで言うトレース情報とは、単純にソースコードの行番号を、ソースのセンテンス（文）が終わる部分（このスクリプトの場合、文の終わりは;で示している）で出力しているだけである。そのようなオプションが必要になったのには理由がある。特定のスクリプトを実行した場合に、無限ループに陥る上に、スタックオーバーフローを起こす場合があることが判明した。そのバグは必ず発生するわけではなく、スクリプトの記述をちょっと変えたりすると再現しなくなる。バグを起こすスクリプトの記述の仕方には、想定している文法上では無限ループになったりするような部分は無い。また、スタックオーバーフローを起こすような長い計算式も無い。よって、この原因は、スクリプトコンパイラかスクリプトインタプリタのバグだろう。&lt;br /&gt;　このようなバグの原因を探すのは難しい。今までは、コンパイラが出力したコードを逆アセンブルして、アセンブリコードを頭の中で実行してみて、コンパイラのバグを探すしかなかった。今回の修正で、トレース情報をバイナリに埋め込むことが出来るようになったので、スタックが溢れつつある場合には、そのときのインストラクションポインタ、スタックポインタ、ソースの行番号をコンソールへ出力できるようになった。これでデバック効率がずっと良くなる。&lt;br /&gt;　例えば、以下のようなコードをコンパイルして、&lt;br /&gt;float a, b, c, d;&lt;br /&gt;a = b + c * d;&lt;br /&gt;生成されたコードを逆アセンブラにかけた場合、出力されるアセンブリコードは、&lt;br /&gt;push [19]&lt;br /&gt;push [21]&lt;br /&gt;push [20]&lt;br /&gt;mul&lt;br /&gt;add&lt;br /&gt;push 18&lt;br /&gt;store&lt;br /&gt;pop&lt;br /&gt;である。push [19]という命令は、メモリの19番地の内容をスタックにプッシュする。この場合、コンパイラはfloat型の変数bを１９番地に割り当てたわけである。続いて、cとdも順にプッシュされる。mulは、スタックから２個の値をポップして、その２つの値を乗算した結果をスタックにプッシュする。addはmulと同様に、スタックから２個の値を取り出して、加算した結果をプッシュする。push 18は、変数aのアドレスである18を、スタックにプッシュする。storeは、スタックから最初にアドレスをポップして、次に書き込むデータをポップする。そして、そのアドレスとデータを使って、メモリに書き込む動作をした後に、データをスタックに戻す（プッシュ）する。これは、その計算式の右辺値を使う場合に必要になるからである。このコードの場合は、計算はここで終わりで右辺値は使用していないので、最後にpopされて、そのデータはスタックから捨てられる。&lt;br /&gt;　このように、１つのセンテンスを実行すると、スタックポインタは０に戻るのが普通である。スタックポインタが何らかの原因で０にならなかった場合、それがループ中だったらいつかスタックオーバーフローを起こすのは自明である。つまり、１つのセンテンスの中でスタックにプッシュした回数と、ポップした回数は等しくなければならない。等しく無い場合は、コンパイラのコード生成のどこかでミスをしているはずだ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114355061541205582?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114355061541205582/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114355061541205582' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114355061541205582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114355061541205582'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_28.html' title='スクリプトのバグ？'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114352296395271520</id><published>2006-03-28T13:38:00.000+09:00</published><updated>2006-03-28T14:16:03.966+09:00</updated><title type='text'>関数が作れないC言語</title><content type='html'>　今作成中のスクリプト言語を一言で説明するならば、「関数が作れないC言語 」となるだろう。基本的にはC言語になるべく似せるように設計した。HSPの様に独自の言語体系になってしまうと、スクリプトを書く人が言語を覚えるのが大変だろうということで、慣れている人が多いと思われるC言語に似せることで、覚えなくてはいけないことを減らそうという考えがあった。&lt;br /&gt;　しかし、このスクリプトとC言語では差異がかなりあるのも事実である。変数は基本的に全てfloatだけである。double、int、long、charの変数を定義してもエラーにならないし変数も普通に使えるが、その変数の実態はfloatである。int num;と定義した変数に対して、num=0.5;と記述してもエラーにならないので気をつけないといけない。また、ループ脱出構文も用意されていない。breakとcontinueは実装するのが面倒そうだったので入れるのを止めた（笑）。さらに、gotoも無いので、ループを途中で抜ける手段はまったく無いわけで、場合によっては不便かもしれない。後でgotoぐらいは実装するかもしれない。ループ構文には、for(,,,){ }、while( ){ }、 do{ } while(); が使用できる。switch( ) { case  }は便利な構文であるが、これも実装が面倒そうなので、実装していない。if () { } else if () { } という書きかたは出来るので、それでswitchの代わりにすることになる。また、配列変数、ポインタ変数、構造体も使えない。&lt;br /&gt;　演算子についてであるが、使用できる変数の型がfloatだけであるので、ビット演算の演算子は全て使えない。具体的には&amp;、|、&lt;&lt;、&gt;&gt;、＾などが使用できないビット演算子である。マニアックなところでは、条件演算子の? :や、コンマ演算子も使用できない。float a, b, c, d;という記述は出来るが、これのコンマは、コンマ演算子としての実装ではない。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114352296395271520?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114352296395271520/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114352296395271520' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114352296395271520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114352296395271520'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/c.html' title='関数が作れないC言語'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114347110128654319</id><published>2006-03-27T23:31:00.000+09:00</published><updated>2006-03-28T00:00:47.600+09:00</updated><title type='text'>演算子など追加</title><content type='html'>このスクリプトには、実は論理演算のAND、ORが無かった。つまり、C言語の＆＆と｜｜のことです。 実装したつもりでいて、実装してなかったらしい。先日、スクリプトをコンパイルしようとして、&lt;br /&gt;ｉｆ（ｘ＜０　｜｜　ｘ＞＝６４０）｛&lt;br /&gt;という部分で、なぜかエラーが出るのでソースを見直したら、実装してないことに気が付いた（笑）。&lt;br /&gt;&lt;br /&gt;可読性に欠けるが、上記のコードについて、&amp;&amp;amp;amp;と||を使わなくても、&lt;br /&gt;if（（ｘ＜０）＋（ｘ＞＝６４０）｛&lt;br /&gt;でも、等価な動作をする。また、論理を反転して&lt;br /&gt;if（ｘ＞＝０　＆＆　ｘ＜６４０）｛&lt;br /&gt;または&lt;br /&gt;if（（ｘ＞＝０）＊（ｘ＜６４０））｛&lt;br /&gt;でも同じことが記述できる。&lt;br /&gt;そういう書き換えを使って、&amp;&amp;amp;と||無しを仕様ということにしてしまうおうかと思ったが、分かりづらいので、&amp;&amp;amp;と||も追加することにした。&lt;br /&gt;　昨日から、スクリプトコンパイラにたくさん機能追加したので、色々なソースを食わせてみてテストをおこなってみた。きわどい記述のソースコードをコンパイルしてみて、バグ出しをするわけである。それで気が付いたのが、演算子の優先順位がＣ言語とはちょっと違ってしまっていることだ。Ｃ言語では、&lt;br /&gt;if (a || b &amp;&amp;amp; c) {&lt;br /&gt;というコードがあったら、&amp;&amp;amp;が先に評価されるようになってたはず。このスクリプト言語の場合は、||と&amp;&amp;amp;は優先順位が同じにしてしまったので、このコードの場合、左から順に評価される。つまり||が先になる。&lt;br /&gt;まあ、このコードのようなきわどい記述は普通しないので、問題にならないとは思う。とは言っても、このような細かいバグが全体に散らばってるので、直していかないとなあ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114347110128654319?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114347110128654319/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114347110128654319' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114347110128654319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114347110128654319'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114347110128654319.html' title='演算子など追加'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114345146361271767</id><published>2006-03-27T18:13:00.000+09:00</published><updated>2006-03-27T18:24:23.623+09:00</updated><title type='text'>ＴＯＤＯ</title><content type='html'>今のスクリプトコンパイラはdoubleを基本としたコードを出力する。バイナリ中に埋め込まれる定数も、基本的に全部doubleだ。これは元々、このスクリプトコンパイラはゲーム用に使うことを想定していなかったからである。ゲーム本体側のプログラムではDirect3Dを使う関係で、浮動少数点の変数は全てfloatにしてある。スクリプトインタプリタは元々はdouble用だったのだが、小手先の修正を行って、バイナリからロードする部分でdoubleからfloatに変換を行い、後の演算はfloatで行うようになっている。 型のキャストというのは結構、処理時間を食うものなので、スクリプトコンパイラもfloatを使うように変更するべきだと思う。定数１個で、8byteもバイナリサイズを食うのも良くないしね。スクリプトコンパイラのソースコード中に出てくるdoubleという文字を、置換でfloatに全部置き換えたら、うまく動いてくれないかな・・・&lt;br /&gt;　後、当たり判定のことをすっかり忘れていたのだが、どういう仕組みにしようかなあ。まあ、スクリプト側では当たり判定のことを気にしなくても、画面外に出たりすると勝手にキャラクタが消失してくれるような仕組みがいいと思うんだけど、やってみないと分からない部分が多いな。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114345146361271767?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114345146361271767/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114345146361271767' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114345146361271767'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114345146361271767'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114345146361271767.html' title='ＴＯＤＯ'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114340996136249327</id><published>2006-03-27T06:34:00.000+09:00</published><updated>2006-03-27T06:52:41.373+09:00</updated><title type='text'>組み込み関数の実装</title><content type='html'>文字列リテラルの処理を追加しようとコードを弄ってるうちに、ちょっとずつスクリプトコンパイラ細部の設計を思い出してきたので、組み込み関数の追加はあっさり出来た。追加した関数は以下の通り。&lt;br /&gt;generate("FileName.bin")               FileNameというファイル名のスクリプトを実行する&lt;br /&gt;child("FileName.bin")                      FileNameというファイル名のスクリプトを子として実行する&lt;br /&gt;texture("FileName")                        FileNameというファイル名の画像をテクスチャとして設定する。&lt;br /&gt;frame(n)                                            ゲームをnフレーム進める。&lt;br /&gt;abs(x)                                                xの絶対値を求める。&lt;br /&gt;sin(x)                                                 xのsinを求める。&lt;br /&gt;cos(x)                                                 xのcosを求める。&lt;br /&gt;toint(x)                                              xの小数部を切り捨てる。&lt;br /&gt;print("string")                                  stringをデバックメッセージとして、コンソールに出力する。&lt;br /&gt;今の所はこんな感じである。ちなみに、これらの関数はスクリプトエンジンの命令セットの１つの命令としてコンパイルされる。スクリプトエンジンの命令セットは、１バイト固定長なので、２５６種類の命令を定義できる。命令の種類はまだ４０個ぐらいしかないので、ガンガン命令を追加しても大丈夫だ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114340996136249327?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114340996136249327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114340996136249327' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114340996136249327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114340996136249327'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114340996136249327.html' title='組み込み関数の実装'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114339339439048283</id><published>2006-03-27T02:02:00.000+09:00</published><updated>2006-03-27T02:16:34.403+09:00</updated><title type='text'>文字列</title><content type='html'>自分の昔のコードを解読（笑）し、何とかスクリプトコンパイラが文字列を扱えるように改良した。ちょっと間違えると簡単に暴走するコードに機能を追加するのは大変だった。最初は、「文字列型」を追加しようと思っていたのだが、それはかなり大掛かりな仕事になると途中で気が付いたため、「文字列リテラル」のみを扱うように方向修正した。つまり、"ABCDE"と文字列リテラルを定義することは出来るが、char str="ABCDE"というように変数へ代入することは出来ないということである。まあ、スクリプト中で文字列処理するようなことは無いと思うので、問題ないはず。そもそも、NULL終端の文字列を１バイトづつ弄り繰り回さないといけないスクリプト言語なんてかなりイヤだ。おそらくスクリプト中での文字列の役割といえば、ファイル名を指定することだけだと思うので、generate("enemy.bin");というような感じで、組み込み関数へ文字列を渡せれば、それで役目は果たすだろう。とりあえず、一番ネックとなっていた部分がクリアできたので安心した。後は、スクリプトの組み込み関数を充実させれば、一通りのＳＴＧを作るためのフレームワークは最低限ではあるが、揃ったといえるだろう。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114339339439048283?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114339339439048283/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114339339439048283' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114339339439048283'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114339339439048283'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_27.html' title='文字列'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114337992122175294</id><published>2006-03-26T22:21:00.000+09:00</published><updated>2006-03-26T22:32:01.230+09:00</updated><title type='text'>Sinテーブル</title><content type='html'>Ｓｉｎテーブルを使って、Sin(x)とCos(x)を求める関数を作っていたのですが、ちょっと方針変更して、xの単位は度を使うことにしました。つまり、 Cos(360)は１になります。ラジアンを単位にするのが普通だと思いますが、スクリプト中で角度を指定するときに、ラジアンよりは度の方が感覚的に分かりやすいかと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114337992122175294?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114337992122175294/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114337992122175294' title='4 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114337992122175294'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114337992122175294'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/sin.html' title='Sinテーブル'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114328298443527126</id><published>2006-03-25T19:14:00.000+09:00</published><updated>2006-03-25T19:36:24.443+09:00</updated><title type='text'>ソースコードの整理</title><content type='html'>今回のスクリプトクラスとスプライトクラスの修正は結構大掛かりでした。後は大きな構造の変化を伴う修正は無いと思うので、このタイミングでコメント等も整理することにしました。前々から、コメントはDoxygenにかけるとドキュメントになる形式にするという話だったのですが、コメントをちゃんとつけながらプログラムを組むというのはなかなか面倒なもので、後回しになっていたのでした。&lt;br /&gt;　ついでのついでで、関数ごとのエラーチェックの甘い部分を探して、エラー処理を強化してみたり。特にスクリプトエンジン周りは、念入りにエラーメッセージを吐き出すようにしました。スクリプトエンジン周りでエラーが発生した場合、スクリプトエンジン自体にバグがあるのか、それとも食わせているスクリプトのバグなのか、はたまたスクリプトコンパイラのバグなのか・・・と、原因の切り分けが難しくなります。#define DEBUGしている場合は、スクリプトが持っているスタックやローカルメモリにアクセスする関数で、アクセス先が適切な範囲内かチェックを行うようにしました。この場合、実行速度が犠牲になります。#define DEBUGを消せば、エラーチェック無しで全開動作するようになります。とりあえず、#define DEBUGしてあるときは、どんなめちゃくちゃなスクリプトを食わせても、アクセス違反で落ちたりすることは無くなったはずだと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114328298443527126?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114328298443527126/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114328298443527126' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114328298443527126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114328298443527126'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114328298443527126.html' title='ソースコードの整理'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114326950533566758</id><published>2006-03-25T12:35:00.000+09:00</published><updated>2006-03-25T15:51:45.383+09:00</updated><title type='text'>スプライトクラスの修正</title><content type='html'>今日もスプライトクラスの設計を修正しました。スプライトクラスに寄生するように存在していた、文字列をスクリーンに描画する関数を１つのクラス（Textクラス）に独立させました。スプライトクラスを基底として、TextクラスとＢＧクラスがそれを継承する構造になりました。この効果として、スプライトコンテナにはTextでもBGでも気にせず放り込むことが出来ます。また、自分自身を描画するメソッドDraw()は、継承先でカスタマイズしてあるので、それぞれの特徴にあわせて余分な計算を省くことにより高速化できました。&lt;br /&gt;　現在、ゲーム中の処理の中で一番負荷が高いのは、ＢＧの描画です。ＢＧだけでおよそ２５％ぐらいＣＰＵ時間を使用しています。これはＢＧを半透明で多重に重ね合わせて描画する処理を、マルチパスレンダリングで行っていることが重くなる原因だと思います。つまりＢＧの枚数の分だけ、何度も重ね描きをしている状態です。現在のDirect3Dでは、シングルパスで複数のテクスチャを各種の合成処理を行ってレンダリングする機能は普通にサポートされています。自分のボロノートＰＣの総合グラフィックチップの場合でも、Direct3DのDeviceのCapsを調べると、MaxSimultaneousTexturesが8なので、８枚のテクスチャを同時に処理できる様です。多分現在のグラフィックチップなら当たり前にシングルパスマルチテクスチャリングは出来るっていうことでしょう。この機能を使って、ＢＧを重ね合わせた状態で１度のパスでレンダリングすれば高速化が期待できます。今回、BGクラスは（Spriteを継承して）独立した状態になりましたので、BGクラスのDraw（）メソッドをチューンして、頂点構造体に複数のテクスチャ座標を持たせるようにすれば、少ない変更でシングルパスマルチテクスチャリングに対応可能なはずです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114326950533566758?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114326950533566758/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114326950533566758' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114326950533566758'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114326950533566758'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114326950533566758.html' title='スプライトクラスの修正'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114322692423397206</id><published>2006-03-25T03:40:00.000+09:00</published><updated>2006-03-25T09:36:30.963+09:00</updated><title type='text'>スクリプトエンジンの改良４</title><content type='html'>今日はスクリプトエンジンとスプライト関係に大きな修正を入れた。今までは、スクリプトオブジェクトがスプライトオブジェクトへのポインタを保持していて、スクリプトがスプライトを呼び出す形になっていた。今回の修正で、その関係が逆になり、スプライトがスクリプトを呼び出すようになった。この様に変更した理由は２つある。１つ目は、複数のスプライトで同一のスクリプトを使うという場合は良くあるが、そのときスクリプトオブジェクトのインスタンスが１つだけで済むようにするためである。２つ目は、スプライトのパラメタを直接的にスクリプトが書き換えられるようにするためである。&lt;br /&gt;　スクリプトはfloat型変数６４個分の変数領域を使用できる。このうちの先頭から１８個分をスプライトのパラメタ用としてリザーブしてある。つまりスクリプトとスプライトはメモリを共有しているわけである。以前はメモリをスクリプト、スプライトがそれぞれ別にメモリ領域を持っていた為、スクリプトの実行前と実行後に、メモリの内容をお互いにコピーする必要があった。このオーバーヘッドをメモリを共有する仕組みになったことにより無くすことが出来た。この仕組みは単純な方法で実現できた。実際に使用しているコードが以下の通りである。&lt;br /&gt;    union&lt;br /&gt;   {&lt;br /&gt;       float mem[memSize];                //スクリプトの変数用メモリ領域&lt;br /&gt;       struct&lt;br /&gt;       {&lt;br /&gt;           float width;                //スプライト横サイズ&lt;br /&gt;           float height;                //スプライト縦サイズ&lt;br /&gt;           float x;                    //位置X成分&lt;br /&gt;           float y;                    //位置Y成分&lt;br /&gt;           float vx;                    //速度X成分&lt;br /&gt;           float vy;                    //速度Y成分&lt;br /&gt;           float ax;                    //加速度X成分&lt;br /&gt;           float ay;                    //加速度Y成分&lt;br /&gt;           float theta;                //角度（θ）&lt;br /&gt;           float omega;                //角速度(dθ/dt)&lt;br /&gt;           float domega;                //角加速度（d^2θ/dt^2)&lt;br /&gt;           float animationCount;        //アニメーション位置&lt;br /&gt;           float animationSpeed;        //アニメーション速度&lt;br /&gt;           float animationStartCount;    //アニメーション開始位置&lt;br /&gt;           float animationEndCount;    //アニメーション終了位置&lt;br /&gt;           float animationInterval;    //アニメーション間隔&lt;br /&gt;           float divideWidthNum;        //テクスチャ横の分割数&lt;br /&gt;           float divideHeightNum;        //テクスチャ縦の分割数&lt;br /&gt;       };&lt;br /&gt;   };&lt;br /&gt;unionを使用して、スクリプトの変数領域と、スプライトのパラメタを同じメモリに割り当てているわけである。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114322692423397206?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114322692423397206/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114322692423397206' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114322692423397206'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114322692423397206'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_25.html' title='スクリプトエンジンの改良４'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114312562083098102</id><published>2006-03-23T23:28:00.000+09:00</published><updated>2006-03-23T23:53:40.840+09:00</updated><title type='text'>BGについて</title><content type='html'>BG（バックグランド）面に描画するマップチップのサイズはどの程度が適切だろうか？ファミコン等の昔のハードウェアにはPCGという機能があった。８ｘ８ドットのチップを画面に敷き詰めることが出来る機能である。今回のSTGでは、Direct３Dのテクスチャ機能をPCGに見立てたライブラリを作ろうと思う。640x480ドットのスクリーンは、昔のゲーム機から比べればずっと解像度が高いので、１つのチップが８ｘ８ドットでは細かすぎると思う。マップをエディットする手間も増えるだろう。とすれば、１６ｘ１６か、３２ｘ３２の２択になる。今回作るのは縦STGなので背景には当たり判定が無い。横STGだと背景に当たり判定のあるのが普通なので、その場合細かくマップが配置できないとまずい。しかし縦STGの背景は視覚的な要素しか持っていない為、あまり細かくする必要は無いだろう。よって、３２ｘ３２ドットのマップチップで行こうと思う。&lt;br /&gt;　ゲーゼンに置いてある縦STGは縦画面になっている場合が多い。横に長すぎると、ゲームバランスが取りづらい為だと思う。ゲーセンのモニターは物理的に縦になってるが、PCのモニタはそんなことをするわけにはいかない。横６４０ドットの左右をトリミングして、縦長のレイアウトにしようと思う。&lt;br /&gt;　今回のSTGでは、マップの仮想画面を５１２ｘ５１２にしようと思う。スクリーンの横６４０ドットのうち、左右それぞれ６４ドットずつをトリミングした場合、表示する部分は５１２ドットになる。スクリーンの縦は４８０ドットだが、スクロール用に画面外で見えない位置でもマップを配置しておく必要がある。そのため縦も５１２ドットとすると、マップ１行分がスクロール用として使えることになる。縦横ともに２のｎ乗の数になっているため、プログラミングする上でも楽だ。&lt;br /&gt;&lt;br /&gt;　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114312562083098102?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114312562083098102/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114312562083098102' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114312562083098102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114312562083098102'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/bg.html' title='BGについて'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114304793540616970</id><published>2006-03-23T01:37:00.000+09:00</published><updated>2006-03-23T03:00:53.066+09:00</updated><title type='text'>スクリプトの組み込み関数を妄想する</title><content type='html'>さて、STGのスクリプト言語にはどんな関数があれば、開発効率が良いでしょうか。今回のスクリプトではフレームを単位にしてスプライトの移動量などを指定します。現状だと、フレームの制御は以下のようなコードで行います。&lt;br /&gt;//１０フレーム動かす&lt;br /&gt;for (i = 0; i &lt; 10; i++) end;&lt;br /&gt;end命令がこのスクリプトの肝です。endを実行するたび、ゲームが１フレーム進行するわけです。スプライトは内部に速度などのパラメータを持っていますので、それらを最初に設定してやれば、あとは適当にフレームを進めることで勝手に動く設計になっています。ですがこの記述の仕方ですが、あんまりendという名前から連想される機能と、実際の機能が違っている感じがします。そういう意味ではendという名前はかなり適切ではなかったと思います。まずはこれをどうにかしたい。&lt;br /&gt;frame(10);&lt;br /&gt;さっきと等価なコードを上記のように書ければ、より分かりやすくなると思います。ので、frame()関数を追加したいと思います。&lt;br /&gt;　STGでは、自機の位置を狙って打つ敵弾と、そうではない敵弾のバランスが重要だと思います。全ての敵弾が自機の位置に正確に狙って打たれた場合、自機を小刻みにちょっとずらすだけで簡単に避けられてしまいます。逆に全ての敵弾がランダムな方向に打たれた場合は、場合によっては自機をまったく動かさなくても敵弾を避けられてしまう場合も出てくるでしょうし、逆に自機をあまり動かしすぎると流れ玉に当たって理不尽な死に方をする羽目になると思います。自機の位置を狙って打つ敵弾と、そうではない敵弾では、避け方が違ってくるということです。この２つをうまく混ぜることによって、プレイして面白いSTGになるのではないかと思います。&lt;br /&gt;　というわけで、自機の方向にキャラクタの角度を向ける関数が必要ですね。LookAtPlayer()なんていう名前の関数にしようと思います。&lt;br /&gt;　もっと肝心な関数があります。弾などを発射するための関数です。スプライトのシステムから見た場合、敵キャラクタ、プレイヤーのキャラクタ、敵弾及び自機から発射された弾、これらは区別がありません。これらは全てGenerate()関数を使って生成するようにしようと思います。Generate("enemy1.bin");のような感じで、新しいキャラクタを生成します。enemy1.binはそのキャラクタを制御するスクリプト（のバイナリ）名です。&lt;br /&gt;　STGといえば、多間接は外せない要素でしょう。多間接の物体をどうやって定義するかが問題となります。そこでChild()関数というのを入れようと思います。Child("enemy1.bin");という感じで使います。この場合、enemy1.binというスクリプトで新しい子のキャラクタを作るわけです。基本的にはgenerate()とあまり変わらないのですが、childの場合、子となるキャラクタの座標系は、子を生成した親キャラクタの位置を中心としたローカルな座標系となります。つまり、親が動けば、子も一緒に動くようになるわけです。逆に子が動いても、親の位置は変化しません。たぶん、この機能があれば簡単に多間接を実現できるはずです。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114304793540616970?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114304793540616970/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114304793540616970' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114304793540616970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114304793540616970'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_23.html' title='スクリプトの組み込み関数を妄想する'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114303955935486601</id><published>2006-03-22T23:42:00.000+09:00</published><updated>2006-03-23T00:18:16.056+09:00</updated><title type='text'>コンソールはUNICODE非対応なの？</title><content type='html'>このSTGは一応UNICODE用ってことで開発していたのですが、実はコンソールに文字を出力する部分などはShift-JISのままになっていたのです。何故かといえば、コンソールに文字を出力してもUNICODEだと文字化けするからです。たとえば、&lt;br /&gt;int _tmain(int argc, _TCHAR* argv[]) {&lt;br /&gt;    wprintf(L"テスト\n");&lt;br /&gt;    return 0;&lt;br /&gt;}&lt;br /&gt;みたいなコードを実行してもコンソールには何も表示されませんでした。コンソールのプロパティーを見ると「現在のコードページ」っていうのがShift-JISになっている。これじゃ明らかに駄目っぽい。そこで「コンソール　UNICODE」でググると、それの対処法がたくさん出てきました。&lt;br /&gt;setlocale(LC_CTYPE, "japanese");&lt;br /&gt;という一行を、文字を出力する前に入れておけばよかっただけの事でした。もっと早く調べておけばよかった。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114303955935486601?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114303955935486601/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114303955935486601' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114303955935486601'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114303955935486601'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/unicode.html' title='コンソールはUNICODE非対応なの？'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114303810684219927</id><published>2006-03-22T23:14:00.000+09:00</published><updated>2006-03-23T01:30:12.533+09:00</updated><title type='text'>キャラクタのコンテナクラスの作成</title><content type='html'>STGのキャラクタは、自機の弾に当たって爆発・消滅する、画面外に出る、マップのスクロールにしたがって発生する、等の要因で生成と消滅を何度も繰り返す。キャラクタを格納しておくデータ構造は、要素の追加、削除が高速に行えるものでないと、STGの様なゲームでは問題になるだろう。その要求を満たすデータ構造といえば、STLのlistでもいいのだが、listはランダムアクセスが出来ないデータ構造である。配列のようにランダムアクセスが出来たほうがプログラムを組む上で、簡単になって良い。そんなことから、昔、弾幕系STGの弾を格納するのに都合が良いクラスを作成したことがある。&lt;br /&gt;　そんなわけで、昔使ったコードを引っ張り出してきて今回のSTGに追加してみた。多少手直しは必要だった。クラスの名前も意味が分からないものが付いていたので、ObjectPoolという名前に付け直した。このクラスは、ちょっと使用に注意が必要な部分があるが、生の配列を直接使うのとなんら変わらない速度が出るはずだ。&lt;br /&gt;　&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114303810684219927?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114303810684219927/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114303810684219927' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114303810684219927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114303810684219927'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_22.html' title='キャラクタのコンテナクラスの作成'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114294840263024501</id><published>2006-03-21T22:24:00.000+09:00</published><updated>2006-03-22T00:31:08.343+09:00</updated><title type='text'>スクリプトインタプリタの負荷について</title><content type='html'>１つのスプライト（敵キャラ等）に１つのスクリプトを割り当てるようにしたため、スプライトを最大で２５６個発生させる場合、スクリプトも２５６個並列に実行する必要がある。スクリプト実行はどの程度の負荷になるか想像が出来なかったので実際に実験してみた。とりあえず、２５６個のスクリプトを並列実行してみたところ、CPU負荷は１％～３％をうろうろしている感じであった。この２５６という数字は、怒首領蜂のスプライトリミットが２５６個らしいということに起因している。怒首領蜂がスプライト数２５６個で何とかなってるならば、たぶんそれぐらいのスプライトを動かせれば弾幕STGを作るうえで十分だろうという判断である。スクリプトの記述内容がかなり単純な事もあるが、実行速度は十分出ているようである。スクリプトの記述が複雑になった場合はどうなるかは分からない。&lt;br /&gt;　今はやっつけ仕事でスクリプトインタプリタを実装したため、無駄な部分も多い。スプライトオブジェクトとスクリプトオブジェクトは、それぞれどちらも内部にキャラクタの座標、速度、角度などのパラメタを持っている。そのパラメタはfloat型やint型で１７個ほどである。現状だと、スクリプトを実行した結果、変化したパラメタをスプライトに反映するために、毎回これらのパラメタをスクリプト側からスプライト側へコピーしている。これは無駄であるので、スクリプトとスプライトのパラメタは共通にしてコピーのオーバーヘッドを無くしたいと思う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114294840263024501?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114294840263024501/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114294840263024501' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114294840263024501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114294840263024501'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114294840263024501.html' title='スクリプトインタプリタの負荷について'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114293582281621521</id><published>2006-03-21T18:26:00.000+09:00</published><updated>2006-03-21T19:10:22.826+09:00</updated><title type='text'>スクリプトエンジンの改良３</title><content type='html'>さっきから、スクリプトコンパイラのソースコードの修正を試みていたんだが、昔のコードだし細かい所はまったく覚えていない上にコメントがほとんどなく、ポインタ使いまくり（再帰下降でパースしていく仕組みだから、まあそういうものかもしれないが）なので、修正はかなり難しそうである。コーディングの仕方自体も、ファイル内スコープとなるstaticで宣言した変数を使って、それをメンバ変数に見立ててカプセル化を行っていたりして、かなり怪しげな組み方である。C++でStringとSTLを使って組みなおしたい衝動に駆られるが、そんなことをしていたらいつになったらSTGが完成するかわかったもんじゃない。&lt;br /&gt;　スクリプトの言語仕様に一番加えなければならない機能は、組み込み関数の呼び出しだろう。スクリプト内で、関数を定義する必要はほとんど無いと思われるので、組み込み関数を呼び出せれば十分である。組み込み関数ってのは、言語処理系が最初から用意している関数の事である。BASICだとABSとかMID$とかPUT@とかあらかじめ関数が用意されている。こういうのは全部組み込み関数にあたる。C言語などと違って、古典的なBASIC言語は関数を自分で作ることは出来ないのが大きな違いだと思う。今回はBASICみたいに、関数定義が出来なくても、呼び出しが出来ればいい。&lt;br /&gt;　この場合、スクリプトコンパイラがやらなければならない仕事は、関数名と引数の数をチェックを行ってから、引数の数を最初にスタックに積んで、その後に引数をスタックに積んでいく、というようなコードを生成することになるだろう。めんどくせー。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114293582281621521?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114293582281621521/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114293582281621521' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114293582281621521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114293582281621521'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114293582281621521.html' title='スクリプトエンジンの改良３'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114291948702150682</id><published>2006-03-21T14:24:00.000+09:00</published><updated>2006-03-21T14:44:07.410+09:00</updated><title type='text'>スクリプトエンジンの改良２</title><content type='html'>下で、「拡張子を除き、スクリプトのファイル名と同じファイル名の画像をロードする」という仕様にする、ということ書いたが、ちょっと考えてみるとそれには問題が多いことに気が付く。Direct３Dのテクスチャは、横と縦のサイズが２５６テクセルの正方形の場合に最良のパフォーマンスが出るように最適化してあるらしい（DirectX９のSDKドキュメントにそのような記述がある）。STGの普通のザコ敵キャラは大体３２×３２ドット程度のサイズで用意するのが普通だと思う。テクスチャのサイズが２５６×２５６ならば、その中に３２×３２ドットのキャラクタは６４個入るわけだ。つまり、１つのテクスチャファイルに複数のキャラクタ画像を入れた方が効率が良い。そうすると、１つのテクスチャファイルを複数のスクリプトから参照して使う必要が出てくる。しかし、前述の「拡張子を除き、スクリプトのファイル名と同じファイル名の画像をロードする」という仕様の場合、スクリプトとテクスチャが１対１で対応する関係しか指定できないので、問題になるわけだ。さてどうすっかなあ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114291948702150682?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114291948702150682/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114291948702150682' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114291948702150682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114291948702150682'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114291948702150682.html' title='スクリプトエンジンの改良２'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114291823423454534</id><published>2006-03-21T13:38:00.000+09:00</published><updated>2006-03-21T14:20:30.296+09:00</updated><title type='text'>スクリプトエンジンの改良</title><content type='html'>最終的には、スクリプト（とマップエディタ）だけをいじれば、ゲームの進行は全て制御できるようにしたい。しかし、現状ではスクリプトの機能が不足していて、C++側で書かなければならない部分が多い。１つの種類の敵キャラクタに対して、１つのファイルのスクリプトを割り当てて記述するようにしたいので、テクスチャの指定などもスクリプト側で行うようにしたい。しかし、今のスクリプトは文字列が扱えない（文字列を扱う型が無い）ので、テクスチャのファイルを指定することができない。確か、lexerとparserは文字列リテラルをちゃんと識別するように作ってあったはずだが、semantec analysysの段階では変数の型というものをdouble型しか用意してなかったものだから、文字列などは捨てる設計になってしまっていた記憶がある。これを改良するには、３年前に作ったコードの深い部分を改変することになるので、ちょっと大変そうだ。&lt;br /&gt;　スクリプトコンパイラはたぶんバグも結構抱えている古いコードなのであんまり弄くり回す気にはなれない。仕方ないので、テクスチャファイルの指定は、「拡張子を除き、スクリプトのファイル名と同じファイル名の画像をロードする」という仕様にするかもしれない。たとえば、スクリプトをコンパイルして出来上がったバイナリが、"enemy1.bin"という名前だった場合、自動的に"enemy1.png"というファイルをテクスチャとしてロードするようにするわけだ。これなら、スクリプトコンパイラには手をつけずに目的を達成できるはず。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114291823423454534?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114291823423454534/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114291823423454534' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114291823423454534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114291823423454534'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_114291823423454534.html' title='スクリプトエンジンの改良'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114286884756757251</id><published>2006-03-21T00:18:00.000+09:00</published><updated>2006-03-21T00:34:07.580+09:00</updated><title type='text'>スクリプトエンジン組み込み</title><content type='html'>とりあえず、スクリプトコンパイラは出来ているものをそのまま使うことにして、スクリプトインタプリタだけをSTG用にアレンジして組み込んでみました。スクリプトの言語仕様は、かなりC言語に似せてあるのでスクリプトを使わずに組む場合とあんまり効率が変わって無いような気がしますが、とりあえず言語仕様をチューンするのは置いておいて、まずは動かすことを優先することにしました。&lt;br /&gt;　元となったスクリプトインタプリタのコードは、3年ぐらい前に組んだもので、Pure ANSI Cになるように意識して組んだ記憶があります。つまり、C++の機能を使わずに組んであるということであります。なんでこんなことをしたかと言うと、最終的には作成したコンパイラで、そのコンパイラをコンパイルしてやろうと考えていたからであります（コンパイラに自分自身をコンパイルさせるって事です）。&lt;br /&gt;　と言うわけで、C++の機能を使わずに素朴に組んであったスクリプトインタプリタのコードを、今回は現代風にC++でOOP風に書き換えました。これによって、スクリプトインタプリタオブジェクトのインスタンスを必要な数だけ作ってやれば、複数のスクリプトを同時実行できるようになりました。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114286884756757251?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114286884756757251/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114286884756757251' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286884756757251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286884756757251'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post_21.html' title='スクリプトエンジン組み込み'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114286418162750602</id><published>2006-03-20T23:10:00.000+09:00</published><updated>2006-03-20T23:16:21.626+09:00</updated><title type='text'>Releaseビルドのバイナリが落ちる件について</title><content type='html'>一旦、VC++のプロジェクトファイルを削除して、もう一回プロジェクトを新規作成してから、コンパイルとリンクのオプションを慎重に設定し直しました。そうしたら、Releaseビルドのバイナリを実行しても落ちなくなりました。今までのは何だったんだろう・・・&lt;br /&gt;　ついでに、インクルードファイルやライブラリのディレクトリの設定を、NPK氏の環境に合わせて設定しておいた。これで、ソースコード一式を送りつけても、簡単にビルドしなおせるようになると思う。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114286418162750602?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114286418162750602/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114286418162750602' title='2 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286418162750602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286418162750602'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/release.html' title='Releaseビルドのバイナリが落ちる件について'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114286347969386185</id><published>2006-03-20T22:46:00.000+09:00</published><updated>2006-03-20T23:04:39.703+09:00</updated><title type='text'>スクリプトエンジン作成</title><content type='html'>ゲームの敵キャラクタの動き（敵のアルゴリズム）等は、実際にゲームを動かしながら、試行錯誤で調整していく必要があります。試行錯誤が必要となる部分は、ゲーム本体のコードとは別にしたほうが、開発効率の面で有利になるはずです。パラメータをちょっと変えるたびに、メインのC++コードを毎回コンパイルし直すのは大変です。&lt;br /&gt;　今回、開発するSTGでは、敵などのアルゴリズムを記述するために専用のスクリプト言語を用意します。スクリプト言語を記述することにより、C++コードをコンパイルし直すこと無く、ゲームの進行を変えることができます。また、STGに特化した言語仕様でスクリプトエンジンを作ることによって、敵アルゴリズムなどを記述する事については、C++よりも小回りが効いて組みやすくなることを狙っています。&lt;br /&gt;　しかし、スクリプト言語を１から作るのは結構大変です。今回は、3年ぐらい前に作ったまま放置してあった、スクリプトコンパイラやインタプリタなどを引っ張りだしてきて、STGに組み込んでみることにしました。さてうまくいくかな・・・&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114286347969386185?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114286347969386185/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114286347969386185' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286347969386185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114286347969386185'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog-post.html' title='スクリプトエンジン作成'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114278668435947697</id><published>2006-03-20T01:31:00.000+09:00</published><updated>2006-03-20T01:44:44.366+09:00</updated><title type='text'>SoundLib組み込み</title><content type='html'>私はSTGのプログラムの中でも、今はグラフィック周りのプログラムを担当しています。&lt;br /&gt; NPK氏が作成した、oggをデコードしつつDirectSoundで再生するライブラリ「SoundLib」と、私が作っていたプログラムを組み合わせました。私はASCII、NPK氏はUNICODEで開発していたので、どっちかにあわせないとコンパイルエラーがでまくります。今回は全部をUNICODEで統一することにしました。なんとか、今まで作っていた部分をUNICODE用に書き換え、SoundLibを組み込みました。しかし、Debugビルドで作成したバイナリを実行した場合、うまく動くのですが、Releaseビルドの場合は途中で落ちてしまう模様。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114278668435947697?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114278668435947697/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114278668435947697' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114278668435947697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114278668435947697'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/soundlib.html' title='SoundLib組み込み'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24337787.post-114276004790958526</id><published>2006-03-19T18:12:00.000+09:00</published><updated>2006-03-19T18:20:47.916+09:00</updated><title type='text'>このBlogについて</title><content type='html'>どうも、polygonizeです。&lt;br /&gt;&lt;br /&gt;　私は、サークル「Troubadour」で開発中のSTG、「Metal Breaker」のプログラム製作を担当しております。このBlogでは、そのプログラム製作の進捗状況を記録していこうと思います。Blogという形で、プログラム制作上で発生した問題点と改善策を明文化していくことで、サークルメンバーの間での情報共有が容易になればいいなと思います。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24337787-114276004790958526?l=polygonize.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://polygonize.blogspot.com/feeds/114276004790958526/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24337787&amp;postID=114276004790958526' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114276004790958526'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24337787/posts/default/114276004790958526'/><link rel='alternate' type='text/html' href='http://polygonize.blogspot.com/2006/03/blog.html' title='このBlogについて'/><author><name>POLY</name><uri>http://www.blogger.com/profile/17305432640118087649</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
