スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

9月12日 夏休みMSX自由研究


今更MSX1で遊んでみよう企画です。VRAM研究、ぴったしニャンニャン移植、ときましたが、今回は「DRAW文を使ってみよう」です。




DRAW文ってグラフィックを描くコマンドですよね。LINEとかPSETとかじゃダメなの?




例えばLINE文だと、始点と終点座標を指定して線を描きますが、DRAW文は「右へ3ドット、下へ5ドット」という風な指定の仕方で線を描くコマンドです。








まあそんな感じです。




このころ流行ってましたもんね、タートルグラフィックス。調べてみると、他にもパソピア7やSMC-70にも同様のDRAW文があったようですよ。




で、良く例題に出されるこんな感じの図形を描かせてみました。プログラムも。



ぐるぐる
リスト


LINE文を使うより簡潔になってる?




う~ん、これくらいだとそんなに変わらない気もする。ただ、DRAW文の良さは、描画データはそのままにいろいろ変化させることが出来る、というところだと思う。ということで、幾何学的図形だけだと面白くないので、32×32ドットで大平みちるちゃんをDRAW文で描いてみて、いろいろ変化させてみましょう。




じゃあ、まずは基本。今回はSCREEN3モードですね。64×48ドットとかなり荒いですけど、色数制限もないしちょうどよいでしょう。



みちるちゃん


表示位置を変えてみます。描画位置を変えるのはMコマンドです。「 DRAW "M(X座標),(Y座標)" 」を事前に実行すると変化させることが出来ます。



Mコマンド


次は回転です。Aコマンドを使います。但し、90度ずつしか回転させることができません。DRAW "A3"(270度) DRAW "A2"(180度)を設定しています。



Aコマンド


拡大・縮小もできます。Sコマンドで設定します。実行結果はそれぞれ原寸、3/4、1/2、1/4です。



Sコマンド


あれ、拡大は?




SCREEN3モードだと手狭なので、SCREEN2モードで拡大させてみます。192×192まで引き延ばしてみましょう。



Sコマンドその2


なにこれ……




ドットを膨らませるような拡大ではなく、座標や長さを変換してるのでこうなってしまうのです。




なるほど。




塗りつぶしコマンドがあるといいんだけど、ないので線を敷き詰めていくしかないんだよね。だからこんな結果に。




最初から192×192で作っておけばいいのでは。




DRAW文でこういう絵を描くのは大変なんよ。32×32ドットでもひーひー言いながらだったし。




まあ、こういう絵なら普通にドットの並びをDATA文にして、READしてPSETで描いた方が早いですよね。回転とか拡大は自前でやらなきゃならないですけど。




やっぱりDRAW文は一番最初のような図形を描くのが本職、ということがこの研究の成果でした。最後はSCREEN2モードで市松模様。水平方向8ドットにつき2色までという制限があるので色がちょっと変ですが。



市松模様


データを作るのは大変ですけど、いろいろ遊べて面白いですね、DRAW文。興味のある方はこちらから今回のプログラムをどうぞ。.BASファイルにして読ませてみて下さい。




ゆかりちゃん?

スポンサーサイト

3月14日 伝えて そのまま ためらわないで


さて、次はSCREEN 2の……




え~~、まだやるの?




ごめん、MSX1のVRAM探訪はこれで最後にします。で、SCREEN 2はグラフィックモードで、256×192ドットの表示が出来ます。そのかわり、文字は「文字」としては表示できません。すべてグラフィック扱いになります。




PC-9801だと、1ドット=1ビットで、640×400ドットで32KB。それが赤青緑3枚(16色だと4枚)ぶん用意されている……っていうおなじみの配列ですけど、MSXはどうなんでしょう。




実は、先週説明したSCREEN 1と使い方は同じです。




そうなの?グラフィックなら、パターンネームテーブルっていらないと思うんですけど。あれって8×8ドットの文字単位の管理しかできないじゃないですか。




そうなんだけど、統一性を持たせる為なのか、そうなってます。簡単に言うと、文字を表示する時とは逆のことをしているという。




逆?




先週のSCREEN 1では、パターンジェネレーターテーブルに文字の形の情報があらかじめ格納されていました。例えばキャラクター番号65番は"A"、66番は"B"とかいうふうに。で、パターンネームテーブルにその番号を書き込むと、文字が表示されるという仕組みでした。ネームテーブルの先頭に"65"を書き込むと画面左隅に"A"と表示されるよね。




はいはい。




グラフィックモードの場合、パターンジェネレーターテーブルには初めは何もデータがありません。そして、パターンネームテーブルには、あらかじめキャラクタ番号の0~255が整然と並んだ状態になっています。




なるほど、なんとなくわかってきました。




BASICでグラフィックを描く命令、PSETとかLINEなどを実行すると、データが書き込まれるのはSCREEN 1の時とは違い、パターンジェネレーターテーブルの方になります。




例えば、画面左隅に点を打つPSET(0,0)を実行すると、キャラクタ番号0番の所にデータが書き込まれます。




そうすると、あらかじめパターンネームテーブルにある0番のところに点が現れるわけですね。




そうそう。ネームテーブルの方を操作するSCREEN 1、ジェネレーターテーブルの方を操作するSCREEN 2、という感じです。全画面をユーザー定義文字で書き換えているという言い方もできるかも。だから基本は、8×8ドットをひとつの単位とした文字画面と変わりません。




でも、文字画面は32桁×24行で768文字ぶんありますよ。1バイト、256文字ぶんでは全画面を別々のキャラクタで埋めることが出来ませんよ。




なので、このモードでは画面を上中下、三分割して管理しています。ちょうど8行ぶんずつ。32桁×8行でちょうどこの領域は256文字ぶんになります。




なるほど。ということは、同じキャラクタ番号でも、場所が違えば表示される内容が違うということですね。




そう。例えば、8×8ドットでこんなグラフィックを描いてみたとします。



三色アイス


三色アイス?SCREEN 1の時と違ってずいぶんカラフルですね。




SCREEN 2では、水平方向8ドット中に15色の中から2色、という制限がありますが、垂直方向にはそういう制限がないので、SCREEN 1の時よりも表現力が上がります。これみたいに水平方向にあまり変化がない絵なんかはきれいになりますね。




で、これがキャラクタ番号0番、ということなので、パターンネームテーブルに0番を敷き詰めれば、このキャラクタで画面が埋まることになるのですが……



三色アイス敷き詰め


あ、上8行ぶんしか表示されませんね。なるほどなるほど……




先ほど説明したように、「0番」は上中下のエリアでそれぞれ別になっているので、こうなってしまうのです。




三色アイスですべてを埋めるには、上中下を担当するそれぞれのパターンジェネレーターテーブルに同じ内容を記録する必要があります。この場合でいうと、三色アイスデータを0H、800H、1000Hに書き込めばすべての場所で「0番が三色アイス」になります。




なんか、前と同じ使い方ができそうですね。しかも色がたくさん使えるし。




ということで、こんなプログラムを。ゲームには全然なってませんが、カーソルキーで人が動くものを作ってみました。グラフィックモードといいながら、動かしているデータは文字の時と同じネームテーブル上のものなので、動きの速度は文字の時と同じです。



SCREEN 2 ゲーム画面


先週より、よりカラフルになりましたね。




ただ、画面に表示するものを全部自分で管理しないといけないので大変かなあとは思う。BASICの命令で画面に書き込んじゃうとパターンジェネレーターテーブルが壊れちゃうし。




さて、MSXのVRAM探訪をしてきましたが、どうでした?




実は、「MSX-BASICには、N88-BASICにあるGET@、PUT@にあたる命令はないの?」っていうのが事の発端で。




グラフィックの表示をする命令ですか。




うん。どうも見あたらない、しかし速度的にもデータ的にもPSETやLINEで描いているわけにもいかない、だったらVRAMの内容をそのまま取り込めばいいんじゃないか、と考えて。




なるほどね。まあ目的は達せられたんじゃないの。




でも、MSX1というハードと、BASICのみで作るというのを考えると、そこまでするよりもっと手軽にスプライトで作って下さい、というメッセージなのかなと。そういう命令がないのは。




そもそも、水平方向8ドットにつき2色だと、制限がきつすぎて小さなキャラクタの顔とか描くのは厳しそうですし。あと、VRAMへのまとまったデータの書き込みは結構時間かかりますよ。先ほどのプログラムの動作を見ても。素直にPSETやDRAWとか使った方がスマートかと。




……ということに気がついた、VRAM探訪でした。




牧野すずめ

3月7日 姉VDP


なるほどなるほど……




年を取ると独り言が多くなると言いますが……何うなってるんですか?




先週、MSXでスキーゲームを作ったじゃない。で、作ってる過程でMSXの文字や画面の扱いにいろいろ疑問が出てきて、それで調べていたのです。具体的には、何で文字単位で色指定できないのか、と。




そういえば、スキーゲームは単色でしたね。




N88-BASICしかよく知らないので、普通にひと文字ごとに色が付けられると思ってた。例えばN88だと……



N88-BASIC


まあ、プログラム通りですね。




同じ事をMSXでやると……



MSX-BASIC


ありゃ、全部COLOR 3になっちゃいましたね。表示させた文字だけでなくリストまでも。




テキストでのCOLOR文は、今表示されているすべての色を変化させてしまうのだそうです、MSXでは。




まあでも、ゲームで使うならテキストキャラじゃなくてスプライトを使って下さい、ってことじゃないの。そっちの方が動かすには便利なんだし。




あと、SCREEN 2のグラフィックモードを使うという手もあるけど、テキストキャラゲーが堪能しづらいなあと。




できないものはしかたないとして、あきらめるしか。




ところが、いろいろ調べてみたら、制限がありながらも色づけはできるみたい。




へー。どうやって?




MSX1のV-RAMは16KBあって、モードによって使い方が違うんだけど、SCREEN1の場合、だいだい以下のようになってるようです。



MSX VRAM構成


カラーテーブル、っていうのが怪しそうですね。




8文字ごとではありますが、文字色・背景色を指定出来るみたいです。だから単色のキャラクタセットを……



MSX キャラクタセット


例えばこんな感じに色づけすることが出来ます。



MSX キャラクタセット色つき


あら、ずいぶんカラフルになりました。




そして、パターンジェネレーターテーブルとして、書き換えの出来るRAM上にフォントデータがあるということは……




以前話題になった、ユーザー定義文字機能ですか。JR-100なんかが有名ですね。




そうなのよ。MSXにこの機能があるとは思わなかった。で、先週作ったスキーゲームを、キャラクタを書き換えて色づけしてみました。



スキーゲーム


少しは賑やかになりましたね。結構使えそうな機能なのに、マニュアルとかには載ってないんですねえ。




手持ちの資料がパソピアIQのマニュアルと古本屋で見つけたMSXゲームづくりの入門書しかないからわからなかったよ。こういう時ネット検索は頼りになります。




この機能とスプライトを合わせると表現が広がりそう。




背景を、書き換えた文字パターンを敷き詰めて作るとかかな。動的にパターンを変えて動く背景とかも。あと純粋にJR-100みたいな使い方もできそうだから、移植が簡単に行えそうだね。




宮崎ゆかり

2月28日 ゲレンデがとけるほどVPEEKしたい


冬季オリンピックもそろそろ終了ですね。




日本人が活躍してないのであんまり話題になりませんが、回転競技とか見てると思い出すよね、パソコン黎明期のスキーゲーム。




……結局そっちに話を持って行きますか。




ほらほら、こんな感じの。



スラロームゲーム画面


あ~、ありましたねえ。ゲームの入門書とかには必ずといっていいほど、作例として載ってましたね。




一番下の行で改行するとテキストが一段スクロールするというのを利用して、簡単にスクロールゲームが作れるというものでした。今回MSX用に作ってみました。リストは以下になります。



スラロームプログラムリスト


スキーヤーをボート、ゲレンデを川に設定した、リバーパトロールもどきもありましたね。おそらく当時のほとんどのパソコン用に作られたでしょう。




1982年に発売されたタイトーのアーケードゲーム、「アルペンスキー」が元かと思ったんだけど、確かもっと前からこのゲームはあったような感じなので違うのかな?リバーパトロールも1981年か……。このゲームがマイコンで一番最初に作られた機種はなんだったんだろうね。




やっぱりこの頃だと海外製ですかね。Apple][とかTRS-80とかPET 2001とか……




あとはスキージャンプなんかもあったね。ベーマガに。今もしベーマガがあればカーリングゲームが早速載ってたかも。




ウェンディ


11月8日 激突! - ON SPRITE GOSUB


というわけで、MSX1に触れてみよう企画第二弾です。




いつから連続企画になったんですか。




まあまあ。で、ゲームづくりに向いているMSXですが、スプライト関連の命令の中に便利そうなものを見つけました。




[ ON SPRITE GOSUB ] なんですかこれ?




スプライト同士が衝突した場合、サブルーチンに飛んでくれるという、衝突判定をパソコンがしてくれる非常に便利そうな命令です。




自前で衝突判定を書かなくていいんですね。確かに便利なような。




そこで、実験する為にプログラムを作ってみました。衝突すると"CRUSH!"と表示するものです。



スプライト衝突判定実験その1


十字スプライトを動かして、四角いスプライトに当てるんですね。



スプライト衝突判定実験その2


おお!



スプライト衝突判定実験その3


おおぉう!




何興奮してるんですか?普通にちゃんと判定してますが。




いや、実はON SPRITE GOSUBの判定って、スプライトサイズの矩形で判断するんじゃないかと予想してたから。画面の十字マークはスプライトサイズより若干小さめに作られていて、実際のスプライトサイズはこんな感じになっているので、



スプライト衝突判定実験その4


この状態でも「当たった」と判定されるんじゃないかと思ってた。




なるほど、ちゃんと透明部分には判定がないので、それでびっくりしてたんですね。




かなり使える!と思ったんですが……




が?




これって、どのスプライトが当たったかという情報が得られないみたいなんだよね。今回みたいに二つしか無ければいいんだけど、例えば自機・自弾・敵・敵弾なんていう複数スプライトがあったら、ON SPRITE GOSUBで飛ばされても何と何が当たったのかわからないので、結局判定コードを書かなきゃならないんじゃないかと思って。




なるほど。あと、判定が見た目より小さい時とかですね。弾幕シューティングの自機とか。




さすがにBASICで弾幕シューは無理だと思うけど、そういう場合も自前で判定しないといけないよね。




ということは、ON SPRITE GOSUB は使えない?




いや、さっきの実験でもわかったとおり、透明部分についてもちゃんと考慮してくれるので、使いどころはありそう。複雑な形のスプライトだと特に。




あと、ゲームづくり初心者用という役割もありそうですよね。




自動で衝突判定してくれるから、考えるところが少なくて済むのでそうかもね。





C77鋭意制作中……

カレンダー
01 | 2017/02 | 03
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 - - - -
twitterでひとこと
最新記事
リンク
カテゴリ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
来訪者数
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。