2019年02月25日

スマホで動画を楽しむ

裏編です。
さてさて。PCで動画を見ようというのは昔の話。
PSPで動画を見るのは、少し前の話。
今では、スマホでいつでもどこでも動画を見れる時代になりました。
技術の進歩は素晴らしい!
さて、そこでポイントとなるのが、スマホに入れるための動画の変換。
今のスマホは便利なもので、動画を転送すると、スマホのほうで自動的に変換してくれますが、やっぱりあらかじめ変換しておいたほうが楽ですよね。
ということで、今回はスマホ用に動画を変化してくれるツールを二本、紹介しようと思います。

【Free MP4 Video Converter】
DVDVideoSoftのFree MP4 Video Converterは、DVDVideoSoft Free Studioのツールの一つです。
このソフトでは、iPhoneやiPad用に動画を変換することができます。(MOV形式)
また、「サイズの小さいファイル」で変換すれば、Androidでも見ることができます。
無料版の場合はロゴがついてしまいますが、ワンクリックで変換してくれて、とても使いやすいソフトの一つです。
me-1902-01.JPG

【すーぱー連続動画変換】
すーぱー連続動画変換は、mira 氏作の、フリーソフトの変換ソフトです。
このすーぱー連続動画変換の売りは、その対応方式。
iPhoneはもちろん、Xperiaやタブレット、PSP用に変換でき、さらには動画から音声を抜き出す、なんてこともできます。
また、変換形式は今後追加予定という将来性の高さ。自分でINIを編集すれば、自分で変換設定を作ることもできます。
変換は動画をウィンドウにドラッグ&ドロップするだけ、さらにロゴもつかない、と、とても使いやすいソフトです。

me-1902-02.JPG

【最後に】
ここまで二本の変換ソフトを紹介してきましたが、どうでしたでしょうか?
スマホ向けの動画変換に関してなら、すーぱー連続動画変換に軍配が上がりますが、DVDVideoSoft Free StudioにはFree MP4 Video Converter以外にも、色々なメディア関係のツールがあるので、色々動画や音声関係の作業をするなら、こちらのほうがいいかもしれません。
何にしても、自分にあったものを選ぶのが一番ですよね。
これらのツールを使って、スマホでの動画ライフを過ごしましょう!



※次の更新は、3月4日、『バックアップお助けソフトを紹介!』の予定です。お楽しみに!
posted by 裏編 at 09:38| PCメディア情報 | 更新情報をチェックする

2019年02月21日

レトロゲーレビュー・怒【1986年・SNK・アーケード・FC他】

re1902-00.JPG


※本記事では、ゲームの紹介のために、ゲームの画像を引用させていただいております。
 ここに掲載されている画像は、問題があれば削除いたします。
 また、ここに掲載されている画像の二次使用を禁じます。
 なお、掲載されている画像は、全てファミコン版のものです。

あいつらにもこんなころがありました

「行くぜクラーク!」、「おうラルフ!」といえば、KOF(キング・オブ・ファイターズ)シリーズに登場する常連チーム、通称『怒』チームのメンバー、ラルフとクラークのお決まりのあいさつであるが、このコンビが初登場したゲームが、この『怒』である。(コンビの初登場、という点に注目。ラルフはこれ以前に、『T・A・N・K』というゲームにて初登場した)
そしてこの『怒』というゲームがどんなゲームかというのは……それはこれから説明していくのでお楽しみに。

気分はベトナム戦争!

さて、この『怒』は、シューティングゲームである。だが、ただのシューティングゲームではない。
プレイヤーは、マイキャラであるラルフ(2Pはクラーク)を8方向に操作し、次から次へと襲い来る敵を倒していきながら先に進むのだ。
ラルフ(orクラーク)の武器は、コマンドーなどのミリタリー映画に出てくるような重機関銃と手榴弾の二つ。
これらを駆使して、戦場を駆け抜け、突破していくのだ。

re1902-01.JPG
▲ 自分の武器は重機関銃と手榴弾のみ。 この二つを駆使して、戦場を生き抜け!

もちろん、二人の武器はこれだけではない。途中で戦車を奪うこともできる。
戦車は硬いし、砲弾は強いし、とても強力だぞ!

re1902-02.JPG
▲ 戦車を奪え!

戦場は新機軸だ!

さて、怒は、この当時ながら、かなりの新機軸が盛り込まれたゲームであった。
まずは、二人同時プレイが可能なこと。
この『怒』では、1Pがラルフ、2Pがクラークを操作して、同時にプレイできるようになっていたのだ。
今となっては、珍しくはないかもしれないが、1986年当時は、まだ同時プレイできるゲームは多くなかったのではなかろうかと思う。

そしてもうひとつは、ゲームのシステムが、擬似人工知能のように、プレイヤーの腕前に応じて、難易度を調整してくる、ということだ。
その擬似人工知能のシステムは、『クラウムズ』と呼ばれ、短時間で多くの敵を倒したプレイヤーは上手、逆にいつまで経っても少しも敵を倒せないプレイヤーは下手と判断し、それによって敵の出現のしかた、アイテムの場所や数などをコントロールするようになっているということだ。(Wikipediaより)

このように、ゲームシステムがプレイヤーの腕前を判断して、それに応じて難易度が変化するなんてゲームは、当時としては珍しいのではないだろうか。まさに、新機軸と言ってもいいだろう。

行くぜクラーク! おうラルフ!

さて、では最後に、スクリーンショットを交えて、ゲームの進行を見てみよう。

re1902-03.JPG
▲ ゲームスタート! 戦いは、輸送機が不時着したところから始まるゾ。

re1902-04.JPG
▲ 敵のトーチカだ! 機関銃は効かないので、手榴弾で爆破せよ!

re1902-05.JPG
▲ 戦車だ! 進行がとても楽になるので、なんとしても奪取だ!

re1902-06.JPG
▲ 無事戦車を奪取! 弾は強いし、敵の機関銃ではびくともしないし、とても楽チンだぜ!

re1902-07.JPG
▲ 敵の戦車と遭遇! こいつの弾には、さすがにやられるので、気をつけて撃破だ!

re1902-08.JPG
▲ 地雷だ! これにはさすがの戦車も無事ではすまない。移動するので、うまくかわして進め!

=-=-=-=-=-=-=-=-=-=-
次の更新は、2月25日、『スマホで動画を楽しむ』の予定です。お楽しみに!

posted by 裏編 at 09:49| その他のゲーム情報 | 更新情報をチェックする

2019年02月18日

プチコンゲームプログラミング講座~第四回「シューティングゲームを作ろう」

文 プチ太郎 氏
=-=-=-=-=-=-=-=-=-=-
 やっとそれらしい中規模ゲームまで行きましたが、アクションゲームの王道であるシューティングゲーム(以下STG)が出ていませんでしたね。STGと言っても固定画面、縦スクロール、横スクロール、全方向などいろいろあります。縦STGはプチコンのサンプルゲームでGAME4がありますが、今回はGAME4と違う、縦スクロールSTGを作りましょう!

教材プログラム 4 「クセヴィオウス」(ファイル名「KOZA04」)

koz04_s1.jpg

★ ゲームの内容と説明 ★
 ゲーム名は、いい名前が思いつかなかったもので…wあと本来こうしたゲームは沢山の敵・地上物・爆弾・ボスキャラがいますが、今回もプログラムや説明文が肥大化するので見合わせました。と言っても改造・追加しやすいよう作ってあるので、今後これにさらに追加したサンプルゲームを発表できるかも知れません。
 今回から動かすキャラが非常に増えたため、これまでの連載で少しだけ使ったスプライトや配列変数を、沢山使っています。スプライトをゲームで使うためには、ただ表示させたりキャラを変えるだけでなく、「現在どのスプライトキャラがどこでどんな状況になっているか」常時管理・判定しなければいけません。それにはSPVAR関数やOUTオプションの方法もあるんですが、ここではスプライトと同じ条件で配列変数を設定する方法です。
 一般にスプライト管理番号はゼロから始まり、1,2…と増えていく。配列の添字もゼロから1,2…そう!スプライトと配列で、番号を一致させてしまえばいいのです。これが初心者には簡単でいいと思います。ここではこれを「S番号」と書きますが、連載での便宜上のもので、プチコンユーザやプログラマーで広く使われている訳ではありません。
 ヘビゲームでは動きが簡単なので、キャラを16ドットずつ動かしましたが、今回は微妙なズレが生死を分けるSTGなので、1ドット単位の移動や当たり判定です。

koz04_p1.jpg

★ プログラムの説明1:初期設定とメインループ ★
 まずS番号は、何番から何番までどのキャラに使うか決める事が重要です。全部の配置を実数にすると修正が面倒なので、各キャラの数を自機(変数A_MAX)・自弾(同じくB)・敵(C)・敵弾(D)で設定して、各キャラのS番号の最初(●_s)と最後(●_E)を求めています。ちと面倒に見えるが、紙に書いて計算して行くなどして、それぞれのS番号を復習してみましょう。その下のFORループを使った8~10行は、キャラの種類ごとの初期設定です。9行目のSPCOLの「8,16」は、当たり判定の範囲を横8ドットx縦16ドットに変えるという意味です。
 S番号で使う配列は以下の通り。あまり使っていない配列もありますが、将来プログラムを拡張しやすくするためです。
・SS[i]→キャラの状態(ステータスのS)
・SX[i],SY[i]→縦横の座標
・SVX[i],SVY[i]→移動方向(ベクトルのV)
@INIT1 リプレイ時の初期設定
@INIT2 ミスした後の初期設定
 自機のデザインは、現代型縦シューにふさわしいデザインが三種類あったので、22行でRND関数により、三種類をランダムに出してみました。S番号[0]は前述通り自機の初期設定です。OPは当時のナムコゲーを真似てみました。24行で字を出した後、変数OPをゼロにして、短時間で演奏終了するBGMPLAY 4を流しています。次の@LOOPでOPがゼロ(まだ1になってない)かつBGMCHKがゼロ(BGMが終わって聞こえなくなった)ら、OPのフラグを1にして先の字を消し、エンドレスのBGMPLAY 25を演奏します。
@LOOP メインループ
 28行目は本来ゲームに必要ありませんが、学習用に入れてみました。自機がスタートする毎に、左上に出る変数CNは、WAITが1進むたびに蓄積するカウントが表示されます。また以前ちょっと書いた、OUTという予約語が登場しています。これは通常の命令が「命令語 パラメータ1,パラメータ2,パラメータ3…」と書く所を、「命令語 パラメータ1 OUT パラメータ2,パラメータ3…」と書くと、パラメータ1(この場合はBG0番)のパラメータ2やパラメータ3の今の値が読み込める…というものです。使える所しか使えないオプションですが、うまく使えば便利です。ここで読み込んだ値はBG0のX座標とY座標で、これを右に表示しています。これでスタート時からどこまで進んだかが判るでしょう。「どこまで進んだら、どこでどんなザコ敵やボスキャラが出てくるか」は、この数値で判定すればいい訳です。自機の当たり判定は@ATARIの結果、SS[0]が1なら@DEADに★行きます。

★ プログラムの説明2:定義済み処理(メインキャラ) ★
 STGやアクションゲームのキャラの処理は、一般に4つか5つ。「自機」「自機の攻撃手段(ここでは弾)」「敵」「敵の攻撃手段」「特殊なキャラ(ボスなど)」です。今回特殊なキャラはいないので4つとなります。
@LOOPでの自機移動のタイミング
 @JIKIから@TEKITAMAまで4種類のキャラを、順番にGOSUBで呼び出します。S番号が複数ある時の処理は前述したが、「GOSUBで呼ぶ前の@LOOPにFORを書く」「GOSUBで呼んだ後の各処理にFORを書く」のうち、今回は前者を使っています。
@JIKI 自機
 自機は1キャラだけなのでFORは使いません。基本はヘビゲームと同じで、十字ボタンの方向に動くだけですが、違う点はBUTTON関数の取得です。以前の「IF BUTTONの値==値」だと「他のボタンを押さず、この値のボタンだけ押した」ですが、今回の「IF (BUTTONの値 AND 値)」だと「他のボタンを押しているにかかわらず、この値のボタンも押した」になります。これだと右と上どちらも押したと判定すれば、右上に進めます。この辺は次回説明します。
 STGではここから下、自機以外は動かし方の基本が同じです。
1.画面に出ていない(このプログラムではSS[i]が-1)なら、条件によっては画面に出す。
2.現在画面に出ていて、敵や味方に当たったり、画面の端に入っていたら、必要に応じて消えた処理をする。
3.でなければ座標を進め、新たな座標のキャラを表示する。
@JIKITAMA 自弾
 49行から新規出現処理。SS[i]が-1かつBUTTON()関数でAボタンが押されていると、自機の座標変数などを自弾に移し、発射音を出します。変数S_Tは、一発撃つとしばらくカウントをとって時間待ちをする連射間隔用です(値の変え方は後述)。58行から出現ずみの処理。59行では自弾が画面上まで行ったら、@S_LOSTで消しています。60行では1ドット上に進めて、SPOFSで表示し直しています。
自弾が敵に当たった時の処理
 ここから当たり判定の説明です。文字(CHRCHK)・グラフィック(GSPOIT)・BG(BGGET)は「その座標に何が描かれているか」だけでいいが、スプライトは各自がバラバラに動くので、似た命令が使えません。当たり判定は「SPHITSP式」「座標式」の二種類のうち、ここでは前者を使っています。
 SPCOLはこの処理に必ず必要な命令で、当たり判定を出したい双方のスプライトに、同じマスク(16進数で同じ場所のビットに1を入れる)を設定します。今回は「自弾が敵に当たった」の判定用に、一番右の"00000001"だけ使っています。この辺は複雑なので次回説明します。マスクを0に戻している処理があるのは、爆発中もマスクに当たり判定があると、余計に当たってしまうバグの防止です。
 63~68行が当たり判定のメイン処理で、SPHITSP(当てられたか判定したいS番号,当たってきたS番号の最初,当たってきたS番号の最後)関数の結果をSHに入れます。これが当たってないと-1、当たったらそのS番号を返すので、64行から当たった時の処理をします。65~66行でスプライトを爆発のアニメーションに変え、SS[SH]に-1より小さな値を入れて、爆風表示中はこのS番号で新規出現しないようにしています。
@TEKI 敵
 74行から新規出現処理。SS[i]が-1で、かつ64分の1の確率で出しています。出現位置(SX,SY)は上、移動は左右(SVX)がどっちか斜めで、下(SVY)は2ドット。79~80行は前述の爆発中の時間待ち処理で、SS[i]が-1になるまで+1し続けています。現在出現中のフラグは現在、SS[i]を0にしているが、1や2でも動く様になっています。これは何種類も敵を出した時、出現条件や移動方法の違いを「ELSEIF SS[i]==…」で区別するためです。82行は@JIKITAMAと同じで画面外に行った時の消滅処理、 85~86行で移動と当たり判定をしています。
@TEKITAMA 敵弾
 敵弾は「敵の処理中に出す」「敵弾の処理中に出す」の二種類あり、今回は後者つまりここでなく@TEKIの87~88行でやっています。S2で敵弾のS変数をランダムに出し「OPが1(OPが終わっている)」「SS[S2]が-1」「発射元の敵が画面内の一定の座標か」「もう一度乱数で確率を出す」の条件に会えば、敵Sの位置から敵弾S2を出現させます。出現していたら下に3ドットずつ移動。@S_LOSTや@ATARIは後述します。

koz04_s2.jpg

★ プログラムの説明3:定義済み処理(その他) ★
@ATARI 座標式の当たり判定
 座標式は「インベーダー」の砲台やUFOのように、キャラの数や存在位置が限られていると、処理が簡単という長所があります。ここでは自機の[0]とGOSUBで呼び出す前のS番号で、縦座標と横座標の差を求め、どちらも15未満だったら自機に当たったので、SS[0]に「死亡フラグ」を立てています。ABS関数は本来「絶対値」を出すもので、数にマイナスがあると無条件で除去しますが、このように座標による当たり判定には最適です。
@S_LOST 特定のスプライトを画面から消す
 変数S2に入ったS番号をSPOFSで画面外左上にやり、SS[i]を-1にして、画面上も変数上も消します。
@RESET ゲームに必要な画面を一端クリア
 110行はヘビゲームと同じ。111行はS番号全て@S_LOSTで消しています。BGOFSはBYから15を引いた、つまり背景の下から15行目までBGをずらす処理。BGANIMは順に「0=BG0番の」「"XY"=座標を」「-600=600fps(10秒間)を一気になく徐々に」「0,0=BG座標0,0まで変えて」「0=無限に繰り変えす」という処理です。SPANIMやBGANIMは、こうして無限に同じことを繰り返す処理が可能で、同じ働きをする別の命令(ここではBGOFS)を使うと、ピタリと止まります。
@SCR 「DEF JI」を使って、スコアやハイスコアを表示
DEF JI LX,LY,L$ BGを使って文字列を表示
@DEAD ミスおよびゲームオーバー
 127~128行は@JIKITAMAと割と同じです。129行ではまたOUTを使ってBG座標を取得し、すぐOUT無しのBGOFSで実行して、BGANIMを止めています。アクションゲームは三回死ぬとゲームオーバーが基本なので、@INIT1でZAN=3と設定し、130行でマイナス1して、ZANがまだゼロでなければ@INIT2に戻り、でなければゲームオーバーです。

koz04_p2.jpg.jpg

@MAP 背景のDATAを読み込んでBGの0番に描く
 一度しか使わないが行数が多く、全部前に置くとリストが見にくい場合は、このようにサブルーチンにして後ろに置きます。
 変数BYは地形に使うBGの縦長さで、BGSCREEN命令で0番BGのサイズを変えています。140行は第二回で説明した、各画面表示要素の高さ設定で、これがそのままだったり設定を間違えると、例えば地上物の下を飛行機がくぐったりしますwそこでFORループでBGの0(背景)を16、1を12、2を8、3(文字表示)を4の高さに設定しています。(ただし1と2は現時点で未使用)。GPRIOも第二回にあった通り。
 141行はBG0をまず全部森(103番)で埋めていますが、ゼビウスのように最初と最後の15行ずつは森にしているので、森の一行下である15を変数Yに入れ、一行描くたびに155行でYを増やしています。
 142~157行はいよいよ、BGに不規則なBGキャラを入れる方法です。プチコンのエディタを使い、BGSAVEで保存する方法もありますが、今回は「ドラクエ1」の街などのようにあまり広くないので、DATAで書いたものを読むという、簡単な方法です。
 READでA$を読み込み、このA$に一番最後の""(文字列長さゼロ)が入るまで(ここでは20行分)REPEATを続けます。FOR X=0 TO 24とMID$関数で、A$の0番目から24番目までの文字列を一つずつ求めてB$に代入します。そして147~152行で、このB$が何という文字列であるかで、BG番号をCに代入し、153行のBGPUTで書き込んでいます。実は146~153行は、配列を使うと短くなるので、できる人は考えてみて下さい。本当はゼビウスに似せたかったのですが、時間が間に合わず、HSPのサンプル用フリーゲームである「シューティングゲーム」の地形画像ファイルを参考にしました(^^;

★ プログラムの修正方法 ★
 処理が簡単なSTGは、パラメータ修正で難易度を変えやすい点も特徴です。最大数やスピードなど修正できる所を並べてみました。いろいろいぢって、一喜一憂してみて下さい。なお数は1以上でないと、エラーになるものがあります。

koz04_e1.jpg

(第五回につづく なお次回はサンプルゲームを一回お休みして、コンピュータには欠かせない二進数・10進数・16進数と、プログラミングへの応用についてお話します)
★今回の教材プログラムは、サーバにアップしてありますので、サーバからダウンロードしてご覧下さい。
公開キー  :D8EA4CD(連載が進んで新しい教材プログラムが追加されると、公開キーも変わります。この公開キーでダウンロード出来ない場合は、連載の一番新しい回の公開キーをご利用下さい)
プロジェクト:KOZA
ファイル名 :上の教材プログラムの見出しをご覧下さい。
=-=-=-=-=-=-=-=-=-=-
※次の更新は、2月21日、『レトロゲーレビュー』の予定です。お楽しみに!

2019年02月15日

師匠TのチャレンジARSゲーム!~第拾弐回・暗黒星雲(その3)【1983年・T&E SOFT】

うむ、師匠Tである! いよいよ暗黒星雲の攻略も佳境!
果たしてスターアーサーの行く手に現れるのはなんなのか、注目じゃ!

【本編】
ars1902-01.JPG
さぁ、いよいよジャミルの採掘基地がある暗黒星雲に突入じゃ!
基地のある場所は、ジャミルの傭兵をやっていたルナに聞けばわかるぞ!
※じゃがここで注意! 実はPC-6001版では一部の質問に答えを返してくれないのじゃ。
 なので、PC-6001版では、直接基地のある星の名前ジークについて聞いて、位置を教えてもらわなければならぬぞ。
 (空白の部分を反転させてみるがよい)

ars1902-02.JPG
惑星に到着じゃ。この星には何が待っているのであろうか?
持っていくものの選択は慎重にな。

ars1902-03.JPG
クリプトンを出たぞ。さぁ、目指すはジャミルの採掘基地じゃ!

ars1902-04.JPG
進んでいきなり、分かれ道に出たぞ。さて、どちらに行くか……

ars1902-05.JPG
ボブが蟻地獄にはまってしもうた! 何とか助けてやらなくては……。
捕まるものさえ差し出してやれば……

ars1902-06.JPG
次に現れたのはモンスターじゃ! どうすれば、先に進むことができるのか?

ars1902-07.JPG
次なる障害はレーザーバリアじゃ! そのまま先に進むとバリアにかかってやられてしまうぞ。
上がダメなら下から……?

ars1902-08.JPG
何もないように見えるが、注意せよ! ここは地雷原じゃ!
〇〇がいれば、地雷の位置をサーチしてくれるので、一つ一つ潰していくのじゃ!

ars1902-09.JPG
やっと地雷原を抜けて基地についたと思ったら、そこには警備ロボットが!
撃たれる前に撃て!

ars1902-10.JPG
今度は警備兵に見つかってしもうた!
奴の気を引くことができれば、逆転できるのじゃが……

ars1902-11.JPG
警備兵をどうにかして、エレベーターで地下へ。いよいよ決戦も近いぞ!

ars1902-12.JPG
エレベータが最下層につくと、そこにも警備兵が!
ここを切り抜けられるかどうかは、エレベータに乗る前の君の行動によって決まるぞ!

ars1902-13.JPG
基地の最深部に待ち構えていたのは、敵の大ボス・ジャミルの皇帝カセリア!
そして、奴の横にあるのは探し求めていたミステリウム!(レイソードの力を高める特殊物質じゃ)
じゃが、カセリアとスターアーサーの間には、バリアが張られていて、どうすることもできぬ。
うぬぬ、どうすれば……。
打開策は秘密。君自身の頭で考えるのじゃ!

果たしてこの後、スターアーサーを待つ展開は……

ここから先は、キミの目で確かめるのぢゃっ!!
健闘を祈っておるゾ!!

※このゲームの著作権は、T&E SOFT様にあります。
 この記事に使われている画像の二次使用を禁じます。



----------
次の更新は、2月18日。『プチコンゲームプログラミング講座』の予定です。お楽しみに!
posted by 裏編 at 12:42| チャレンジARS | 更新情報をチェックする

2019年02月12日

ActiveBasicとDXライブラリでゲームプログラミング!~第4回・分岐する骨組みを作ろう!

n88_reon.gif
玲音:どうもこんにちは! 玲音です。先に言っておくと、楓ちゃんを引きずり込んだ、なんてことはありませんので!

n88_kaede.gif
楓:あ、先手打たれちゃった。玲音先輩の後輩の楓です! 先輩、今日は何をするんですか?

n88_reon.gif
うん。今日は、前回話した通り、ゲームプログラムの骨格の部分を作っちゃおうと思います! それじゃさっそく、始めていきましょう!

n88_kaede.gif
はーい!

~一つの流れで、複数のシーンに飛ばすには?~

n88_reon.gif
さてさて。まずは、これが今までの講座で使っていた、プログラムの基本骨格だったね。

=-=-=-=-=-=-=-=-=-=-
#include "Dxlib.sbp"

''初期処理
dxChangeWindowMode(1)
dxDxLib_Init()
dxSetDrawScreen(DX_SCREEN_BACK)

Do
''画面をクリア
dxClearDrawScreen()

''何等かの処理

''画面に反映
dxScreenFlip()
''メッセージ処理
If dxProcessMessage() = -1 Then
Exit Do
End If
Loop

''後処理
dxDxLib_End()
End
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
はいっ。このDoとLoopの間、''何等かの処理、ってコメントの下に処理を書くんでしたよね。

n88_reon.gif
うん。でも、このまま使うとちょっと問題があるの。わかる?

n88_kaede.gif
問題、ですか? うーん……。

n88_reon.gif
今までは、キャラを動かしたり、文字を表示したりと、いわばゲームのプレイ中の部分だけを作っていたけど、実際のゲームには他にも色々なシーンがあるよね? タイトル画面とかクリア時のシーンとか、ゲームオーバーとか。

n88_kaede.gif
あっ、それはそうですね! それをどうするか、ですか。うーん……。

n88_reon.gif
ヒント。どのシーンでも、画面を描いて、それを反映させる、って処理は共通だよね? 違うのは描くのがタイトル画面か、それともゲームの背景やキャラか、ってだけで。

abdx1902-01.jpg

n88_kaede.gif
なるほど! ということは、何らかの方法で、タイトル画面を描く処理や、ゲーム中の画面を描く処理とかに分岐させればいいわけですねっ。こんな風に。

abdx1902-02.jpg

n88_reon.gif
うん、その通り! 具体的にどうするかは、これから解説するよ。

~Select Caseを使おう!~
n88_reon.gif
さてさて。その分岐させるために、変数とSelect Case文と、そしてサブプロシージャを使います。

n88_kaede.gif
変数はいわば、数や文字列をいれておく箱のようなものでしたよね。確か、使う前に、Dim命令であらかじめ宣言する必要があるんでしたっけ。こんな風に。

=-=-=-=-=-=-=-=-=-=-
Dim 変数の名前 As 変数の型

(例)
Dim hensu As Integer
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
それで、Select Caseはどんな文なんでしたっけ?

n88_reon.gif
うん。それは、指定した変数や式の内容によって、処理を分岐させる文だよ。このように使うの。

=-=-=-=-=-=-=-=-=-=-
Select Case 変数or式
Case 値1
 処理1
Case 値2
 処理2
……
End Select

(例)
Select Case hensu
Case 0
 dxDrawString(50, 40, "hensu=0", white)
Case 1
 dxDrawString(50, 40, "hensu=1", white)
Case 2
 dxDrawString(50, 40, "hensu=2", white)
End Select
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
この例だと、変数hensuが0のときは、Case 0の下の、dxDrawString(50, 40, "hensu=0", white)が実行されて、1のときは、Case 1の下の、dxDrawString(50, 40, "hensu=1", white)が実行されるんだよ。

n88_kaede.gif
なるほどっ。例えば、上の例で、0、1、2以外の値のときに分岐させる処理を作りたいときはどうするんですか?

n88_reon.gif
そのときは、Case Elseを使うんだよ。これを入れると、Case 〇で指定した数以外の場合は、このCase Elseの下の処理を実行するようになるの。

=-=-=-=-=-=-=-=-=-=-
Select Case hensu
Case 0
 dxDrawString(50, 40, "hensu=0", white)
Case 1
 dxDrawString(50, 40, "hensu=1", white)
Case 2
 dxDrawString(50, 40, "hensu=2", white)
Case Else
 dxDrawString(50, 40, "hensu=X", white)
End Select
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
上の例の場合なら、hensuが0、1、2以外の場合は、Case Elseの下のdxDrawString(50, 40, "hensu=X", white)が実行されるんだよ。

n88_kaede.gif
なるほどっ!

~サブプロシージャって何?~
n88_reon.gif
さてさて。次に行くね。サブプロシージャというのは、昔のBASICにあった、サブルーチンを発展したようなものだよ。
サブプロシージャは次のように書きます。

=-=-=-=-=-=-=-=-=-=-
Sub サブプロシージャ名(引数1 As 引数1の型, 引数2 As 引数2の型, ……)
実際の処理
End Sub
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
そして、呼び出すときはこのように書きます。
=-=-=-=-=-=-=-=-=-=-
サブプロシージャ名(引数1, 引数2……)
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
先輩っ。この引数ってなんですか?

n88_reon.gif
うん。それは、呼び出し元からサブプロシージャに渡す値のことだよ。例えば。

=-=-=-=-=-=-=-=-=-=-
Sub SubProc1(hiki1 As Integer, hiki2 As Integer)

End Sub

SubProc1(3, 5)
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
とすると、変数hiki1に3が、hiki2に5が入るの。そうそう。Subのところで指定した引数を入れる変数(例の場合だと、hiki1とhiki2)は、このサブプロシージャの中。具体的には、SubとEnd Subの間でしか使えないから気を付けてね。

abdx1902-03.jpg

n88_kaede.gif
はーいっ。

n88_reon.gif
さてさて。例にある通り、サブプロシージャを呼び出すと、該当するSubからEnd Subの間の処理が実行されます。そして、End Subまで実行したところで、元の処理に戻るよ。

abdx1902-04.jpg

n88_kaede.gif
なるほどっ。

n88_reon.gif
最後にもう一つ。今扱ったようなSubを使ったサブプロシージャでは、呼び出し元に処理結果を返すことはできないの。返したいときは、Subではなく、Functionを使うよ。Functionを使う場合は、このように書きます。

=-=-=-=-=-=-=-=-=-=-
Function サブプロシージャ名(引数1 As 引数1の型, 引数2 As 引数2の型, ……) As 戻り値の型

End Function
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
値を返すときは、サブプロシージャ名と同じ名前の変数に結果を入れてあげればOKだよ。こんな風にね。あ、この変数については、Dim命令で宣言する必要はないからね。それは、SubやFunctionのところで宣言する、引数を入れる変数についても同じ。

n88_kaede.gif
ふむふむ。

n88_reon.gif
そして、Functionのサブプロシージャは、それ自体を変数や関数のように使うことができるよ。だから、変数に代入したり、式に使ったりすることができるの。

=-=-=-=-=-=-=-=-=-=-
hensu1 = SubProc1(3, 5)
※hensu1に、SubProc1から返ってきた値を入れる

hensu2 = SubProc2(4) + 5
※hensu2に、SubProc2から返ってきた値に5を足したものを入れる
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
なるほど、わかりましたっ。

~骨格を作ろう!~
n88_reon.gif
さて、それではここまで説明してきた、変数とSelect Case、そしてサブプロシージャを使って、骨組みを作ってみましょう! どうすればいいかな?

n88_kaede.gif
はーい! シーンが切り替わるときに、変数にそのシーンを表す数を入れて、そしてSelect Caseで、その変数で分岐させて、それぞれの画面を描くサブプロシージャを呼び出せばいいんじゃないですか?

n88_reon.gif
はい、正解! それではやっていきましょう。最初に紹介した基本の骨組みに追加する形でやっていくからね。
さてさて。まずは、そのシーンを表す変数が必要だよね。#include "Dxlib.sbp"の下あたりに、次の文を入れてね。

=-=-=-=-=-=-=-=-=-
Dim scene As Integer
=-=-=-=-=-=-=-=-=-

n88_kaede.gif
このsceneという変数に、シーンを表す数を入れるんですねっ。

n88_reon.gif
そうだよ。さらにその下に次の文も入れましょう。

=-=-=-=-=-=-=-=-=-=-
Const TITLE = 0
Const GAME = 1
Const GAMEOVER = 2
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
先輩。このConstって文はなんですか?

n88_reon.gif
これは定数といって、簡単にいえば、単語と値を結びつけるものだよ。これをやっておくと、例えば、式でGAMEという単語を使うと、このGAMEという単語が1と同じ意味になるの。

abdx1902-05.jpg

n88_kaede.gif
なるほど。確かに、GAMEとかいう単語のほうがわかりやすいですよねっ。

n88_reon.gif
うん。さて、まずはゲーム開始時はタイトルだよね。なので、Doの直前に、次の一文をいれよう。

=-=-=-=-=-=-=-=-=-=-
scene = TITLE
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
さて、ここからいよいよ本番。''何らかの処理、ってコメントの下に、次のSelect Case文をいれましょう!

=-=-=-=-=-=-=-=-=-=-
Select Case scene
Case TITLE
  TitleProc()
Case GAME
GameProc()
Case GAMEOVER
  OverProc()
End Select
=-=-=-=-=-=-=-=-=-=-

n88_kaede.gif
変数sceneの値がTITLE(0)のときはTitleProc、GAME(1)のときはGameProc、そしてGAMEOVER(2)のときはOverProcのサブプロシージャを実行するわけですね。

n88_reon.gif
そうだよ。さて、そしたら、そのサブプロシージャも作っておかなきゃいけないよね。プログラムの一番最後に作っていきましょう。

=-=-=-=-=-=-=-=-=-=-
Sub TitleProc()

End Sub

Sub GameProc()

End Sub

Sub OverProc()

End Sub
=-=-=-=-=-=-=-=-=-=-

n88_reon.gif
これで完成だよ!

n88_kaede.gif
わーい!

n88_reon.gif
次回は、これにさらに追加して、タイトル画面やゲーム画面などを実際に表示させようと思います。お楽しみに!

n88_kaede.gif
次回も楽しみですっ! また次回~!



※次の更新は、2月15日、『師匠TのチャレンジARSゲーム!』の予定です。お楽しみに!