2023年07月06日
Laboratoryテーマ9「32方向弾」そのB
Laboratoryテーマ9「32方向弾」そのB、最終回です。
Laboratoryテーマ8「32枚を超えてSPRITEを表示させたい(非走査線割込)」が未公開なので、敵と自機はFONTで作成しました。
敵はそれを動かしています。
(自機の上を敵が通ると、自機消えちゃいますけど気にしない…。)
動作は、十字キーの↑で4方向弾、→で8方向弾、↓で16方向弾、←で32方向弾を敵が撃ちます。
全弾空いている時にしか撃てません。
ロジック的には前回書いた通り、データは16バイト分しか用意していません。(&HC078~&HC087)
処理速度的には32方向弾の時はさすがに重いかな?
これは弾道計算で遅いのではなく、キャラクタ処理で遅くなっているのでやむ無しです…。
BASIC部分のサンプルプログラムです。
「32SMPL.BAS」【ダウンロード】
スカスカですが、変数表です。
マシン語のサンプルです。
起動すると、32SMPL.BINを作成します。
「BINSET.BAS」【ダウンロード】
計算関係のサブルーチンは、すべて削除してあります。
弾のデータセットは、1,030行〜1,270行(&HC298~&HC317)までの128バイトです。
まぁまぁ短くできたかなと思います。
では、今度こそ本当に、ここで一旦Laboratoryは中断して3DダンジョンRPGの制作に専念します。(2023年6月26日記事参照「開発案件広げすぎ…」)
2023年07月05日
Laboratoryテーマ9「32方向弾」そのA
さて、Laboratoryテーマ9「32方向弾」そのAです。
現在サンプルプログラム準備中です。
そこで今回は、データベース作成時のデータ順を説明します。
32方向弾のデータベースですが、データ配列を工夫することで、そのデータベースのまま16方向弾、8方向弾でも流用できます。
因みに16方向弾と8方向弾のデータ表です。
お気付きかと思いますが、8方向弾のデータは16方向弾のデータに完全に含まれています。
当然、16方向弾のデータは32方向弾のデータに含まれます。
という事は、弾にデータをセットする順番は決まっていないので、データベースを8方向弾、16方向弾、32方向弾の順に登録してやればいいのです。
実際のデータベース登録順です。
8方向弾の場合は先頭から2弾分、16方向弾の場合は4弾分を読み込み、4エリア分セットすれば良いという事です。
次回サンプルを用意します。
今回の実践もかねて、十字キーの↑で4方向弾、→で8方向弾、↓で16方向弾、←で32方向弾を撃てるサンプルにしますね。
2023年07月04日
作品I流行りもの
次はこれ。
当時流行っていた「テトリス」を作ってみました。
こちらも友人の依頼で懐かしいゲームを真似て作りました。
実は巷で流行っていたのですが、私は全く存在を知らずこのゲームも依頼者から「こんな風に動く」と聞きながら作りました。
ですので、細かな動作はオリジナルと異なります。(ブロックの速度が上がった時の横移動など)
ライセンサーはどこなんだろう?
「ザ・テトリス・カンパニー」で、良いのかな?
(もし違っていたらご指摘ください。)
当時流行っていた「テトリス」を作ってみました。
■主な新テクニック
・特になし
・特になし
こちらも友人の依頼で懐かしいゲームを真似て作りました。
実は巷で流行っていたのですが、私は全く存在を知らずこのゲームも依頼者から「こんな風に動く」と聞きながら作りました。
ですので、細かな動作はオリジナルと異なります。(ブロックの速度が上がった時の横移動など)
ライセンサーはどこなんだろう?
「ザ・テトリス・カンパニー」で、良いのかな?
(もし違っていたらご指摘ください。)
タイトル | 『 テトリス 』 | 作品 | 10 | |
内容 | 上から落下するブロックを横移動・回転させて上手く積み、横一列ブロックで埋まったらその列は消えます。次のブロックが落下できなくなったらゲームオーバーです。 | |||
操作方法 | 起動し、しばらくしてタイトルが表示されたら、Aボタンでゲーム開始 十字キーの「←」、「→」で、ブロックを左右に移動 Aボタンで、ブロック落下 Bボタンで、ブロック回転 | |||
対応機種 | MSX1、MSX2、MSX2+ | 製作年 | 1988年 | |
ダウンロード | リンク先へ | ジャンル | パズル | |
ライセンス | テトリスはザ・テトリス・カンパニーの登録商標です。 |
※ゲーム内のキャラクタ、音楽は制作当時の物です。 公開前提に製作していないため、雑誌等から流用している物もあるかも知れませんので、著作権侵害の恐れのあるものは、ご連絡をお願いします。 |
2023年07月03日
Laboratoryテーマ9「32方向弾」その@
さて、今回はLaboratoryテーマ9「32方向弾」です。
「あれ? 3DダンジョンRPGが終わった後じゃなかったっけ?」と思われた方、正解。
実は私のMSX仲間(プログラマーに非ず)から久しぶりに連絡があって、「先日の16方向弾の動画面白かった! 32方向弾やって!」と、要請されました。
思わぬYouTube効果に驚き。
というか、貴方プログラミングしないでしょう?
経緯を説明し、「3DダンジョンRPGが終わってからね。」と説明するも、「誰も見てないブログだろ?」と言われ、ショックのあまり了承してしまいました…。
まぁ確かに、反応があった方を優先したいですが…。
一応、「32方向弾は自機・敵含めSPRITE同時表示32枚以上だから、せめてLaboratoryテーマ8「32枚を超えてSPRITEを表示させたい(非走査線割込)」の後で。」と抵抗はしましたが、「誰も見てないブログだろ?」とダメ出しされ、観念しました…。
余りにも唐突だったので、サンプルプログラム何も手を付けていないので、今回は考え方のみ。
そう、前回書いた「なんちゃって弾道計算」です。(2023年6月7日記事参照「しまった」)
いくらマシン語とは言え、32回も同時に三角関数を使った弾道計算するとなると、さすがに重くなります。(やった事ないから真偽不明ですが…。)
Laboratoryテーマ6「自機に向かって飛んでくる敵弾」は、自機と敵の位置が常に不定の為、計算して算出するしかないのですが、32方向弾は飛んでいく方向と速度は決まってるんです。
という事は、事前に移動量と方向をデータベース化しておけば、わざわざ時間のかかる計算をしなくてもいいのです!
因みに、32方向弾は一弾当たりの角度が、360°÷32方向=11.25°となります。
角度に対応した長さを事前に三角関数で計算しておきます。
データ容量は、32方向のX・Y移動量なので、32方向×2(X・Y)=64byteで済みます。
ここで、察しの良い方は気付かれたと思いますが、符号の変化と、X・Y移動量が逆転しているだけで90°ずつ同じ値なのです。
この符号は、Laboratoryテーマ6「自機に向かって飛んでくる敵弾」の時の4つにエリア分けした符号と同じです。
それらを利用して実際に用意するデータは64byte÷4エリア=16byte分用意し、32弾÷4エリア=8弾毎に値とエリアをセットしてやれば良いのです。
と、言う訳で「なんちゃって弾道計算」は、データベースを読んで弾のX・Y移動量と、エリアをセットするロジックとなります。
弾道計算と言いながら、計算すらしないロジックです。
それでも、これだと非常に早いし、ロジックも簡単です。
次回サンプルを用意します。
2023年07月02日
細かく修正F
「Laboratory」の全記事に、初回テーマメニュー記事へのリンク追加。
これですぐ、メニューに戻れます。
あと、マシン語サンプルのプログラム画像に、サブルーチン化して組み込む際に変更しないといけないアドレス部分を解り易くしました。
それと、サブルーチンコールする際に必要なレジスタと値、返されるレジスタと値を、解り易い様表にしました。
あと、「動画があった方が速さが判っていいかな?」と思った、
・Laboratoryテーマ6「自機に向かって飛んでくる敵弾 そのA」のBASICサンプル
・MAP8 EDITOR 活用方法のサンプル
に動画を追加しました。
「ダウンロード」に「サンプル」メニュー追加、主にLaboratoryで公開したサンプルプログラムの掲載記事へのリンク追加
あと前回同様、「ダウンロード」に追加で新規公開したゲームやツールの記事へのリンク追加、「Laboratory」初回テーマメニューの公開分記事へのリンク追加。
それ以外は、画像の貼り直しや、記事の誤記の修正程度です。
2023年07月01日
YouTubeチャンネル開設!
(笑)
今更ながらYouTubeチャンネル開設しました。
この歳になって初です。
開設は「こんな簡単でいいの!?」ってくらい、思っていた以上に簡単でした。
なぜ今YouTubeチャンネル開設したのかと言うと、サンプルやゲームがどんな動きをするのか?を見たくても、現状だとわざわざディスクイメージをダウンロードして、WebMSX等で起動してみないと分かりませんよね?
考えてみれば結構ハードル高いな…と。
そう言う訳で、すぐに動画で動きを見られるようにYouTubeを活用していきます!
まずは、Laboratoryテーマ6「自機に向かって飛んでくる敵弾」で実践。
敵が自機に向かって弾を16発撃つ様子をアップします。
やっぱり動画があるとイメージ湧きやすいですよね。
動画で興味を持ってもらい、そこからダウンロードしてもらう方が良いですよね。
ついでに16方向弾もアップ!
過去のゲーム公開記事も、時間のある時に徐々に動画にしていきたいと思います。
2023年06月30日
Laboratoryテーマ6「自機に向かって飛んでくる敵弾」そのB
Laboratoryテーマ6「自機に向かって飛んでくる敵弾」そのB、最終回です。
前回は、BASICで組んだサンプルを公開しました。
今回はBASICで組んだサンプルを基に、マシン語に組み直しました。
考え方とロジックはそのまま、マシン語化しただけです。
ただ、まったくBASICと同じだとあまり面白くないので、SPRITEとFONTを設定し、キャラクタを8×8ドットを16×16ドットに変更。
さらに、敵が弾を16発撃つようにしました。
さすがマシン語、これだけ弾出しても速度的には余裕ですね。(これでもまだウェイト負荷掛けてあります。)
BASIC部分のサンプルプログラムです。
「STSMPL.BAS」【ダウンロード】
変数表です。
昔は手書きでしたが、便利な世の中になったものです…。
因みに昔製作途中で終わった、「SPACE WARS」と言うシューティングゲームのSPRITEを流用しています。
ロジックも、そちらから必要な部分だけ抜き取り加工しています。
マシン語のサンプルです。
起動すると、STSMPL.BINを作成します。
「BINSET.BAS」【ダウンロード】
「マシン語の割り算」の8ビットで計算しきれず、「マシン語の割り算(16ビット版)」に変更した時に、処理速度が遅くなると書きましたが、これだけ弾出してても、特に処理速度的な問題はなさそうです。
今回の主な用途はシューティングゲーム等の弾道計算用なので、弾幕シューティングでもない限り弾道計算がそこまで頻発することもないので、大して問題にならないと思います。
(MSXではSPRITEの制限(横4個(MSX2は8個)以上でチラつく、同時表示32個まで(走査線割込み使えば対応可ですが))の為、弾幕シューティング自体を私は見たことがない…。)
因みに、ここまでできれば、4方向弾、8方向弾、16方向弾はすぐできます。
簡単なのでちょっと撃ってみた。
では、前回記事で書いた通り、ここで一旦Laboratoryは中断して3DダンジョンRPGの制作に専念します。(2023年6月26日記事参照「開発案件広げすぎ…」)
再開後は、Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」です。
MSXのSPRITEの弱点に、同一水平ライン上に4枚(MSX2は8枚)以上並ぶと、それ以上のSPRITEが表示されなくなると言った仕様があります。
その対処方法として、市販ゲームではキャラクタをチラつかせて、完全に見えなくなるのを防いでいます。
このテーマは、そのやり方です。
2023年06月29日
Laboratoryテーマ5「16ビットアドレス値の10進数表示」
さて、今回はLaboratoryテーマ5「16ビットアドレス値の10進数表示」です。
16ビットアドレス(HLレジスタ)の16進数値を10進数値に変換して、指定の座標に5桁表示するサブルーチンです。
5桁表示の後ろに「00」を表示し、7桁にしてスコア表示していました。
色々なロジックがあると思いますが、私のやり方は単純に10,000の桁から10,000を引いて、引けた数をカウント、次に1,000の桁…とする単純なロジックです。
最大ループ数は10,000の桁=6、1,000の桁=9、100の桁=9、10の桁=9の計33回となります。
他にも、HRAさん紹介の2分法ロジックもありますが(最大値の半分ずつ引いていくロジック(10,000の桁なら6が最大の為、半分の30,000を引く))、プログラムが長くなるので私はこちらを使っていました。
それに、毎回最大ループする訳はないし、例えば表示する値が11,111の場合、断然こちらのロジックの方が早いです。
まぁ、一長一短ですね。
16進数を10進数に変換し、尚且つ指定座標に5桁表示するのサンプルプログラムです。
「10PTSMPL.BAS」【ダウンロード】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、10PRINT.BINを作成します。
数字表示用に5個8ビット変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HBF90:2ヵ所)
IN | OUT | ||
HL | 表示する値 | なし | |
B | 表示するX座標(0〜31) | ||
C | 表示するY座標(0〜23) |
「10PRINT.BAS」【ダウンロード】
マシン語のサブルーチンとして必要なのは&HBF00~&HBF77までです。
&HBF80~&HBF8Fは表示元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ6「自機に向かって飛んでくる敵弾」そのBです。
2023年06月28日
Laboratoryテーマ11「マシン語の割り算(16ビット版)」
さて、今回はLaboratoryテーマ11「マシン語の割り算(16ビット版)」です。
前回の「マシン語の割り算」では、割られる数が8ビット(0〜255)でした。(2023年6月22日記事参照「Laboratoryテーマ3「マシン語の割り算」」)
ただ、それでは大きい値の計算が出来ないので急遽Laboratoryテーマ11として、「マシン語の割り算(16ビット版)」をテーマに新規追加しました。(2023年6月27日記事参照「しまった」)
考え方は8ビット版と同じで、「8回ループ」を「16回ループ」に変更しただけです。
それに伴い、ビットシフト(ローテイト)が1回(8bit)で良かったところ、すべて2回(16bit)になったのでロジック長くなっています。
16ビット割り算のサンプルプログラムです。
「WARISMPL.BAS」【ダウンロード】
マシン語での計算結果と、検算用にBASICで単純計算した結果を列記します。
マシン語のサンプルです。
起動すると、WARIZAN.BINを作成します。
16ビットへのロジック変更の際、レジスタペア数が足りなかったので、2個16ビット変数を利用しているので、サブルーチンとしてアドレス変更する際は、そこの変更を忘れないように気を付けてください。(&HBF4C:3ヵ所、&HBF4E:3ヵ所)
変数使わない手もありますが、煩雑になるので楽で解り易い方法を選択しました。
IN | OUT | |||
HL | 割られる数 | BC | 商 | |
B | 割る数 | HL | 余り |
「WARIZAN.BAS」【ダウンロード】
マシン語のサブルーチンとして必要なのは&HBF00~&HBF37までです。
&HBF38~&HBF4Fは計算元値を代入してサブルーチンコールします。
では、次回はLaboratoryテーマ5「16ビットアドレス値の10進数表示」です。
2023年06月27日
しまった
Laboratoryテーマ6「自機に向かって飛んでくる敵弾」のマシン語サンプル作ってて思い出しました…。
「三平方の定理」使って弾道計算するなら、「割り算で計算結果が小数点にならないように、16ビット演算しなきゃいけない」のをすっかり忘れてました…。
なぜ16ビット計算が必要なのかを、「テーマ6「自機に向かって飛んでくる敵弾」その@」での数字を使って説明します。(2023年6月12日記事参照「テーマ6「自機に向かって飛んでくる敵弾」その@)
1移動当りの弾移動量を計算します。
Y方向 = 72(a)÷ 120(c)= 0.6
X方向 = 96(b)÷ 120(c)= 0.8
Y方向 = 72(a)÷ 120(c)= 0.6
X方向 = 96(b)÷ 120(c)= 0.8
記事内のこの部分、これです。
マシン語は小数点を扱えませんので、小数点にならないよう事前に割られる数に「×100」若しくは「×10」しておく必要があります。
そのためには、8ビットだと0〜255までの値しか使用できないため、16ビットにする必要があるのです。
Y方向 = 7,200(a×100)÷ 120(c)= 60
X方向 = 9,600(b×100)÷ 120(c)= 80
X方向 = 9,600(b×100)÷ 120(c)= 80
「テーマ6「自機に向かって飛んでくる敵弾」そのA」のサンプルBASICプログラムでは何も考えずに普通に×100を組み込んでいました…。(2023年6月14日記事参照「テーマ6「自機に向かって飛んでくる敵弾」そのA)
MSXプログラミングから離れて久しいので、8ビットの制約を忘れてました。
Windowsプログラミングだと、特に気にする必要ありませんからね…。
なんたって、マシン語で掛け算、割り算ができるし、マシン語使わなくても処理が早いので、ラジアン計算、三角関数(Sin、Cos、Tan)が普通言語で使えますからね…。
後日、16ビットの割り算サブルーチンLaboratryで公開します。
それと、実は私は自作シューティングゲームの弾道計算にこのロジックを使っていません。(おい。)
Laboratoryテーマ9「32方向弾」の時に説明すると思いますが、処理速度と簡易性を重視した「なんちゃって弾道計算」ロジックを使っていました。
「なんちゃって」ですので、あまり人にお勧めできるものではないというのが正直なところですが。