質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

Q&A

2回答

4398閲覧

作成したexeファイルと同じフォルダに画像がないと表示されない...

MZK_0104

総合スコア23

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

DirectX

DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

0グッド

0クリップ

投稿2020/05/26 07:47

編集2020/05/26 08:21

画像を表示するコードは書けるようになったのですが、
ビルドして、Debugフォルダにexeを作ってダブルクリックで実行すると、
何も表示されません。
しかしそのexeファイルと同じ場所に表示したい画像を入れると、普通に表示されます。

###どのようにすれば、exeファイルと同じ場所に画像、曲がなくてもVisualStudioにて実行したときのように動作するのでしょうか?

言葉で表現するのが難しいですが、
VisualStudioにてビルドして作成された、exeファイルをダブルクリックして起動すると
真っ暗な画面で、音楽も画像も表示されません。
ただ、そのexeファイルがあるフォルダに画像と音楽を入れると正常に動作します。

現在のコードは、本文に入らないので、こちらに記しておきます。

ソースファイル.txt

ゲームを作る際、勝手にゲーム内の素材を使われたら困るので、誰か教えてください

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/05/26 07:57

なにをおしえるんでしょうか。 あなたの書いたコードがそういう動作になっているだけ、です
MZK_0104

2020/05/26 08:00

現在、質問を編集しました。 ご回答よろしくお願いします!
y_waiwai

2020/05/26 08:06

どういう動作をさせたいのか詳しく書きましょう。 VisualStudioにて実行したときのように動作、といわれても、他人にはさっぱりわかりません また、コードを提示しましょう。答えようがないです
MZK_0104

2020/05/26 08:10

わかりました。 しばしお待ちを...
SHOMI

2020/05/26 08:30

・リソースとして実行ファイル内に取り込む ・パスワードをかけた圧縮ファイルor独自フォーマットのファイルとして一緒に置き、起動時にメモリ上で展開する どちらもやろうと思えばファイル抽出できますが…
MZK_0104

2020/05/26 08:36

リソースとして実行ファイル内に取り込むにはどうすればいいですか?
dodox86

2020/05/26 08:57 編集

提示のソースコードの内容に比べて質問者さんが問題の原因に思い至らないことに少し違和感を覚えていますが、もとのコードはご自分で作られたのではないでしょうか。単に、エラー自体はCreateFileでのファイルオープン失敗が原因のはずです。Visual Studioでのデバッグ実行時のカレントディレクトリはプロジェクトファイルのある場所だったはずです。「カレントディレクトリ」と言う言葉は分かりますか。
dodox86

2020/05/26 09:00

なお、ソースコードを別のサイトに貼るのは(禁止されている訳ではないですが)あまり推奨される行為ではないと思います。そのサイトが閉じてしまった場合、質問の内容が分断され、意味不明になってしまいます。あまり強く言うつもりはないですが。。。
MZK_0104

2020/05/26 09:12

すみません... ソースファイルについては以後気を付けます。 そして、カレントディレクトリというのはc++ファイルがおかれている場所で会っていますでしょうか?
dodox86

2020/05/26 09:17

近いですが、この場合はちょっと違います。実行ファイルを実行したときのカレントディレクトリ、です。例えばコマンドプロンプトで C:\> C:\program\test1.exe のように実行したとき、実行ファイル自体はC:\program下にありますが、カレントディレクトリはC:\(C:ドライブのルートディレクトリ)になります。コードでいえばCreateFileで CreateFile(L"Sound01.wav", となっているので、「実行時のカレントディレクトリ\Sound01.wav」を開こうとしているかたちです。
dodox86

2020/05/26 09:19

ビルドして、実行ファイルができ、実行するときにはC++ファイルの在りかはもう関係ありません。
MZK_0104

2020/05/26 13:50

実行ファイルはできたのですが、 ダブルクリックで実行しようとしても、 DirectXが初期化されて終わるだけです... 実行ファイルと同じ場所に、 プログラム内で読み込んだり表示したりした画像を入れれば 表示されるのですが...
dodox86

2020/05/26 13:59

話が最初に戻りますが、 > 実行ファイルと同じ場所に、プログラム内で読み込んだり表示したりした画像を入れれば ダブルクリックして実行したときのカレントディレクトリは、その実行ファイルと同じ場所になるためです。そういうプログラムのコードになっています。 より正確に言うと、今のコードは、常にカレントディレクトリにSound01.wavファイルが無いと動きません。そうしないためには、絶対PATH指定にしないといけません。もしそのあたりの事情がまだ良く理解できないのであれば、実行ファイルと同じ場所に配置することを仕様とするとか、C:\DATA ディレクトリ(フォルダー)に配置する、とかを制限事項とするように作るしかありません。
SHOMI

2020/05/26 14:03

>実行ファイルと同じ場所に、プログラム内で読み込んだり表示したりした画像を入れれば表示されるのですが... dodox86さんが2020/05/26 18:17~18:19で書かれているのは実行ファイル内に画像を取り込む方法ではありませんよ?
SHOMI

2020/05/26 14:06

リソース埋め込みのほうの話でしたら、ファイル読み込み部分をLoadResource()やLoadBitmap()でロードするように書き換えないとだめですよ?
MZK_0104

2020/05/26 14:07

そうなんですね!! ちょっと待っててください...
dodox86

2020/05/26 14:11 編集

ああ、[2020/05/26 17:36]の質問者さんのコメント > リソースとして実行ファイル内に取り込むにはどうすればいいですか? の後に当初の質問自体に対する私のコメントが入ってしまったので、混乱させてしまいましたね。これは失礼しました。しばらく黙っておきます。
MZK_0104

2020/05/26 14:19

LoadBitMapで、ファイルを読み込めたのはいいですが、 D3DXCreateTextureFromFileExで読み込むことができません。 当然(?)といえば当然ですが、 LPCWSTRはHBITMAPと互換性がありませんだそうです。
SHOMI

2020/05/26 14:25 編集

CreateTextureならAPIリファレンスを見れば D3DXCreateTextureFromFileInMemory()や D3DXCreateTextureFromFileInMemoryEx()、D3DXCreateTextureFromResource()、D3DXCreateTextureFromResourceEx()なんてのがありますが…
SHOMI

2020/05/26 14:27

dodox86さん 情報提供していただけること自体はありがたいことなので、そこまで気になさらなくてもよいのでは…
dodox86

2020/05/26 14:42

SHOMIさん、フォローありがとうございます。いえ、卑下しているというほどのことではなく、今現在質問者さんはリソースに格納して取り出すようにすることに注力されたいようでしたので、色んなアイディアを複数人から言われることの混乱を避けるため、当初の質問へのコメントを続けることは控えようと思った訳です。
MZK_0104

2020/05/27 08:34

無事、D3DXCreateTextureFromResoueceEx(); で画像を読み込んだのですが、スプライトに画像を表示できませんでした。 表示の仕方は、 g_pSprite->Draw( g_pTexture01, &rcMw, &centerMw, &positionMw, 0xFFFFFFFF ); こんな感じです。
SHOMI

2020/06/13 15:54

D3DXCreateTextureFromFileEx()の時のコードもそうですが、D3DXCreateTextureFromResourceEx()のエラーチェックをしていますか? 間違いなく読み込めているのでしょうか? D3D_OKが返っていますか?
guest

回答2

0

基本形

  1. 実行ファイルに一体化する。

 一番大雑把な方法。バグ発見時の修正が面倒。
0. リソースを一つの暗号ファイル(リソースプールファイル)にする
都度都度必要な範囲を読み込んで復号
0. ファイルごとに個別暗号化する
個別に読み込んだ後に暗号解除(復号)

複合形

当該リソースを実行ファイル中のリソース領域から検索。存在しなければ、リソースプールファイルから検索。存在しなければ個別暗号ファイルから検索する。(さらに、「それでも存在しなければ、未暗号の個別ファイルから検索する」という形をとるとデバッグしやすい)

投稿2020/05/27 07:47

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ゲームを作る際、勝手にゲーム内の素材を使われたら困るので、誰か教えてください

本当に知りたいのはこちらということですかね?
追記・修正依頼にあるように画像・音声をEXEに埋め込むという方法もありますが、一般的なゲームで良く見られるのは、独自フォーマットに変換したり、独自圧縮ファイルで一纏めにするというパターンです。
(ファイル解析したらそれでも分かりますが、カジュアルなコピーは防げます)
0. 独自形式ファイルをメモリ上に読み込む(or 独自圧縮ファイルからファイルデータを取り出す)
0. 読み込んだ独自データをBMP、PCM等の生データに変換する
0. DirectXオブジェクトに画像、音声を読み込む

という手順になるかと思われますが、当然これらの関数は自分で考えて作成する必要があります。
単純な方法なら、ヘッダを少し書き換えて既存ソフトで読めなくして、プログラム側でヘッダを正常に書き戻した一時ファイルを作成して読み込むという手もありますが、本格的にやるなら、既存ファイルの構造を熟知した上で独自ファイル構造を考えたり、圧縮⇒復元など高度な知識が必要になります。

既存のゲームライブラリやミドルウェアは、ゲーム開発者がゲーム開発だけに注力できるように、こういった部分までサポートしています。どこまでを自分でやるかは、ある程度妥協する必要があります。

投稿2020/05/27 01:59

編集2020/05/27 02:15
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SHOMI

2020/05/27 05:33

独自フォーマットについても提案しましたが、まずはリソースでやってみることにした模様です。
退会済みユーザー

退会済みユーザー

2020/05/27 07:03

なるほど、軽く流し読みしていたので見落としていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問