<<前のページへ戻る


MSXを知ることが早道です…

[やってみましょうBASIC]-[グラフィック]-[サウンドとミュージック]-[マシン語]-[ダウンロード]

MSXスプライト徹底講座=MSX Value!=


この講座は読み切りですから長いです。
画像はケータイ対応ページにしているので文書がメインになっています。

MSXスプライトに触れる
MSX1とMSX2のゲーム作りは違う
2つのスプライトモード
単色で8ドットスプライトと16ドットスプライトを作る
複数のスプライトを重ね合わせ
スプライト衝突判定
いろいろなプログラムのサンプル

MSXスプライトに触れる

スプライトなしのプログラムからスプライト機能に入ります。
まず、MSXのシステムを考えてみます。
文字数は縦と横で32×24のテキストモードです。
文字を表示する命令でWIDTH32が最大の文字数ですよね。

MSX:スプライトなしの場合

上のように何でもいいですから描きます。
24*32=768で768文字分のエリアがあれば
画面の文字を保存できることにもなります。
最近のPCでは大容量化で画面を保存するには
1ドットの色情報(ビットマップ)で
(1280*768)*3=2949120バイトと解像度によっては
多少変わります。
それでもMSXから見れば途方もないVRAMが必要ですが
MSXは768バイトで画面の文字を保存した
パターンネームテーブルの768バイトでよいのです。
これはSCREEN1〜SCREEN3までのMSX規格です。
仮想グラフィック画面ですね。この768バイトを16進数で300H、
ここではVPEEK(&H1800)〜VPEEK(&H1800+&H300)まで
になり、これを24で割ると各行のVRAMの保存エリアが出てきて
現在の位置を求めて、もしも「S」の文字であればセーブ画面を出す。
と、いうように細かな処理は割愛させていただきます。

MSX1とMSX2のゲーム作りは違う

ゲームをMSX2にしないのはMSX2にはこのエリアがありませんから
ビットマップになってしまいます。全く違うシステムになります。
さて、いいところまで進みましたので、私が簡単なプログラムを設定しておきました。
ダウンロードすると少しずつ命令が加わっています。
次のプログラム1をロードしてカーソルで操作くださ い。
この処理に空白を加えます。
これはSTICKでカーソルが押された直後に加えます。これがプログラム2で す。
最後に背景処理を加えた、地形エフェクトが入っていませんがこれを背景処理にたとえます。
これでパックマンのようなゲームになってしまいますが、プログラム3です。
さらには条件判定など加えたプログラム4では、ゲームにしました。
どうですか?ここまで来れば何かゲームプログラムが簡単にできる気がしませんか?
さて、3つのプログラムをロードしましたが、お分かりのとおり背景が消えて空白で潰されてしまいます。
そこで背景が消えないように、最前面に表示される、スプライトという機能を使います。

2つのスプライトモード

*MSXのスプライト

MSXはMSX、MSX2というように変わってきました。
これは8ドットで構成されていますので、
画面のサイズの横が256縦が192ドットのサイズになります。、
この数は後ほど説明するスプライトとグラフィック命令で使います。
MSXパソコンで8ドットというのは文字入力に適した大きさです。
これを2倍にするとゲームなどに適した16ドットになります。
さらに一般には使いませんが、
2倍にするとボスキャラなど強調したい場合に32ドットを使います。
また、MSXパソコンの色数の制限で色が出せない場合に使うこともあります。

MSXはスプライトモード1のみでMSX2はスプライトモード2が使えます。

*MSXスプライトモード1-SCREEN1〜3までのモード。

横に16ドットスプライトが4つまで表示できる

*MSXスプライトモード2-SCREEN4以降のモード。

横に16ドットスプライトが8つまで表示できる。COLORSPRITE対応


単色で8ドットスプライトと16ドットスプライトを作る

ここでは2つのスプライトについて説明していきます。

通常は8ドットスプライトでSCREEN1の場合はSCREEN1,1が指定されています。
16ドットスプライトは各スクリーンに対応しており、SCREEN命令の第2オプションを指定します。
黒字は8ドット、赤字は16ドットになっています。
プログラミングしたい場合は頭に行番号を入れます。



SCREEN1,1
SCREEN1,2

これでモードの設定が終わりました。

11111111
11111110
11111100
11111100
11111110
11111111
11001110
10000100

これは矢印の8ドットスプライトパターンです。
カーソルを長押しすると移動速度が倍倍倍…となる。
点を打つこともできる、プログラムを見てみよう。ダウンロード

1111111111111111
1000000000000001
1001100001111001
1001100010000101
1010100010000101
1010100010000001
1000100010000001
1000100010000001
1000100011111001
1000100010000101
1000100010000101
1000100010000101
1000100010000101
1001110001111001
1000000000000001
1111111111111111

これは16ドットスプライトパターンです。
次にFOR文でI=1と8ドットか16ドットかを指定します。


FORI=1TO8
FORI=1TO16

次にデータを読みます。このままのデータではバイナリ形式になります。
&Bをくわえます。B(バイナリ)は2進数形式のデータを指します。
VAL(バリュー)で数値にします。

READI$:VAL(”&B”+I$)

となりますが、次にアスキーコードに変えて、加えます。

READI$:SP$=SP$+CHR$(VAL(”&B”+I$))

これが最終形です。8回繰り返すのでSP$には8バイト入ります。

スプライトが正常に表示されな い(バグる)時は
すなわち、I$など多用する場 合、I$=INKEY$などで、I$に文字列が入っていますから、
I$=””で文字列を空にして から行ってください。


なお、16ドットの場合は

READI$
L$=L$+CHR$(VAL(” &B”+LEFT$(I$,8)))
R$ =R$+CHR$(VAL(”&B”+RIGHT$(I$,8)))

となります。で繰り返し・・・

NEXT
NEXT

次に定義番号を入れます。

SPRITE$(1)=SP$
SPRITE $(1)=L$+R$

となります。定義場所を確保したら、表示します。

PUTSPRITE1,(110,110),15,1
PUTSPRITE1, (110,110),15,1

になります。PUTSPRITEの1,は表示番号、(110,110)は座標、15は文字色、最後の1はSPRITE$で定義した定義番号。
データで1になっているところの色が白色になり、0は透明になります。この透明部分に違うスプライトを重ねることが可能です。
 例えば勇者が盾を購入したりする場合、その盾を赤にしたり、剣を長くしたりなどという細かな事が可能になります。

PUT SPRITEにはデータを保存する番号と表示をする番号があります。
一般にスプライトはスプライト番号を1〜31まで表示できますが、表示を消したい場合があります。
そこで番号を0は消す場合の為に残します。

最後に上のパターンをデータ文を


DATA 11111111
DATA  1111111111111111

これをデータ分入力しますが、
8ドットならばデータ長8バイトの8行、16ドットならばデータ長16バイトの16行を加えます。
移動処理をする場合は110,110がX,Yになります。
15は色コードです。


「MSXスプライトは私じゃぁ無理。」と、思ってしまう人もいるでしょう。
最後にツールを使う方法がありますので、最後まで読んでくださいね。
ダウンロードすればエディタのデータからプログラミングできますよ。

COLORSPRITE

スプライトモード2はMSX2に加わった機能です。
このモードは横1ラインごとに2色の色を置くことができるスプライトです。SCREEN4以降の命令です。

2色のパターンをDATA文で16進表記で決めていき、COLORSPRITE$(1)=というようにSPRITE$と同様の方法で入れていきます。

DATA 0F0F0F0F0F0F0F〜

まず、READA$で読み込ませる

A$=”0F0F0F0F0F〜”と入る

次にこれを255字のコードに

FORI=0TO15:C$=C$+CHR$(VAL(”&H”+MID$(A$,I*2+1,2))):NEXT

COLORSPRITE(1)=0

この命令は色の定義のほかに、ビット設定ができる

b7 b6 b5 b4 b3 b2 b1 b0
EC CC IC 0  * * * *

1 1 0 0 1 1 1 1としたい場合、&B11001111となる。

? &B11001111

207となる。

ECビット-1にセットすると32ドット表示位置を左にずらします。
 画面外の右から出てくるようならば問題ないが、32ドットのスプライトならば、これを有効にすれば仮想的にXが-32座標までできるから、画面外の左か ら徐々に敵が出てくるようにできる。
 もう1つは画面外の右にスプライトが消えていったものに「このやろう!ばかやろう!二度とくるな!」と言ってECビットを1にするとすっとんでスプライ トが戻ってきて「いえ、何でもありません。」ということも可能。 

ICビット-1にセットすると衝突判定を行わない。

CCビット-1にセットするとスプライト面の優先順位をなくなり、衝突判定も行いません。

CCビットが1のスプライトは優先順位がなくなると



3→CCビット1にする



と、

1段上の優先順位2のスプライトと同じような動作になる。ただし、優先順位2のスプライトがCCビットを1の場合は除く。
 表示される条件として横一列(Y座標が等しい)場合に優先順位を得て、スプライトの性質も受け継ぐ、もし同座標の場合OR色になり優先順位を得る。 (@@〜わからない


なお、*はカラーコードになります。カラーコードのビット指定は以下の表にあります。


MSXスプライトを使いこなすのは少し難しい。
COLORSPRITEはMSX2の機能ですから、読み飛ばしてもかまいませんが、詳しく解説しています。

2つのカラースプライト:
https://blog.goo.ne.jp/u-yans/e/2e10108f0201de38075a977c9f9c45c7


複数のスプライトを重ね合わせ

 重ね合わせで鮮やかにしてみましょう。重ね合わせのテクニックはカラーコードの組み合わせで変わる。

4OR7=7、4OR8=12という論理演算になる。ちょっと難しいけど

16進:10進:2進

0:0:0000
1:1:0001
2:2:0010
3:3:0011
4:4:0100
5:5:0101
6:6:0110
7:7:0111
8:8:1000
9:9:1001
A:10:1010
B:11:1011
C:12:1100
D:13:1101
E:14:1110
F:15:1111

4が0100と7が0111をORにしてみる

 0100
 0111
-------
 0111

となります。これは0は0。11(イチイチ)は1、01は1となるからで

4が0100と8が1000の場合。

 0100
 1000
-------
 1100

となります。12。ちなみにANDの場合は11(イチイチ)は1、それ以外は0です。
256進数はないけど、キャラクターコードが(0〜255)まであるので代用しているわけです。
0FならばCHR$(F)でいいです。

スプライト衝突判定

SPRITE ON

スプライト衝突判定を有効にする

SPRITE OFF

スプライト衝突判定を無効にする

ON SPRITE GOSUB

衝突が起こった場合にサブルーチンへ渡す


い ろいろなプログラムのサンプル

ここでは当サイトオリジナルのプログラムのほんの一部を公開してみる。
さあ、MSXBASICプログラムに挑戦してみよう!

<<スプライトを使っていないゲーム>>

MSX:MSXゲームSP

車も背景もスプライトを使っていません。こんなゲームもできます。
http://www.geocities.jp/fullmsx2/u -yan/page010.html(SPツーリングセンター)

<<スプライトを使っているコンテンツのページ>>

このサイトには多数のサンプルのページが実はあったりする

MSX:スプライト移動4隅判定

4隅の色を判定することで衝突処理させることもできる。
キャラクターを移動して、赤いマルに近づけてみて欲しい

http://www.geocities.jp/fullmsx2/u -yan/yosumi.bas(MSXさいたまページより)

<<ビットマップからスプライトにするこもできる>>

このツールをダウンロードすれば、この講座の半分以上のことはクリアできます。
赤のスプライト、黄色のスプライト、灰色のスプライト、白のスプライトと重ね合わせができます。

MSX:多色スプライト

 ドットからスプライト化する、ドット絵アプリ講座では多色のスプライト
のキャラクター移動させることもできます。サイトへ

http://www.geocities.jp/fullmsx2/u -yan/msxi-spr.html(MSXドット絵アプリ講座)

最近ではSCREEN5でパターンネームテーブルを作り
MSX規格の良い点をMSX2で使うMSXガジェットプロジェクトも進行中です。

★ スプライトはどのくらい使っているか?

市販ゲームではプレイヤー、人以外はスプライトを使っていないゲームが多くあります。
 敵などは鮮やかな色を使っていますし、スプライトでやっているようには見えません。
スプライトとわからないようにする方法は敵をブラックで影にしたり輪郭線のようなエフェクト処理を施します。
 エフェクトを加えることでモンスターを鈍い動きとクッキリさ立体感が増します。



★RPG のキャラクタ移動

 
RPGの移動はテクスチャと同じまたは半キャラ、これは情報量を少なくして処理を向上させるもの

 地形パターンは16ドットに見せて8×8ドットパーツになる。
全画面を使えば16×13マスになる。半キャラの8ドットパターンの場合32×26になる。
マップパーツのない、256×212フルマッピングではMSXパソコンではゲームにならない。
これに合わせるためにキャラは8ドット飛びの半キャラ移動になる。
また、画面にパラメータのウインドウを設けてマスの数を少なくして処理を軽くする方法もある。

MSX:アドルと屋根パーツ

 例えば移動処理中にAという地形パターンとおおむね同じ座標になりかつ、(画像)右移動の場合スプライトを変化、
ここでMOD関数を使いビットマップで1を0に していき、右から消していくなどの処理ができる。
スプライトを半分消して下半身部分がなくなれば立体化して見える。
移動不能になれば底なし沼に、はまったようにもなる。

 仮にマップチップをひとつひとつ文字に置けばX方向で200くらいの広大なマップを作成可能になる、やろうと思えばもっと可能だけど。3Dは別物だけど ツ クール程度であれば実現可能。

 また、MSX−FANのゲームのプログラムもいろいろと参考になりますので、機会があれば見てみるとよいですね。

 turboRのMSXPLAYerも登場したし、べーしっくんもあるし今までで最高の環境ですね。

★スプライトも保存できる?
 
 スプライトが表示されている状態はVRAMにスプライトが入っています。
VRAMマップのスプライトテーブルのアドレスを指定すればよいです。
ここで保存させれば次回からはすぐにスプライトを使うことができます。

BASAVE”ファイル名”,開始アドレス,終了アドレス,S

SCREEN1と2は&H1B00から&H1B8Fまで、SCREEN5は&H7400から&H9FFFまでになります。

 BASICならデータを互換スプライトデータとして保存する独自の方法を発案しました。
これはVRAMではなくスプライトパターンを保存する方法でかなり使いやすくなります。



(c)1991 UME,(c)1993 UMEnoteProjects ,(c)1999 Hinoume ProgramTeam.