素人プログラマーの日常

効率の良いコード、美しいコードなんて書けません。

絶対パスと相対パス

完成しました。もう少し実行結果を試してからリリースビルドします。

今回はファイルを選択するダイアログを使用していますが、これってほんとに便利!自分でファイル探索すると保障がないわけですが、細かいことはダイアログでやってくれるので、安心・安全・簡単です。ちなみに前にも書きましたが GetOpenFileName 関数です。これとほぼ同じ動作をする GetSaveFileName 関数も使いました。こちらは書込み用のダイアログを開いてくれます。



で、今回はちょっと苦労しました。一度地形データをファイルに書き出してそれを読み込んだとき、画像をうまく読み込んでくれないというものです。画像のフルパスもデータとして保存していますが、その読書きの際に文字列の終端の "\0" が無くなってオーバーフローしているか、あるいは "\0" があることで邪魔をしているのかといったことかな~、なんて考えていましたが、そうではありませんでした。

最初にサンプル画像を読み込ませますが、その画像は相対パスで指定しています。今回でいうなら、ビューワ本体の置いてあるフォルダから "img/land.png" です。このサンプル画像でデータを保存すると、相対パスのまま保存されます。それが間違いの元だったんですね。でも本体の入ったフォルダはどこに置かれるかわからないので、相対パスにするしかありません。これがどういう問題を引き起こすのか?ダイアログを開いたときにカレントディレクトリ(作業フォルダ)が開いた場所に移動します。相対パスはカレントディレクトリからのパスになるので、ビューワ本体の置いてあるフォルダから移動してしまうと、そこに画像はありませんから不具合になります。

絶対パス相対パス

絶対パス:D(CやEの場合も)ドライブからのパス

例 "D:isometricview/img/land.png"

相対パス:上の例でカレントディレクトリが isometricview だったときの相対パス

例 "img/land.png"



この対処法としては、それほど難しいことはしません。ダイアログを開いた後でカレントディレクトリを本体のフォルダに戻してやるだけです。    GetCurrentDirectory 関数で最初のカレントディレクトリの場所を絶対パスで記憶させ、SetCurrentDirectory 関数で指定した場所に戻せます。



カレントディレクトリという概念は、まったくの初心者では気付けないところです。私も危うくお手上げするところでした。以前HSPでランチャーを作った際に少しだけそのあたりをいじっていたので、ギリギリ記憶の片隅に残っていました(笑)。とはいえ、新しい画像を読み込んでそのデータを保存した後にフォルダごと画像を移動したりすると画像を読み込めなくなるので、そこまでの対処は出来ません。なので、画像が読み込めないときは、もう一度画像だけを読み込むようにメッセージを表示させています。