とわ君に独り言2(痛)

MSXやエレキギターが好きなおっさんの戯言。妻が白血病で亡くなり、3人の子供達と暮らしてます。昔のブログ→id:TOWA0104

■簡単な嘘縦横スクロールを考える■MSX BASIC入門 ゲーム制作〜番外編〜■

※番外編は自由課題(大した内容では無いよう…)
本題
■簡単で簡易的な手抜き嘘スクロールを考えてみました。(SCREEN1や1.5ベース)■

↑これは後半で

●縦に星が流れるような嘘縦スクロール●
・8 ドット(1文字分)嘘縦スクロール

↑残像だらけ…。
★超絶簡単!
スクロールさせたい最初の行にランダムにドット文字("・")を1つ置き、エスケープシーケンスの1行挿入、これを繰り返すだけです。(1番簡単な方法ですね。)
✖スコア表示等を画面上部にしか作れないのと、処理がやや重いのがデメリットです。

↑※PRINT文中の「;」「+」等の接続を省き、最後の「;」だけにしたのが1番速かったです。

エスケープシーケンスの1行挿入は凄く便利でアイデア沢山浮かびますよね。
(*゚∀゚)/


★★★●1ドット単位で星(ドット)を複数流れさせる嘘縦スクロール●★★★
・メインルーチン内で呼ぶのはVPOKE文2つ+αだけの単純で高速(BASICとしては)な方法。
星位は滑らかに流したくて、今回初めて考えてみました。

まず、a〜x等のフォントデータが連続している24文字を、縦1列分画面上に順番に並べて置き、そのフォントデータを全て00Hで埋めます。
(※日本語版MSX依存フォントの&H80〜等のフォントを使った方が色々と賢いのかもしれませんが…)

次に、フォントデータがVRAM上に8バイトずつ順に並んでいるのを利用し、
aのフォントデータの先頭から01H(1ドット)を書いてはアドレスを1増やして書き、一つ前のアドレスに00Hを書き込んでやります。
xのフォントデータの次まで来たらaに戻ればよいだけです。

これだけでは星1個なので、予めa〜xの順番を適当にシフトした列を複数列画面に貼っておけば、
VPOKE文2つ+αだけで最大32個の星を一斉に1ドット動かせます!
↑こんなふうに敷き詰めます。

☆メリットは、かなり速く動き星が増えても速度が変わらないことです!
応用すれば、星を2重スクロールさせたりとか海の波のようにするとか、色々出来そうです。

✖同じパターンの繰り返しになるのと、フォントデータが3段のSCREEN1.5(多色刷り)には一手間加えないと通用しないのがデメリットです。
逆に言えば、多色刷りでない方がメリットがある場合もあると思いました。


↑これは1列飛ばしにしていますが「STEP2」を削除したりすると、簡単に32列に出来ます。
(アレッ?2行の最後に誤記入あるぅ…汗汗)
※2023/9/30動画3つ追記https://twitter.com/FujiiMarr/status/1707674956967145498?t=6NbAbbHfalawfNElcIr-0A&s=19
・HRA!さんがブラッシュアップして下さいました👍
https://twitter.com/thara1129/status/1707684249648943322?t=S8oChOXmhuj_M7zZ9Tn_0A&s=19
・更にTKZさんが更に更に改良して下さいました👍
https://twitter.com/TKZ80/status/1707811322019316051?t=Sl0q9BXrnhkVH6wFRv96CQ&s=19

●星を1文字分流す嘘横スクロール。●
・8ドット(1文字分)嘘横星スクロール。
・上から下まで1文字分左にスライドさせれば良いだけなのですが、スピード的にマシン語でないと厳しいです。
(;´Д`)
横方向に32キャラ分並べて行くのですが、こちらは横方向なのでSCREEN1.5(多色刷り)でもOKです。


●星を1ドット分流す嘘横スクロール●(追記分)

比較的簡単な事だと気付きました…
&B00000001を7回2倍して8回目に元に戻しつつ隣りに移動させればいいじゃないのぉ
ビットのシフトやローテイト命令なくても掛け算割り算あるじゃないのぉ(気がつくの遅い)
※2023/9/30追記 TKZ80さんが具現化して下さいました👍
https://twitter.com/TKZ80/status/1708026890706182324?t=jlJw6JGL9dVkLVeFzwpaYg&s=19

★★★●嘘3D横スクロール●★★★(超絶手抜き版)
・3D機能のないMSXで、それっぽく3Dスクロールを見せる方法として、紙芝居(簡易アニメーション)を考えてみました。

※3コマで最低限背景が右から左に立体的に流れるっぽく見える気がします。(して下さい)

※真ん中のキャラは関係ありません。
ポーズボタンで止めて撮ったので、描画中の部分もあります。
↓動画(2023/8/15別のリンクにしました)

色々実験し、今回は縦横4✖32文字分を入れた変数を「PRINT」文で上下3コマ(パターン)分表示を行い、また最初に戻るだけですが、意外と速く動いています。
1ドットスクロールとも、1文字(8ドット)スクロールとも違う、不思議なあれ的なこれ的なそれ的な…3Dもどき効果です。
友人2人に見せたら少し驚いてました。
(手抜きなので、両端近くの1本の斜線に大きなパースの狂いがありますっ!)
☆紙芝居方式は、巧くやれば色々な効果を出せそうです。

✖3パターン分の画像データが多いのがデメリットです…。(ちょうど丸々1画面分のデータになりますかね)
※初代MSXBASICの機能の範囲内で、もっと速く表示出来そうな方法もあるので、PRINT表示より速くなるかもしれません。
( ゚д゚)ハッ!
SCREEN2でLINE文でやった方がデータ少ないか


●嘘ラスタースクロール(ぷっw)●追記分
8ドット(1文字)分ずつウネウネさせて、ラスタースクロール風にしました。

↑これが

↑こんな感じにカクカクウネウネw

SCREEN3っぽいですな…(*´∀`*)
まぁ、お遊びですw
LOCATEで表示位置をずらしてるだけですw
両端のキャラを同時に切り替えれば意外とそれっぽくなるかも?


■ほとんどBASICで使うと速度的に厳しいので、べーしっくんで使うかマシン語化するのが得策かもしれません。■

◆嘘縦横スクロールを検討していたら、大昔にDELのコントロールコードで嘘横スク出来ないか、一生懸命テストこいてダメだったホロ苦い記憶を思い出しました…。(その後MID$を使う方法に変更)◆

■他にアグレッシヴな方法考えたりしたら、追記修正行います■