《 補 足 》



 前ページ動作cpsによる分類というのは慣れている人にとっては分かりやすいのですがゲームを作る際に動作速度を計測したことがない人だと分かりにくいかと思います。このゲーム制作講座においては特定機種に依存しない形で書いているのであえて具体的なプログラムの例を書いていません。しかし、それでは分かりにくいという人がいたためにやはり具体例は必要だろうと思い補足のためこのページを追記しました。
 また、この動作cpsによる分類のボーダーラインというのも私の過去の経験などを元にして設定しているために人によってこの基準は異なることだと思います。

 そういうわけで、動作cpsの変化によって具体的どのように変わるのかということを体感してもらうためにサンプルプログラムを作りました。
 機種はPC-E500シリーズ用となっています。PC-G800シリーズでも表示関係を修正すれば動作は可能ですがゲーム内容ではなく動作速度が重要となるために単純に変更ができず、私がG800系の機種を持ってないこともあって今回は非対応とさせてもらいます。(PC-G800シリーズの機種をお持ちの方はストップウォッチを片手にメインルーチン1回当たりの速度を測りFOR〜NEXTで微調整をしてもらえば簡単に移植は可能だと思います。)

《 サンプル1 「50m走」 》
RUNをすればスタート。[1][3]を交互に押して画面右端までPを移動。リトライはRETURN。
10 CLS :CLEAR :K=1:WAIT 99:PRINT "READEY ";:WAIT 0:PRINT "GO!"
20 IF VAL INKEY$ THEN K=4-K:X=X+1
30 LOCATE X,2:PRINT " P"
40 T=T+0.04:IF X<38THEN 20
50 BEEP 1:PRINT "GOAL IN!":WAIT :PRINT"TIME=";T:GOTO 10

 このゲームを私が定めた動作cpsの分類にに当てはめるための改造点を記すとします。これらの改造を行い実際に動作cpsが変わることでキー反応がどのように変わるかを各自判断してください。
 ちなみにこのゲームでは1秒当たり10回のキー入力(これは私が高校時代にクラスで計測した平均レベルの速度)で7.6秒のタイムが出るように調整されています。(ただし、10cpsより遅いものは秒10回のキー入力に理論上対応できないのでご容赦願います)
 なるべく正確に表記されている動作cpsになるようFOR〜NEXTで調整してあるもののキー割り込みの関係でキーを押している時は15%程度遅くなるためにこれはキーを押していない状態の動作cpsとなっています。
 キー割り込みについてはこのワンポイントテクニックを参照してください。

◎45cps(上記リストのデフォ状態)

◎20cps(連射が必要なゲームの推奨速度)
35行に FOR I=1TO 20:NEXT を追加
40行の T=T+0.04 を T=T+0.1 に変更

◎10cps(すばやい操作が必要なアクション系ゲームの推奨速度)
35行に FOR I=1TO 59:NEXT を追加
40行の T=T+0.04 を T=T+0.2 に変更

◎5cps(あまり速度を要求しないアクション系ゲームの推奨速度)
35行に FOR I=1TO 138:NEXT を追加
40行の T=T+0.04 を T=T+0.4 に変更

◎3cps(あまり速度を要求しないアクション系ゲームの必須速度)
35行に FOR I=1TO 239:NEXT を追加
40行の T=T+0.04 を T=T+0.66 に変更

◎2cps(アクション系ゲームにはあまり適さない速度)
35行に FOR I=1TO 366:NEXT を追加
40行の T=T+0.04 を T=T+1 に変更

 1秒当たり10回のキー入力判定を行うならば10cpsが必須ですが10cpsで秒10回のキー入力が可能な人のキー入力判定を完全に行えるかというとそうではなく秒10回ジャスト(タイミング良く0.1秒に1回)の入力ができないと入力判定漏れが多発してしまうために10cpsでは十分とはいえません。(メインルーチン1回につき複数のキー判定を行えばキー判定漏れは改善できるものの複数入れるとその分遅くなってしまうためにそれは考慮しないものとする)
 上記リストを微調整してみれば分かりますが15〜20cpsくらいあれば大ざっぱに言えば秒10回の入力速度にほとんど対応可能になっていると思います。つまり、キー入力判定漏れを無くすには想定されるキー入力速度の1.5〜2倍を見積もる必要があるということになります。秒3回位のキー入力速度を想定したそれほど高速なキー入力を要求していないゲームであれば5cpsあればキー反応が悪いと感じることはあまり無くなるというわけです。タイピングゲームを作り秒5回のキー入力を想定すれば、キー入力判定漏れをほぼ無くすには7〜10cpsくらいの動作速度が必要となってきます。

 さて、多少ゲームの処理速度が遅くても実はゲームによっては改善可能なのですが最も簡単なのはキャラ移動型のアクション系ゲームの場合メインルーチン1回の移動量を増やすというものです。1回の移動量が2倍ならば同じ時間での移動量は2倍になるため見掛け上の移動速度が2倍速になりますからね。
 ということで速度と移動量の関係が分かるようなサンプルプログラムを用意しました。このプログラムではメインルーチンの動作速度によって移動量を変化させているために同じ時間ではどれも同じ移動量になるように調整しています。なお「移動速度が遅い」というのと「動作速度が遅い」というのは全く別問題なのですがこの意味がよく分からないという人は下記の変更点においてZの値を1.5倍とか2倍とかにしてもらえれば分かるようになるかもしれません。(動作速度は速くならないけど移動速度だけは速くなるため)

《 サンプル2 》
[8][2][4][6]を押してインベーダーもどきのキャラを上下左右に動かすプログラム
10 CLS :X=99:Y=20:Z=3
20 K=VAL INKEY$
30 V=(K=4)-(K=6):W=(K=8)-(K=2)
40 GCURSOR (X,Y):GPRINT "0000000000000000"
50 X=X+V*Z:Y=Y+W*Z
60 GCURSOR (X,Y):GPRINT "D87C363C3C367CD8"
70 FOR I=1TO 8:NEXT
80 GOTO 20

このサンプルも各動作cpsに合うような改造点を記しておきます。
◎10cps(デフォ状態:すばやい操作が必要なアクション系ゲームの推奨速度)

◎5cps(あまり速度を要求しないアクション系ゲームの推奨速度)
10行の Z=3 を Z=6 に変更
70行を FOR I=1TO 87:NEXT に変更

◎3cps(あまり速度を要求しないアクション系ゲームの必須速度)
10行の Z=3 を Z=10 に変更
70行を FOR I=1TO 188:NEXT に変更

◎2cps(アクション系ゲームにはあまり適さない速度)
10行の Z=3 を Z=15 に変更
70行を FOR I=1TO 315:NEXT に変更

 この変更点にしたがって上記プログラムを実行させれば動作cpsが遅いとキー反応が悪くなるとはいえ単位時間内に移動する量は変わっていないという意味が分かると思います。(どれも画面の端から端まで移動するのに約10秒弱かかる)
 キー反応についてはサンプル1の50m走ほどは高速なものは要求されてないために10cpsでもあまり不満なく動作していると感じてもらえるのではないでしょうか。ただし、動作cpsが遅くなればなるほど1回の移動量を増やさざるを得ないために動作が大ざっぱになってしまうという問題があります。場合によっては当たり判定が変わってしまう(見た目では接触してないのに敵に当たったことになったり、当たり判定の方法が悪ければ敵や障害物を素通りしてしまう)という問題点を抱えることもあるかもしれません。

 上下左右に移動するだけであれば次に押すキーというのは迷う必要がないために秒5回以上(つまり反応速度0.2秒以下)で簡単に押せるわけなので3cps以下の速度ならば指がちゃんと反応できているのにゲーム側の処理が追いつかないということが多発しそれによってプレイヤーは「キー反応が悪い」と感じるようになっていくわけです。(私はアクション系のゲームを作る場合は10cpsの達成を目指し、悪くても7〜8cpsを実現しようとしており、実際にシュプール2では7.7cps、ピーチバレーでは8cpsが実現できている)
 あと移動などで同じキーを押しっぱなしにする場合はキー入力(入力判定)から実際に移動(表示)までのタイムラグが大きい場合(動作cpsが極端に低い場合)も「キー反応が悪い」と感じる原因となりがちです。これは1回の移動量を多くして時間当たりの移動量を速くしても改善が可能な問題ではないため「(a)処理の高速化を行い目的の処理速度に達するようにする。」「(b)処理の簡略化を行い目的の処理速度に達するようにする。」「(c)プレイヤーに思考する余地を与え処理速度の遅さが目立たないようにする。」のような改善策を行う必要があるかもしれません。



 さて、上記サンプルプログラムを入力して実際に確かめてみれば分かると思いますが20cpsだと普通にキーを連射してもそれにほとんど追従でき10cpsならば素早い指の動作を行ってもほとんどそれに追従でき5cpsならばゆっくり操作していけばキー反応の悪さは気にならないレベルだという私の動作推奨速度というのがどの程度の基準で言っているのかが分かってもらえたと思います。
 必須ラインについては本来ならば特に基準を設けるところではないですがポケコンBASICで推奨ラインを満たすのは難しいために書いておきました。問題なのはアクション系のゲームにおける下限を3cpsにするか2cpsにするかという点ですが、どっちにしろ十分な速度ではないので厳密に考えなくても良いと思います。やはり、可能な限り推奨レベルに近い速度は欲しいですからね。

 ということで、私の基準であれば素早い操作を要求するゲームは10cps、そうでなければ5cpsくらいの動作速度ならば「キー反応が悪い」とプレイヤーからの不満の声がほとんど出なくなると予想されるとはいえこの基準もあくまで「ポケコンBASIC」であるということによって妥協されているのです。想定されるキー入力速度と同じ動作cps(秒5回のキー入力を想定したゲームで5cps)だとキー判定漏れが多くなる(場合によっては半数程度取りこぼしてしまうこともある)ためにその1.5〜2倍の動作速度にすることによって入力判定の取りこぼしを減らすことが可能になります。
 しかし、素早く押した場合には「離している時間>押している時間」になっていることも多くそのため想定されるキー入力速度の2倍の速度が得られても9割程度キー入力判定が可能できるというだけであって判定の100%取りこぼしがなくなるわけではありません。実際は100%を達成するには3倍以上は欲しいところです。(3倍あれば押している時間が3分の1であってもそれに判定可能だけど私の実験では素早く押していても4割前後の時間はキーを押した状態になっているため100%判定可能になる)

 さらに、BASICだからということを考慮して素早い操作を秒5回の入力速度で私は考えていますが一般レベル(市販ゲームレベル)で考えると秒10回くらいを想定すべきであってそれに対して100%判定の取りこぼしを無くすには最低でも30cps以上必要となりこれはポケコンBASICでは実現がかなり困難になります。市販ゲームが最低30fps(キー判定を秒間30回行う)というのはそういう面では理にかなっているわけですね。(とはいえ秒間30回でもコアなゲーマーであれば不満に感じるので秒間60回行うゲームが大半ですが)

 とはいうもののポケコンBASICでは動作速度30cpsどころか10cpsのゲームでさえ作るのはかなり難しいと思われます。その理由は上記のサンプル2を見ての通り、8×8のキャラを1つ動作させる場合、ウェイト無しでも11cps(メインルーチン1回あたり約90m秒)となっているためにゲームとして成立させる(複数のキャラクタをメインルーチン内で移動させる)のであればその数分の1まで動作速度が落ちてしまうためです。何せPC-E500系の場合は8×8ドットのキャラをGPRINTで表示するだけで20m秒かかってしまうわけですからね。(移動するには消去が必要なためさらに20m秒かかり、その移動ルーチンも別途必要になるために1キャラ動作させるだけで90m秒もかかってしまうことになる)
 そうなれば10cpsどころか5cpsも危うくなってしまいます。

 アクション系のゲームならば私が最低でも欲しいと感じている速度である5cps(メインルーチン1回あたり200m秒)を実現しようとしてもキャラ1つ移動させるのに90m秒かかってしまうわけだから2つのキャラを移動させるのが精一杯になってしまいます。かといって、5cpsを切るとどこまで妥協できるかというレベルになってくるためその妥協ラインの個人差によっては制作者本人は我慢できてもそれが我慢できず「キー反応が悪い」と不満の声を漏らすプレイヤーも出てくる可能性が高くなってきます。(中には制作者本人も我慢できず「キー反応が悪い」と記しているゲームもあるわけですしね)

 アクション系のゲームは動作が速いに越したことはないけど動作自体は遅くても面白いゲームというのも確かにあります。ゲームデザインがそのようにされていれば多少キー反応が悪くても妥協は可能だと思います。しかし、反射神経を競うようなゲーム(例えばもぐら叩き系のゲームなど)はキーを押したけど反応しないというのは致命的な問題点と成りかねないために動作速度のアップなどにより改善をすべきだと私は思います。
 特にポケコンBASICの場合その遅さから「ゲームデザインを優先する」か「動作速度を優先する」かという二者選択が迫られることも多々ありますが、個人的には速度よりもゲームデザインを優先して制作を開始すべきだと思います。というのも、よほどゲームを作り慣れていて、なおかつどんな処理をすればどの程度の時間がかかるということを把握しているような人であればあらかじめ「ポケコンBASICにおいて5cpsの動作速度で実現できるようなゲーム内容」というものを考えていけばいいわけですが、そんな奇特な人はほとんど居ないと思われるために「動作速度を優先する」というのはやろうと思ってもなかなかできないし、速度を気にするあまり内容がないようなゲームになりかねないからです。

 しかし、ある程度ゲームのアウトラインが完成した場合、それが自分の妥協できる範囲内の動作速度かどうかの判断はすべきだと思います。仮に動作が遅くても制作者自身がキー反応が悪さがゲームデザインでカバーできていると判断できれば問題ありません。しかし、制作者とプレイヤーの基準に大きなずれがあった場合のことを考えればここで書いた客観基準(というか正確には私の基準)である動作cpsを参考にしていただければと思っています。
 確かにゲームでは内容(ゲーム性やゲームデザイン)が重要ですが、アクション系のゲームでは動作速度も重要となってきますからね。

 とはいうものの求められている動作cpsよりも遅い場合はゲーム内容を変更しない限りは何らかの形で単純に動作速度を速くするしかありません。それには部分的(もしくは全部)にマシン語を使うか、プログラムそのものを見直しBASICの範囲内での高速化を施すという方法があります。速度を最優先するのであればマシン語がベストですが、BASICプログラムの高速化であればBASICを理解している人すべてにおいて有効となるというメリットがあります。おちゃめくらぶの方でもポピュラーなテクニックであるフォント書き換えを始めそれを応用したOPASなどいくつか使用方法を書いていますが、やはり動作速度の高速化を効率よく狙うにはボトルネックが何かということを把握しておく必要があるため簡単なことではありません。
 表示がボトルネックになっておりフォント書き換えOPASが有効活用可能であればそれを使うことで動作速度の向上が図れるのですが、そうでなければ他のテクニックが必要になりますからね。それにOPASは最初からOPASを使うことを想定してゲームデザインしないと有効活用は難しいため速度向上率は大きいものの使いどころを考える必要があるということで各種テクニックの使い分けが重要になってきます。その辺の高速化テクニックについてはこちらで詳しく書いていますので参考にしてください。


RETURN/ RETURN *MAIN inserted by FC2 system