W95GDの次期バージョンと横スクロールシューティングと強力コンパイラを制作。2014/01/04 01:50

この一ヶ月、何をやっていたというと、W95GDの次期バージョンを作るために、横スクロールシューティングを1stage作ってた。

チップ以外、結構完成度が高く面白い。
再就職が決まったら公開する。
プログラムはフルスクラッチで組んで、チップも岩石と自機のバリアーとナビゲーターの女の子以外、全部自分で組んだ。
曲は昔作ったミクの奴とロドリゲスさんが作った曲。
フォースフィードバック、アナログジョイパッド対応の力作。

stageスクリプトはテキストエディターで書き換え可能。
チップと音楽と効果音はbmpとwavなんで、結構面白い。

合間に、W95GDの次期バージョンのフレームワークと簡単なコンパイラの制作と、強力コンパイラのBNFを書いている。

W95GDの次期バージョンのフレームワークは、LANで接続して協力プレイが出来て、3Dの物理演算やモーション付きのXファイルが動作したら、ソースコードを版権フリーで配布する。

特に、フォースフィードバックとLAN関係は、資料が少ないので、参考になると思う。

グラディウスもどきのゲーム作ったよ。2014/01/12 13:35

グラディウスもどきのゲーム作ったよ。

フォースフィードバック、アナログジョイパット対応。

感想聞かせてね。

http://www.ne.jp/asahi/kenji/pda/testn.lzh

適当にフォルダ掘って展開して、testn.exeでゲームが始まります。

testi.exeは、stage000.txtのコンパイラで、敵の出現などを管理しています。

stage000.txtを書き換えたときは
>testi.exe stage000.txt stage000.bin
で、コンパイル出来ます。

testj.exeは、testiのはき出したコードのVMですが、
まあ、必要ないでしょう。


フレームワークはまだ待ってね。

----------------------------------------------------
難しいんで、こっからは、熟練者用。
----------------------------------------------------
●カテゴリー
2D横シューティングゲーム

●ターゲット
windowsXP以降+DirectX9c

●遊び方
1280*720の画面の横スクロールシューティングです。
カーソルキー、又は[8][4][6][2]で自機を動かします。
[space]、又は[x]でショットを打ちます。
[left-ctrl]、[無変換]、[left-shift]、又は[z]を一回押すと、一定期間無敵です。再度使うには暫く待ってから使います。
自機の武装は[通常ショット][ミサイル][レーザー]で、青い玉を取ると変わっていきます。
青い玉は、単体で飛んでくる場合と、一部の砲台を壊すと出現します。
ボスを殺すとクリアーで、自機が死ぬと再度出現します。
アナログ/デジタルジョイパッドも対応しております。
アナログの場合、スティックを倒した量により、3段階のスピードで自機が動きます。
ジョイパッドはゲーム起動前に接続している一番最初の物だけが認識されます。その後は抜き差し自由です。
ジョイパッドのフォースフィードバックにも対応しており、振動対応で適切にインストールされていれば自機爆破時に振動します。

●制作時間
31日(設計2日、本体プログラム10日、マップの打ち込み3日、敵のアルゴリズム12日間、チップ1日、コンパイラ2日、コンパイラのテスト用プログラム1日)

●使用ツール
VisualStudio2008(C++)+DirectX9c(Direct3D+DirectSound+DirectInput) 本体(testn.exe)
VisualStudio6.0(C) コンパイラ(testi.exe)とテスト用プログラム(testj.exe)
SonarX1ProductionSuite+初音ミク 音楽(曲は以前自作した物を加工して使用)
SoundForge8.0+音辞典 効果音と音楽の加工
PhotoShopCS3 チップ(岩とキャラは友人に作ってもらいました)
testi.exe 今回作ったコンパイラ
testj.exe 今回作ったコンパイラのチェック用プログラム(VM)
Windows7ultimateX64+mifes+winfd+atok+自作ツール群 一般的に使った物
IntelCoreI7-3770+16GB+IntelSSD3台+ReakForce106s改+DualMoniter PC(cpu内蔵GPU使用)

●デバッグとゲームバランス
自分が主にやり、1日1回、友人に遊んでもらいました。
CF-R8(WindowsXPsp3+2GB)とメインPCとキーボードとアナログジョイパッドとデジタルパッドでデバッグしました。

●仕様
敵出現と音楽は別途コンパイラで制御します。
なぜ、別途コンパイラで制御するかというと、exeを書き直しすること無く、
スクリプターや企画者が制御出来るようにするためです。

●簡易型コンパイラ(testi.exe)及びゲームエンジン(testn.exe/testi.exe)
globalレジスタr0-r32
globalstring s0-s127(256文字まで)
即値-99999~-99999
小文字と大文字を同列に扱う
1行1命令
インデント可。
中間言語のbinファイルのサイズがは65535byteまで

●コンパイラの使用方法
>testi stage000.txt stage000.bin

●コマンドプロンプト用のVMの使用方法
>testj stage000.bin
実際にゲームに組み込む前に、これを使いチェックできます。

●ゲームエンジンの使用方法
>testn stage000.bin

●ステージ命令群(シューティングゲームの敵出現などを司る固有命令)
初期に、stage000.binと各種wavとbmpを読み込んでありますが、途中で変更可能です。FPSを落とさないためにこうしています。
以下のレジスタには、自動的に設定されます
r0に自機のx
r1に自機のy
r2に敵機の出現数
r3に敵機の撃破数
汎用命令群を使い、敵の出現頻度や強い敵を出現させ難易度を上げることが出来る
loadwav num,filename
音楽や効果音のwavfileのロード
playwav num
指定されたwavfileを鳴らす
music file
音楽。
scrollwait num/reg
スクロールのFPSに連結して、何フレーム、敵を出さないかの処理。
scrollspeed num/reg
背景のスクロールスピードを設定します。
enemy
敵の種類,編隊番号(-1なら単機),編隊の何番目か,出現x,出現y
addenemy num/reg
敵の出現数を足す
●汎用命令群(ADV/シューティングゲームなどの用汎用命令)
// シューティングゲーム等では、様々なレジスタに様々なデータが入ってくるので、オミットします。
//
// Global変数を使用可能にする
// reg レジスタ
// 例)reg r1
// (内部処理 CMD_REG,レジスタ番号,0)
Golbal文字列変数を使用可能にする
string ストリング番号
例)string s0
(内部処理 CMD_STRING,文字列,0)
メッセージ表示命令
mes メッセージ
例)mes メッセージ
選択肢
sel レジスタ,選択肢1[,選択肢2...]
例)sel r0,選択肢1,選択肢2
(内部処理 CMD_SEL,レジスタ番号,選択肢数,選択肢1,0[,選択肢,0])
無条件ジャンプ
goto ラベル
例)goto top
(内部処理 CMD_GOTO,ジャンプ先)
終了命令(シナリオの最後には自動的に終了します)
exit命令を記述するか、
シナリオの最後に、"end:"と記述し、if命令やgoto命令でendへジャンプさせる
例)goto end
end:
例)if r1=0 end
end:
例)exit
数式
r 単純計算代入式(四則演算)
例)r1=r10+5
例)r0=5*r10
(内部処理 CMD_CALC,レジスタか即値か,レジスタ番号か即値)
変数への代入
r 代入命令
例)r10=10
例)r10=r5
(内部処理 CMD_LET,レジスタか即値か,レジスタ番号か即値)
gotoやif命令でのジャンプ先
ラベル:
使える物は、英数字。先頭の文字は英文字とアンダースコア
例)top:
例)end:
例)_top25:
例)_10:
比較条件ジャンプ
if 単純比較式 ラベル
例)if r0==0 top
例)if r5!=10 end
例)if r1>=r3 end
例)if r5<=10 end
(内部処理 CMD_IF,ジャンプ先,レジスタか即値か,レジスタか即値,比較式番号,レジスタか即値か,レジスタ番号か即値)
コメント
// コメント
サブルーチンの呼び出し
gosub label
例)gosub sub0
サブルーチンから戻る
return
例)return
関数の呼び出し(値を返すサブルーチン)
r1=call label[,r0....]
例)r20=call getadd,r10,5
例)r20=call chkpara,r3,r4,r5
(内部処理 CMD_CALL,戻り値のレジスタ番号,呼び出し先,引数の数[,])
関数から戻る
return レジスタ/即値
例)retuern r5
例)return 7
(内部処理 CMD_RETCALL,戻り値がレジスタか即値か,レジスタか即値)
データの拾得
getdata reg,reg/num
マルチメディア命令
SETVOLUME
SE
VOICE
LOADWAV
PLAYWAV
FADEOUTWAV
WAITWAV
SETGRADATION
LOADBMP
SETBMPLAYERPOS
PUTBMP
FADEOUTBMP
WAITBMP
LOADBIN

●以下の命令を盛り込む予定
makelocalreg
関数内でローカルレジスタ領域を造る
localreg
関数内でlocal変数を使用可能にする
setreg
関数内で呼ばれた先に値を返すレジスタの指定(return 命令では1つしか返せないので)
getreg
関数を呼び出した側が値を取り出すレジスタの指定

makelocalstring
関数でローカル文字列レジスタ領域を造る
localstring
関数内でローカル文字列レジスタを使用可能にする
setstring
関数内で呼ばれた先に値を返す文字列レジスタの指定
getstring
関数を呼び出した側が値を取り出す文字列レジスタの指定
●コンパイラの動作
全てのスクリプトを読み込みコンパイルをする
ラベルの解消はコンパイルの最後に刈り取る
ラベルはHASHではなく線形検索
1passコンパイラ

まあ、コンパイラってつくんの面倒だから、俺が作ったのUPする。2014/01/18 19:22

VMは、ソース公開。コンパイラはソース非開示。

basic+c+asmを足して3で割った感じ。

販売目的で使う場合は「KENJI」のクレジットを入れてね。

そのうち、3Dのメッシュ機能を盛り込んだWin版のVMのソース開示もするからね。

http://www.ne.jp/asahi/kenji/pda/testt.lzh
http://www.ne.jp/asahi/kenji/pda/testu.lzh

とりあえず、次期システム周りが完成。2014/01/26 20:19

とりあえず、次期システム周りが完成。

まだ、文字表示と選択肢は入れてないけど。

次はカーチェイスゲームを作るから、
これを元に作ろうと思う。