2024年05月03日
「BlueMSX」の不思議
以前に、突然「BlueMSX」の音が出なくなったと報告しました。(2024年4月11日記事参照「「BlueMSX」で音が出なくなった!?」)
未だ解決に至っておりません。
音関係だけ別途ノートパソコンを使い制作を続けました。
「WebMSX」や、ノートパソコン側で動作させた「BlueMSX」で同じイメージディスで正常動作すると言う事は、メインパソコンの「BlueMSX」だけがおかしいと、言う事でしょう。
一度ダメ元で、元の「BlueMSX」の実行ファイル「blueMSX.exe」の名前を変えて「blueMSX2.exe」とし、ノートパソコン側の「blueMSX.exe」をコピーして起動してみました。
やっぱり駄目でした。
…と、ここで奇跡が…。
半ば自棄で名前を変えた「blueMSX2.exe」を起動してみたら音が出ました。
えぇっ! 治った!?
と思い、コピーした「blueMSX.exe」を削除し、名前を変えた「blueMSX2.exe」の名前を元に戻し(「blueMSX.exe」)て起動したら、また鳴らなくなりました。
再度、名前を変更し(「blueMSX2.exe」)起動したらやっぱり鳴ります。
フォルダ移動とかはしていません。
んん?
「blueMSX.exe」の名前がWindowsで何かと紐付けられておかしくなってるのかな?
取り合えず根本解決には時間が掛かりそうなので、名前を変更した状態(「blueMSX2.exe」)でも開発に支障なさそうなのでこのままいきます。
もしどなたか、仮説でもわかる方ご教授ください。
2024年05月02日
細かく修正㉑
今回は久しぶりの修正ですのでてんこ盛りです。
「ダウンロード」の「新作」に、新規公開した「ハンド君の迷宮大冒険」記事へのリンク追加。
「ダウンロード」の「ツール」に、新規公開した「MMLコンパイラ(通常版)Ver.1.1」記事へのリンク追加。
「ダウンロード」の「サンプル」に、下記のサンプルを追加。
・「MMLコンパイラ(通常版)活用方法」
・「32枚を超えてSPRITEを表示させたい(非走査線割込)」
・「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」
・「マシン語でフロッピーディスクを制御したい」
「Laboratory」テーマメニューの公開分記事へのリンク追加。
・Laboratoryテーマ8「32枚を超えてSPRITEを表示させたい(非走査線割込)」
・Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい その@」
・Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい そのA」
・Laboratoryテーマ7「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい そのB」
・Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい その@」
・Laboratoryテーマ28「マシン語でフロッピーディスクを制御したい そのA」
「技術資料」カテゴリに、下記資料記事を追加。
・「FCBを利用したフロッピーディスク制御方法」
・「SPRITE基礎知識」
・「MMLテンポずれ」
・「マシン語の小数点」
「ゲーム制作」の「MMLコンパイラ(通常版)」の前後回へのリンクが全て切れていたので修正。
「ゲーム制作」の「面クリア型アクションゲーム」の前後回へのリンクが全て切れていたので修正。
それ以外は、画像の貼り直しや、記事の誤記の修正程度です。
2024年05月01日
【ゲーム制作】面クリア型アクションゲーム あとがき
面クリア型アクションゲーム あとがきです。
昔懐かし「面クリア型アクションゲーム」でした。
プレイしていると、なんだかとてもノスタルジックな気分になります。
開発は特に詰まるところもなく、一気に公開まで行きました。
(おかげで前後回へのリンク修正する暇なし。)
ゲーム画面は、自分的に「MSX1にしては頑張った!」です。
今作では久しぶりにMSX1の特徴であるSPRITEを活用しています。
そこへ「Laboratory」のテーマ「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」や、「BGM演奏ルーチン(通常版)」など、ふんだんに盛り込みました。
こだわったところは、やはり演出と、ゲームバランス。
市販ゲームみたいにしようと思うと、敵の消滅や復活、「ハンド君」の消滅など、見た目にも解り易いアニメーションが必要かなと思い、色々取り入れています。
もっと市販っぽくしようと思えば、絶対に勝てない敵とか、地形ギミックなど(一度通ったらなくなる橋、グーの時しか通れない通路など)追加すると、バラエティに富んでより市販っぽくなりますよね。
ゲームバランスについては何とも言えませんが、私で10面以降クリアが難しいレベルに仕上がっています。
積極的に敵を倒していかないと挟まれたり、袋小路に追い込まれたりと、まずクリアは不可能です。
さて、今作製作開始から1カ月で完成しました。
多分この手のゲームはアイデア考える時間が一番大変かと思います。
ほぼ、新しいシステムは出尽くしていると思うので…。
次回作については、また、少し休憩してから考えたいと思います。
多分この流れだと「パズルゲーム」かな?
パズルゲームもアクション同様、新しいシステムは出尽くしてるのでアイデアが大変そうです。
無難に「倉庫番」もどきでもやろうかな…。
2024年04月30日
【ゲーム制作】面クリア型アクションゲーム 公開
「ゲーム制作」カテゴリで制作していた面クリア型アクションゲームが完成しました!
結構良いレベルに仕上がったかと思います。
▲タイトル画面
■主な新テクニック
・水平ライン5枚を超えた擬似SPRITE表示
・上記を利用したキャラクタ初期位置表示
・SPRITE3枚重ねのキャラクタ
・豊富なアニメーション処理
・水平ライン5枚を超えた擬似SPRITE表示
・上記を利用したキャラクタ初期位置表示
・SPRITE3枚重ねのキャラクタ
・豊富なアニメーション処理
久しぶりにジョイスティックで自機移動するゲームを作成しました。
壁処理など、意外と忘れてるもんですね。
▲ゲーム画面
▲ストーリー画面
タイトル | 『ハンド君の迷宮大冒険 』 | 新作 | 3 | |
ストーリー | あなたは「じゃんけん国」の冒険家「ハンド君」。 「じゃんけん国」ではじゃんけんに勝った者が強者であった。 とある迷宮でお宝を発見した「ハンド君」、夢中でお宝を集めている最中、盗掘犯と鉢合わせ。 邪魔をする盗掘犯達をじゃんけんで勝って怯ませながら迷宮内に落ちているお宝をすべて集めろ! | |||
操作方法 | ■タイトル画面 タイトルで、「スペース」バー若しくはAボタンでゲーム開始 以降、開始したコントローラーでのみ操作可能です しばらく放置すると、タイトル画面とストーリー画面が切り替わります ■ゲーム操作 「↑」「→」「↓」「←」で右下の白い「ハンド君」を操作し、迷宮内のお宝「イエロージュエル」を集めてください 全てのお宝を集めると、次の部屋に進みます 全部で14部屋あります 邪魔をする盗掘犯達は、じゃんけんで勝てば撃退する事が出来ます 勝つと「ハンド君」の手が「グー」→「チョキ」→「パー」→「グー」…と、切り替わっていきます 撃退された盗掘犯はしばらくすると復活します 勝った後、「ハンド君」が黄色く点滅している間に連続して盗掘犯達を倒すとスコアが倍増します(1匹目1,000点、2匹目2,000点、3匹目4,000点) 水晶1個100点、面クリアボーナス10,000点 50,000点で「ハンド君」が1匹増えます | |||
対応機種 | MSX1、MSX2、MSX2+ | 製作年 | 2024年 | |
ダウンロード | リンク先へ | ジャンル | アクションゲーム |
※ゲーム内のキャラクタ、音楽は制作当時の物です。 公開前提に製作していないため、雑誌等から流用している物もあるかも知れませんので、著作権侵害の恐れのあるものは、ご連絡をお願いします。 |
2024年04月29日
【ゲーム制作】面クリア型アクションゲーム 第29回
面クリア型アクションゲーム 第29回
前回の続きです。
ここまでくると、ほぼお手上げ状態です。
可能性は低いと思いながらも、OTIR命令ではなく、OUT命令をループさせ、その都度NOPで時間稼ぎをちゃんとすれば直るのでは?
と、仮説を立てロジック変更。
…直らない。
次に、メインロジックで&H004Dコールをやめて、メインロジックでは書き込み先のアドレスとフラグだけ立てておいて、フラグが立っていれば割込み処理の中で&H004Dコールする方法を試してみました。
うーん、抜けは無くなりましたが、おかしな数字が画面上に表示されます。
あぁ、&H004Dはドット消しだけでなく、スコア表示にも使っていました。
…と、言う事は、メインロジック内の&H004Dを全て割込み処理にもっていけば問題ないのでは?
しかしこれは今からの修正が大変…。
止む無し…。
かっこ悪いのでやりたくなかったのですが、前回のドットを消した隣に別のキャラを描く処理で、かなりの回数テストしましたが、両方が同時に描かれない事はなかったので、ドット消しの&H004Dを2回コールする事にします。
抜けなくなりました。
うーん、かっこ悪いなぁ…。
でもまぁ、実用的と言えば実用的か…。
これ以上バグ取りに時間取りすぎても仕方ないので、今回はもうこれで行きます。
次回作る事があれば、VRAM操作を全て割込み処理内にもっていく方法を取りたいと思います。
次回公開します。
2024年04月28日
【ゲーム制作】面クリア型アクションゲーム 第28回
面クリア型アクションゲーム 第28回
ドット抜けバグが、どうしても直らない…。
稀なんですが、毎回発生する場所も違うし、タイミングもバラバラで規則性がない…。
走査線割込みでSPRITE5枚以上の表示処理をしているので、それの影響であることは容易に推測出来ました。
ただ、まぁそれでもドット消しロジックのバグの可能性もあるので、そちらも調査。
ドットを消した場所とその隣に別のキャラを表示するように修正。
稀にですが、予想通りどちらかが抜けます。
と言う事は、ドット消しロジックがおかしいわけではないと結論。
(ドット消しロジックがおかしいのなら、両方共表示されない。)
次に、OTIR命令で転送が終わるまでに次のVRAM操作が入るのかな?と考えましたが、割込み処理ロジックでは、SPRITEシャッフル処理の後、BGM演奏ルーチンを実行しているので、転送処理時間が足りていない事はないと言い切れます。(32枚×4バイト=128バイト分の転送待ち時間)
しかし、ひょっとしたらの可能性が捨て切れないので、シャッフル処理とBGM演奏ルーチンの間に大量NOPを追加してみました。
…やっぱり直らない…。
何処かのサイトで、割込み処理内でVRAM操作すると画面がおかしくなる。とありました。
うーん、正しくこの状態なのかな?
そこでシャッフル処理だけ割込み処理から外してメインロジックに組み込んでみました。
遅い…。
「ハンド君」、敵、衝突判定、シャッフル処理のタイミングループ時間を調整。
うーん、ドット抜けは無くなりましたが、割込み処理でのSPRITE表示を見越して作成した、キャラクタ初期位置表示や、「ハンド君」消滅アニメーションが、おかしくなりました。
この方法を採用するなら、そのあたりのロジックを修正する必要があります。
この方法はどうしても直らなかった時ですね…。
とりあえず元に戻します。
となると、次に原因の要因となるのはドット消し時の&H004D。
そこで、&H004Dのコールを、DIとEIで囲い、VRAM操作中に割込みが掛からないようにしてみました。
…直らない…。
うーん、調べものと思考錯誤で時間が経ってしまいました。
今回は解決に至らず…。
次回も引き続きバグ取りです。
2024年04月27日
【ゲーム制作】面クリア型アクションゲーム 第27回
2024年04月26日
【ゲーム制作】面クリア型アクションゲーム 第26回
面クリア型アクションゲーム 第26回です。
今回は「デバッグ」します。
結構致命的なバグがいくつか発見されました。
逆に細かいバグは無し…。
まず真っ先に気付いたバグは、2面目以降、マップはちゃんと表示されているのに、実質は1面の壁通路となってしまっていました。
原因は簡単、マップチェックロジックにマップ先頭アドレスを足し忘れていました。
これにより、マップチェックはすべて1面のマップでチェックされていました。
修正はマップ先頭アドレスを足すだけです。
次に8面以降面表示が1キャラ上に上がった状態で表示される。
1キャラ16×16という事を忘れて、横幅32キャラ(本当は16キャラ)に設定していたため、2面ずつ進み、面データのない8面(2面ずつ進むので16面)が1面の1キャラ上に上がった表示となった。
修正前
修正後
次にマップの外枠へ敵が飛び出しました。
これは、単純に一番上の通路の上壁のマップチェックロジックにバグがありました。
修正前
修正後
次に袋小路で復活した敵が初期位置と上の壁の間でウロウロしている。
これは復活後の移動方向を設定していなかったためで、消滅した際の向きに動こうとします。
その時、袋小路になっていると1方向にしか動けないためそこでウロウロしていました。
復活する際に移動可能な方向を設定するようにしました。
あと、稀にドット抜けが発生。
ドットを通過してもドットが残る。
効果音とスコアはアップしており、もう一度取ろうと戻ると既に取ったことになっているのでドットは残ったままになる。
多分、走査線割込みに関するバグだと思うので、時間かかりそう。
後日、このバグ取りをします。
バグはこれくらい。
あとは、バランス調整。
ゲーム速度これでいいのかな?
自分としては結構ゆっくり目だけど、自分の感覚で設定すると、いつも早すぎるので、これくらいがいいのかな?
難易度は、最初の頃の面は敵3匹で簡単だけど、面進むと敵が増えてすぐ挟み込まれて終わってしまう。
わざわざ敵を追跡型にせずとも難しい。
挟みこまれて終わるパターンが多いかな?
あと、やっぱり敵との衝突判定の範囲が広すぎるかな…?
近距離で逃げている時、曲がり角で衝突してしまう。
もう少し狭めます。
次回は、詳細設計の「積み残し解消」と「バランス調整」です。
2024年04月25日
【ゲーム制作】面クリア型アクションゲーム 第25回
面クリア型アクションゲーム 第25回です。
今回は、「BASICで処理すると遅い」処理をマシン語化します。
前回BASICで組んで実行した際、ちょっと待たされ時間が気になった部分をマシン語にしていきます。
・初期画面表示
「ハンド君」や敵を初期位置に表示する。
その時併せて、敵座標を変数に設定する…、最初DATA文で14面9匹分用意し、変数に設定しPUT SPRITEで表示していましたが、バラバラ…と表示されるのでBASICは止め。
そこで、仮想スプライトアトリビュートテーブルに初期値を設定し、一瞬だけ走査線割込み処理を実行。
あら不思議、「ハンド君」と敵が表示されました。
これは仮想スプライトアトリビュートテーブルの設定値を「水平ライン4枚(MSX2は8枚)を超えてSPRITEを表示させたい」により走査線割込み処理で更新しているから。
特に改めてプログラム組む必要なし。
・面に出現する敵以外のSPRITEを隠す処理
BASICの時は隠してあるSPRITEを表示させる処理でしたが、上記マシン語では9匹分表示されてしまうので、各面出現しない敵(例えば1面は3匹しか出現しないので6匹出現せず)のY座標に&HE0(画面外)を設定し隠します。
面数から隠す数を算出し設定。
・面内のドットの数数え
DATA文で14面分用意し、変数に設定していましたが、マシン語で数えたらあっという間でした。
・速度設定
・面に出現する敵数設定。
面数から計算式で算出し設定。
・全SPRITE消去
32枚全部のSPRITEを隠す。
・タイトルとロゴの表示用に256文字整列。
256文字なのでBASICでも大丈夫かと思ったが、やっぱり遅かった…。
それ以外は、処理の遅さを感じなかったのでBASICで組みます。
BASIC全リストです。
オープニングとエンディングメッセージが含まれてるので、長い…。
次回、「デバッグ」作業です。
2024年04月24日
【ゲーム制作】面クリア型アクションゲーム 第24回
面クリア型アクションゲーム 第24回です。
今回は「BASIC部」を組んでいきます。
BASIC部で、ゲームとしての体裁をいろいろ整えていきます。
必要な処理は、
・初期画面表示
・プレイヤーが死んだときの処理
・ゲームオーバー処理
・ハイスコア表示
・面クリアした時の処理
・14面全てクリアした時の処理
・SPRITE全消し
・各面毎の敵数セット
・出現待機敵を隠す(Y座標を&HE0にセット)
・各面毎のドット数設定
…と、なります。
…あ、そうだ、久しぶりすぎて忘れていました。
残機があり、1匹死んでもその続きからできるタイプのゲームの変数の取り方をすっかり忘れていました。
1匹死んだときと、ゲームオーバーの時とで、初期化する変数が異なります。
基本的には全ての変数を初期化するのですが、一部「スコア」や、「残数」、「面数」、「50,000点フラグ」などは1プレイ中を通して継続しなければならない値ですので、ゲームオーバーまで継続する必要があります。
よって、その分だけ別のエリアに変数用意しておき、ゲームオーバーの時だけそちらもクリアするようにします。
最初に挙げたBASIC処理に関しては、一部組み込みましたが…、
「やっぱりおそい」
次回、BASICでは時間のかかる処理についてマシン語で組み直します。