ここまでの冒険を記録しますか?スマートフォン用の表示で見るここまでの冒険を記録しますか?長岡技大ソフトウェア開発サークルの開発ブログこの広告は、90日以上更新していないブログに表示しています。書き手:肥田野DXライブラリでRPGのベースになるマップ画面やデータ管理などのあれこれの制作に挑戦してみます。RPGとして完成する保証はありませんが、途中経過だけでも参考になれば幸いです。この連載は前回までの内容を理解していることを前提に進めていきます。第11回はいつまでたっても終わらないのか。全ての謎は、11(前)でプロジェクトの構成を一新したときに、致命的な不具合が発生していたことに起因します。こちらが該当箇所になります。false;//一応ここも既に11(前)を試した方は気づいたかもしれませんが、プレイヤーが移動をしてもカメラが追随しなくなっていました。ControlクラスからviewX、viewYを更新しても、どこかのタイミングで0に戻されているように思えました。C++の常識的に、複数のファイルをまたぐグローバル変数は推奨されていません。その理由がまさに、こういう不具合の温床になるからなんですね。これらの変数はどこで宣言するのかといいますと、Function.cppの関数内にします。false;}関数の中で変数を宣言すると、通常は関数の処理が終わると同時に破棄されてしまいます。それを破棄させずにずっと使えるようにするのが、修飾子staticです。viewX;と書いた場合、メモリ領域にviewXのスペースが確保され、プログラムが終了するまで解放されずに残ります。関数が2回3回と呼び出されても、上書きして宣言し直されることはありませんよ。これでカメラ位置保存用の変数viewX,viewYが出来上がりました。この値を更新するために、CameraDraw関数に二つ引数を追加しています。changeVXとchangeVYです。ここで「えっ」と思った方は鋭いですね。CameraDrawに引き数を増やしたということは、CharaクラスやMapクラスで呼び出している部分も全て書き換えなければならないのかと。意外にも答えはNOなんです。(こういう事態に備えているわけではないと思いますが)C++にはとても便利な機能が標準装備されているんです。CameraDrawをプロトタイプ宣言しているFunction.hを見てみましょう。PushKey(int);なんと、引数のあとに直接値を代入していますね。このブログでは初めて扱う処理になります。これはデフォルト引数というもので、関数の呼び出し時に引数が指定された場合はその値を、指定されなかった場合はデフォルトで定めた値を引数として利用します。前回までControlクラスのAll関数で行っていた「プレイヤーが画面真ん中より右に移動しようとしたら、viewXの値を増やしてカメラに追いかけさせる」という処理を、PlayerクラスのView関数にデフォルト引数を指定することで直接行うことができるということです。言い換えると、これまでControlクラスがプレイヤーキャラの動きを監視して、カメラを移動させる必要があったらグローバル変数を書き換えることでCameraDraw関数に指示していたのを、今回からプレイヤーキャラ自身が画面のどの辺りにいるのかを判断し、必要に応じてカメラに「○○ピクセルずれたから追いかけてきて」と支持できるようになったということです。今のように宣言部と実装部に関数が分かれている場合、デフォルト引数の「=○○」はどちらか片方でしか指定できません。両方に書いたらどちらを取ればいいのか分からなくなりますしね。普通の引数とデフォルト引数が混在している場合、デフォルト引数は右の方にまとめて書くというルールもあります。changeVX;気をつけなければいけないのがこの一文で、viewXを常に更新してしまうと、Mapオブジェクトがこの関数を呼び出した時に0で上書きされてしまい、本末転倒になります。viewXを書き換えるのはchangeVXに値が指定された時だけにする必要があるということですね。あとついでですが、PushKeyに使っていたグローバル変数hitAnyKeyも、PushKeyのstatic変数にしています。それでは、今回の変更に従って修正された部分を列挙します。引数を追加しなければならないPlayer.cppから。View(map);//引数を入れるのを忘れずに}実は前回解説しないでさらっと流してしまったのですが、派生したクラス(この場合はPlayer)が基底クラスと同じ名前の関数を定義した場合、player->Viewと呼び出した場合、派生クラスの関数が実行されます。これを関数のオーバーライドといい、クラスを継承する場面では非常によく使われます。似たような言葉に「オーバーロード」というものがありますが、これは全く異なる物ですので区別してください。派生したクラスが上書きをするのでオーバー「ライド(乗る)」ですよ。次に、Player.hも上げておきます。デフォルト引数が追加されているので確認してください。eMap);};また、Control.cppにあった処理もなくして、よりスッキリしました。i=0;i<3;i++)map[i]->FrontView();}そして最後に、忘れてはいけないのがdefine.hでしたね。グローバル変数がなくなって本当にマクロ定義だけになりました。640さて、これで無事にカメラがプレイヤーを追ってくれるようになったと思います。次回はついに村人の実装です。こちらは既にソースコードが出来上がっているので、更新まではそう時間はかからないと思います。参加グループプログラミングはてなブログをはじめよう!NUT_SoftwareDevelopperさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。