したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

おちゃめくらぶ掲示板

246御茶目菜子:2010/05/31(月) 12:28:40
OPASの解説は果たして需要があるのか・・・?
ピーチバレーver.2を作ろうと13年前に作ったピーチバレー(初期型)の解析をしている
けれどやはりこのゲームはOPASがあってこそ・・・とはいえOPAS依存度はシュプールや
パネルQよりも圧倒的に低いにょ。
ピーチバレーは表示部分に関してはGPRINT比で5倍速を実現しているとはいえGPRINTが
速いG850VとかならばOPASが使えなくてもPC-E500のピーチバレーと同レベルの速度は実現
できそうにょ。
ということでピーチバレーをOPASのサンプルゲームとして考えていたけどあまり相応しく
ないことに気が付いたにょ。(といってもニューバージョンを作るのをやめるということ
ではないけど)

シュプールは確かにOPASをフル活用しているもののフル活用しすぎていてこのような使用は
あまりお勧めはできないしパネルQはOPASならではといってもいいけどOPASの基本的な活用
しかしてないのであえて解説するまでもないにょ。

そういうことでOPASならではというゲームはピーチバレーとは別に作ることにしたにょ。
2LINEゲームならば時間があまりかからずできそう(あまりグラフィックに凝らなくても
良いというメリットがある)けれど2LINEにおさめるというのが逆に難しいという問題も
あるにょ。
ゲーム内容はできるだけシンプルに・・ということで出来たのが「2LINE UFO GAME」にょ。
要は酔っぱらい系ゲーム(「ドットよけゲーム」といってもいいけどフラフラした動きが
特徴で横長のポケコンではメジャーなジャンルの1つ)の亜種なのだけどこれが異なるのは
上記のようにOPASを用いてドット単位で横スクロールしているという点にょ。

今回、ポケコンを持ってないという人のために実際に動作している様子を動画でも公開した
ので見てみてにょ。(無駄に720pに対応している)
http://www.youtube.com/watch?v=q5iaU2pH0Vg

ポケコンBASICでゲームを作った経験のある人であればこの数の隕石を動かしてこの速度が
実現できているというのはすごいと思ってもらえるに違いないにょ。(もっとも隕石を
動かしているのではなくドット単位でスクロールさせているだけなんだけどそれでも
オールBASICでここまでの速度が出せるのはOPASが使えるPC-E500シリーズだけ)

《「2LINE UFO GAME」プログラムリスト》
1 CLS :CLEAR :Y=&B,A$="タチツテトナニヌネノ↓←←←←←←←←←←カキクケコサシスセソ↓←←←←←←←←←←アイウエオカキクケコ↓←←←←←←←←←←サシスセソタチツテト":INPUT Z$:IF Z$ LET Z=RND -1,A=&BFA66:FOR I=A TO A+406:POKE I,0:NEXT :FOR I=40 TO406:I=I+RND 1500/I+&4,B=&2^RND &5/&2:POKE A+I,6*B,&D*B,&F*B,&6*B:NEXT
2 OPEN "SCRN:"FOR OUTPUT AS &1:FOR I=&TO &FF:X=X-(INKEY$="")*2-1,Y=Y+X:POKE &BFC93,I,&FA,&B:LOCATE E,E:PRINT #1,A$:Z=POINT (4,Y-3):GCURSOR (E,Y):GPRINT "70E87C2A3A2A7CE870":BEEP 1,Y*6,5:LOCATE &F,E:PRINT #1,I:IF Z BEEP 1ELSE BEEP &3:PRINT "CLEAR!"

《注意》
1行目に用いられている矢印は制御文字なのでこれは下記のようにすれば入力できるにょ。
(1) RUNモードにする
(2) A$=CHR$31 [RETURN]
(3) FOR I=0 TO 9:A$=A$+CHR$29:NEXT [RETURN]
(4) A$=A$+A$+A$ [RETURN]
(5) PROGRAMモードにする
(6) A$ [RETURN][+/-]
(7) 行番号その他を挿入する

また、このプログラムはOPASを使用しているためマシン語エリアを確保する必要があるにょ。
BFA66h〜BFBFFhの410バイト以上すでに確保している人は問題ないけど確保してない人や
確保の仕方が分からない人は下記のようにすればいいにょ。

POKE &BFE03,&1A,&FD,&B,&9A,1,0 [RETURN]
CALL &FFFD8 [RETURN]」

《使用方法》
RUNでゲームが開始されるにょ。
開始したらゲームのステージデータを新たに作るかどうか聞いてくるので初めてプレイ
するときは何でも適当な文字を入力してにょ。(データ作成は数秒で完了する)
2回目以降のプレイでデータを作る必要が無いときは[RETURN]を空打ちすればすぐに開始
できるにょ。
開始したら画面左端のUFOを操作するのだけどUFOは何かキーを押せば上昇し押さなければ
下降するので右から迫り来る隕石群に当たらないようにうまく避けなおかつ画面外に出ない
ようにして255ドット進めばクリアという単純なものにょ。
当たり判定はUFOの中央部1ドットのみなので見た目でかすっていても当たったことには
ならないため狭い隙間も通り抜けられるにょ。

このゲームは慣性もあるので後半になると画面に埋め尽くされる隕石を避けるのは並大抵な
ことではいかないにょ。
コツとしては後述のプロトタイプのZEROをプレイすれば分かるけど動きが曲線であるという
ことを認識することにょ。
2つの隕石の間に進む場合はその隕石の位置関係で下りの曲線か上りの曲線のどちらが良い
のかが決まるにょ。
この辺の選択とあとは真横へ移動する際も曲線であることを認識さえすればあとは何とか
なるにょ。

ちなみに自己最高は228点にょ。(200点を超えたのは1回だけであり、作った本人もまだ
クリアしてない)
70点付近が最初の壁なのでそれを超えたら100点くらいは出せるようになるけど先に進めば
どんどん難しくなるのでクリアするのは至難の業にょ。
このゲームが難しすぎる(簡単すぎる)という人は1行目の「I=I+RND 1500/I」の1500を
変えてにょ。(大きくすれば隕石の数が減り、小さくすれば増える)
またパターンが同じで飽きたという人は同じく1行目の「Z=RND-1」の-1を別の数(ただし
負の数に限る)へ変更すればいいにょ。
「Z=RND-1」の変わりにRANDOMIZEを入れるというのもありにょ。
これで毎回別のステージでプレイできるにょ。
なお、プログラムを書き換えてもゲーム開始時にステージデータ作成をし直さないと
ステージは変わらないので注意してにょ。

これって昔「PJ CLUB通」に掲載された「宇宙戦艦ナデツコ」の簡易版か・・・という人が
いたら相当の御茶目菜子マニアにょ(ってそんな人いるのか?)
ナデツコはラインごとにスクロール速度が異なるし左右方向へも慣性のある移動ができた
ためにこのUFO GAMEよりもさらに難しかったにょ。
その上このUFO GAMEよりも速かったしね。
序盤の隕石の出現数こそ少なかったけど隕石のグラフィックが大きかったので隙間をすり
抜けるというのは困難であり多重スクロールを利用して隙間の多い地点に移動すると
いうことが要求されてくるにょ。
そういう意味ではゲーム性は異なるかもしれないにょ。(このUFO GAMEはゲーム性自体は
ただの「ドットよけゲーム」と同じだなので)

確かにこのUFO GAMEを作る段階ではナデツコはかなり意識をしたにょ。
OPASの依存度が高い上にちょっとひねった使い方をしている上にシステムは単純という
ことでOPASの解説用のサンプルゲームとしてナデツコは悪くない感じだったからね。
ただし、単純な内容を考えればプログラムはもう少し短い方がいい(ピーチバレーも
速度面だけではなくプログラムが長すぎるためにOPASのサンプルゲームとしてはあまり
良くはない)ということで短いものを新たに作る必要があったにょ。
「ナデツコのシステムを簡易化すれば2LINEでできそう」として作ったわけなのでこの
UFO GAMEは「2LINEナデツコ」といってもいいけど元々某アニメのパロディタイトルなので
ナデツコという名前を今更使うというのもさすがに考えものにょ。
だから単純にグラフィックをUFOにしてから「UFO GAME」というタイトルにしたにょ。

さて、このゲームはOPASを使用したので6cpsの処理速度が実現できBASICで作られた
アクションゲームとしては必須ラインの5cpsを超えているためそれなりに快適にプレイが
できるにょ。
ちなみに音とスコアの常時表示をやめればさらに1.5倍の9cpsになるにょ。(2行を下記の
ように変更すれば良い)

2 POKE &BFC94,&FA,&B:OPEN "SCRN:"FOR OUTPUT AS &1:FOR I=&TO &FF:X=X-(INKEY$="")*2-1,Y=Y+X:POKE 785555,I:LOCATE 0,0:PRINT #1,A$:Z=POINT (4,Y-3):GCURSOR (0,Y):GPRINT "70E87C2A3A2A7CE870":IF Z LOCATE 15,0:PRINT I:BEEP 1ELSE BEEP &3:PRINT "CLEAR!"

この速度はOPASを使用したからこそ実現できるにょ。(演算速度がE500の2倍くらい速く
GPRINTにおいてはE500と比べて4〜5倍という圧倒的に速いPC-G850VでもBASICでこの速度は
無理だと思う)
実際にGPRINTを用いて同じ物を作ったら高速化を駆使しても1.3cpsだったからね。(この
速度ではさすがにプレイは耐えられない)
表示部分が10倍以上速くなったことでゲーム全体の処理速度が約5倍速になったにょ。

そのGPRINTを使用した物だけど馬鹿正直に隕石を全部動かしたらとてつもなく遅くなる
(理論上は画面内に60個の隕石が出てくるわけだし、ゲーム内でも実際に画面内に30個
程度出てくるため1回の表示に1秒以上かかってしまう)ということでGPRINTを用いて
スクロールするわけだけどここで問題となるのは文字列配列は254バイトまでしか格納
できないということにょ。
これはGPRINT形式のデータにおいては横127ドット分しかないにょ。
このゲームは横406ドットのデータを少しずつずらしながら使用することで315ドット×4行
として使用しているのだけどこれをGPRINTで同様の処理を行うためには最低でも406ドット
分、つまり812バイト分のデータを扱う必要があるにょ。

そのためには分割処理する必要があるにょ。
ただ、分割する場合、処理速度が大幅に落ちてしまうというのを避けるため速度優先で
データに冗長性を持たせることにしたにょ。(メインルーチン1回あたり4行分表示する
必要があるためメインルーチン内でRIGHT$とLEFT$を用いて表示エリアである60ドット分の
データを取り出す作業なんてしていたら遅くなって仕方がないのでMID$1回で済ませるため)
スクロールに必要な分と画面表示(横60ドット)を合わせて127ドット分に抑える必要が
あるということでスクロールに用いることができるのは最大で66バイトにょ。
406ドット(812バイト)=58ドット(116バイト)×7ということで分割データの1つを
60ドット+58ドット=118ドット(236バイト)としたにょ。
あとは簡単でラインごとにどれだけずらすかを事前に配列変数に入れておきあとは進んだ
距離を58で割ったものを元に使用するデータを順次変えていくだけにょ。
そのデータの60ドット分(120文字分)をMID$を使って表示すればOKにょ。

下記のものがそのリストにょ。

《「UFO GAME GPRINT版」プログラムリスト》
10 CLEAR :DIM A$(6),B(3):A=&BFA66:INPUT Z$:IF Z$ LET Z=RND -1:FOR I=A TO A+406:POKE I,0:NEXT :FOR I=40 TO406:I=I+RND 1500/I+&4,B=&2^RND &5/&2:POKE A+I,6*B,&D*B,&F*B,&6*B:NEXT
12 FOR I=0TO 6:FOR J=0TO 118:A$(I)=A$(I)+RIGHT$ ("0"+HEX$ PEEK (A+J),2):NEXT :A=A+58:NEXT :B(0)=90,B(1)=30,B(2)=0,B(3)=60:OPEN "SCRN:"FOR OUTPUT AS &1
15 CLS :X=0,Y=11:FOR I=0TO 255:FOR J=0TO 3:P=I+B(J),Q=P/58,R=P-INT Q*58:GCURSOR (0,J*8+7):GPRINT MID$ (A$(Q),R*2+1,120):NEXT
20 X=X-(INKEY$="")*2-1,Y=Y+X:Z=POINT (4,Y-3):GCURSOR (0,Y):GPRINT "70E87C2A3A2A7CE870":BEEP 1,Y*6,5:LOCATE 15,0:PRINT #1,I:IF Z BEEP 1ELSE BEEP &3:PRINT "CLEAR!"

GPRINT用のステージデータを配列変数に確保するのに約40秒かかるにょ。
毎プレイごとに40秒待つのは大変なのでRUNではなくGOTO 15[RETURN]で開始するといいにょ。

というわけで最初は2LINEに収まるか心配だったOPAS版だけど結果としてはGPRINTを使用した
ものよりリストが短くなったので2LINEに抑えることができたにょ。
この辺の1バイト単位での省メモリ化は昔は当たり前のようにやっていたけど最近はやって
なかっただけに2LINE化は慣れが必要にょ。

GPRINTを使用するならば無理に横スクロールさせるのではなくオーソドックスなタイプの
固定画面の方がよさそうにょ。

《「2LINE UFO GAME ZERO」プログラムリスト》
1 CLS :CLEAR :Y=11:Z=RND -1:FOR I=1TO 30:P=RND 226+10:Q=RND 28+3:LINE (P,Q)-(P+3,Q+3),&F66B,BF:NEXT :FOR X=0TO 231
2 Z=POINT (X+8,Y-3):W=W-(INKEY$ ="")*2-1:Y=Y+W:GCURSOR (X-1,Y-W):GPRINT "000000000000000000":GCURSOR (X,Y):GPRINT "70E87C2A3A2A7CE870":IF Z PRINT "SCORE";S:BEEP 1ELSE BEEP 1,6*Y,5:NEXT :BEEP 3:PRINT "CLEAR!"

画面の端から端まで行ったら終わりということ以外はOPAS対応版と同じにょ。
ただし当たり判定は真ん中1ドットではなく先頭部分の1ドットとなっているにょ。
UFOの表示にGPRINTを使用しているので移動によって障害物が削られてしまうため当たり
判定が真ん中だと当たったことにならないからね。(複数箇所で判定すればいいけど
あくまで脳内映像を具現化しただけということなので判定が重要というではなくどんな
動きかというのがイメージできるかが重要だし、厳密な当たり判定を行えば難しくて
ゲームにならない)
このふわふわした動きはUFOっぽいと思うにょ。(私は本物を見たことがないのであくまで
私の妄想に出てくるUFOだけど)

このZEROにおいて「W=W-(INKEY$ ="")*2-1」がこの動きの元になっているのでここを
「W=-(INKEY$ ="")*2-1」として単純に上下に動作するものにして動きの違いを見比べて
見ればその「UFOっぽさ」というものの違いが分かって貰えると思うにょ。
どちらが良いかはゲーム次第だけどこのふわふわっぽさを私が求めたので最初から
「慣性を付ける」ということしか考えてなかったにょ。

プロトタイプであるZEROを元にOPAS対応で横スクロールを行ったUFO GAMEができたにょ。
まぁ正確にはZEROは脳内で作っただけで実際に作ったのは上記のOPAS版が先だけどね。
脳内で動きがイメージできない人はZEROのように実際にプログラムを作って値を変えながら
試してみるのが一番にょ。
ZEROはまだ1行に収まる量に余裕があるのでさまざまな要素を追加するのもいいかも
しれないにょ。
ステージ端から端まで行ったら終わりではなく次のステージを用意したり様々なボーナス
ポイントを用意したり上記問題点として出てきた当たり判定の改善など工夫の余地は
いくらでもあるにょ。

OPASは便利であるもののPJ最終号で発表したためか利用者が多いとは思えないにょ。
しかし、使ってみればその便利さが分かるといってもGPRINTを使った方がお手軽と考えて
いる人もいるのではないかと思うにょ。
とはいえ今回作ったUFO GAMEのようにOPASを使った方がGPRINTより速いだけではなくお手軽
というものもあるにょ。
まぁOPAS以前にポケコンゲーム(特にPC-E500系)を作っている人自体が最近はほとんど
いないだろうけどね。

ということでこの2LINE UFO GAMEは早速サイトの方で公開したにょ。
http://ww5.tiki.ne.jp/~ochame/E500/SOFT/SHORTP.HTM#UFO
GRPINT版の解説についてはもう一度まとめなおして近日中にテクニックコーナーの方で
OPASの具体的活用例として解説したページを作る予定にょ。
これは「中級アクションゲーム制作講座」で書こうと思っていた内容だけど初級どころか
入門講座でさえまだできてない状態だから何年後になるか分からないからね(笑)




掲示板管理者へ連絡 無料レンタル掲示板