トップページ > 記事閲覧
ファイル分割
名前:おっさん 日時: 2023/12/30 11:02

Gazou.cpp #include "DxLib.h" void Gazou() { int GrHandle; int ItemHandle; // 画像の読み込み GrHandle = LoadGraph("C:/Shooting/Player.bmp"); ItemHandle = LoadGraph("C:/Shooting/item.jpg"); // 3D空間上に画像を描画 DrawBillboard3D(VGet(30.0f, 240.0f, 100.0f), 0.5f, 0.5f, 120.0f, 0.0f, GrHandle, TRUE); // 3D空間上に画像を描画 DrawBillboard3D(VGet(620.0f, 240.0f, 100.0f), 0.5f, 0.01f, 120.0f, 0.0f, ItemHandle, TRUE); } Gazou.h void Gazou(); main.cpp #include "DxLib.h" #include "Gazou.h" int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定 while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) { void Gazou(); } DxLib_End(); // DXライブラリ終了処理 return 0; } 実行はできるのですが画像が表示されません。解決方法わかる方がいましたらご教授お願いします。
メンテ

Page: 1 | 2 |

Re: ファイル分割 ( No.13 )
名前:求道者(旧通りすがり) 日時:2024/05/18 23:39

#include "DxLib.h" // // プレイヤー操作+キャラ、変数描画 // void Payer(void) { //上下左右パンチキックジャンプの操作 int PadInput; //ローカル変数を定義 PadInput = GetJoypadInputState(DX_INPUT_KEY_PAD1); //ジョイパッドを検出する if (PadInput & PAD_INPUT_LEFT)@x -= 3, @anime = @WALK; if (PadInput & PAD_INPUT_UP)@y -= 3, @anime = @WALK; if (PadInput & PAD_INPUT_RIGHT)@x += 3, @anime = @WALK; if (PadInput & PAD_INPUT_DOWN)@y += 3, @anime = @WALK; //アニメーション @count++; if (@count >= 5 )@anime = 1; if (@count >= 10)@anime = 2; if (@count >= 15)@anime = 3; if (@count >= 20)@anime = 4; if (@count >= 25)@anime = 5; if (@count >= 30)@anime = 6, count = 0; DrawGraph(@x, @y, @iGHandle[@0anime], TRUE); // 白色の値を取得 int Cr = GetColor(255, 255, 255); // 文字列の描画 DrawFormatString(250, 240, Cr, "変数x=%d 変数y=%d", @x, @y); } // // プレイヤー初期設定変数+素材ロード // void PayerIni(void) { //初期設定変数 char KeyBuf[256]; int x = 200; int y = 300; int anime = 0; int count = 0; int time = 0; int STAND = 0; int WALK = 0; int iGHandle[100]; // キー入力初期設定 GetHitKeyStateAll(KeyBuf); // キャラロード SetTransColor(0, 255, 255); LoadDivGraph("player.bmp", 24, 7, 4, 48, 48, iGHandle); } ↑Player.cpp ↓WinMain.cpp #include "DxLib.h" // // WIN MAIN関数 // void Player(void); void PlayerIni(void); // int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { // ウインドウモードに変更 ChangeWindowMode(TRUE); // DXライブラリ初期化。出来なかったら終了 if (DxLib_Init() == -1)return -1; // プレイヤー初期変数設定 PlayerIni(); // 画面モードのセット SetGraphMode(640, 480, 16); // 勝手に終了しない様にする SetWindowUserCloseEnableFlag(FALSE); // ループ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { // 画面を初期化する ClearDrawScreen(); // プレイヤー描画 Player(); // 裏画面の内容を表画面に反映させる ScreenFlip(); }; DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }; ↑WinMain.cpp すいません、一向にC++が覚えられないのでC言語に移行して 数日経ちますが、出来ません。 トークンがエラーと出ます。そもそもC言語の分割コンパイルって簡単にはどうやるんでしょうか。
メンテ
Re: ファイル分割 ( No.14 )
名前:管理人 日時:2024/05/19 00:29

> トークンがエラーと出ます。 変数名に @ は使えませんので、@anime や @count など変数名の先頭に @ が入っている変数の @ を消して anime count x y にすれば『トークンがエラー』は無くなります よろしければお試しください > そもそもC言語の分割コンパイルって簡単にはどうやるんでしょうか。 開発環境によって分割コンパイルの仕方は異なりますが、お使いの開発環境は何でしょうか? ( Visual Studio、Xcode、C++ Builder など )
メンテ
Re: ファイル分割 ( No.15 )
名前:求道者(旧通りすがり) 日時:2024/05/19 01:29

>あっぷるさん この情報量の限られた中で、貴重なサンプル作成どうもありがとうございました。 いつもここの掲示板には勇気を貰ったり楽しさを貰ったり嬉しいです。 管理人さんもいつもありがとうございます。 それと、このソースのエラーを全部貼りますね。 上のソースが内容の全部です。言語はC言語でやってます。 コード 説明 抑制状態 E0020 識別子 "x" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "WALK" が定義されていません E0020 識別子 "y" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "WALK" が定義されていません E0020 識別子 "x" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "WALK" が定義されていません E0020 識別子 "y" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "WALK" が定義されていません E0020 識別子 "count" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "anime" が定義されていません E0020 識別子 "x" が定義されていません E0020 識別子 "y" が定義されていません E0020 識別子 "iGHandle" が定義されていません E2486 ユーザー定義のリテラル演算子が見つかりません C2065 'x': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'WALK': 定義されていない識別子です。 C2065 'y': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'WALK': 定義されていない識別子です。 C2065 'x': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'WALK': 定義されていない識別子です。 C2065 'y': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'WALK': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'anime': 定義されていない識別子です。 C2065 'count': 定義されていない識別子です。 C2065 'x': 定義されていない識別子です。 C2065 'y': 定義されていない識別子です。 C2065 'iGHandle': 定義されていない識別子です。 C3688 リテラル サフィックス 'anime' が無効です。リテラル演算子またはリテラル演算子テンプレート 'operator ""anime' が見つかりません C2065 'x': 定義されていない識別子です。 C2065 'y': 定義されていない識別子です。
メンテ
Re: ファイル分割 ( No.16 )
名前:求道者(旧通りすがり) 日時:2024/05/19 01:33

#include "DxLib.h" //グローバル変数 char KeyBuf[256]; int x = 200; int y = 300; int anime = 0; int count = 0; int time = 0; int STAND = 0; int WALK = 0; int iGHandle[100]; // // プレイヤー操作+キャラ、変数描画 // void Payer(void) { //上下左右パンチキックジャンプの操作 int PadInput; //ローカル変数を定義 PadInput = GetJoypadInputState(DX_INPUT_KEY_PAD1); //ジョイパッドを検出する if (PadInput & PAD_INPUT_LEFT)x -= 3, anime = WALK; if (PadInput & PAD_INPUT_UP)y -= 3, anime = WALK; if (PadInput & PAD_INPUT_RIGHT)x += 3, anime = WALK; if (PadInput & PAD_INPUT_DOWN)y += 3, anime = WALK; //アニメーション count++; if (count >= 5)anime = 1; if (count >= 10)anime = 2; if (count >= 15)anime = 3; if (count >= 20)anime = 4; if (count >= 25)anime = 5; if (count >= 30)anime = 6, count = 0; DrawGraph(x, y, iGHandle[anime], TRUE); // 白色の値を取得 int Cr = GetColor(255, 255, 255); // 文字列の描画 DrawFormatString(250, 240, Cr, "変数x=%d 変数y=%d", x, y); } // // プレイヤー初期設定変数+素材ロード // void PayerIni(void) { // キー入力初期設定 GetHitKeyStateAll(KeyBuf); // キャラロード SetTransColor(0, 255, 255); LoadDivGraph("player.bmp", 24, 7, 4, 48, 48, iGHandle); } #include "DxLib.h" // // WIN MAIN関数 // void Player(void); void PlayerIni(void); // int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { // ウインドウモードに変更 ChangeWindowMode(TRUE); // DXライブラリ初期化。出来なかったら終了 if (DxLib_Init() == -1)return -1; // プレイヤー初期変数設定 PlayerIni(); // 画面モードのセット SetGraphMode(640, 480, 16); // 勝手に終了しない様にする SetWindowUserCloseEnableFlag(FALSE); // ループ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { // 画面を初期化する ClearDrawScreen(); // プレイヤー描画 Player(); // 裏画面の内容を表画面に反映させる ScreenFlip(); }; DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }; コード 説明 抑制状態 LNK1120 2 件の未解決の外部参照 LNK2019 未解決の外部シンボル "void __cdecl Player(void)" (?Player@@YAXXZ) が関数 WinMain で参照されました LNK2019 未解決の外部シンボル "void __cdecl PlayerIni(void)" (?PlayerIni@@YAXXZ) が関数 WinMain で参照されました 夜に直そうとしたら、3つエラー出ました。 上のはグローバル変数にすることで回避しました。
メンテ
Re: ファイル分割 ( No.17 )
名前:求道者(旧通りすがり) 日時:2024/05/19 04:48

開発環境は Visual Studio 2022 です。無料版です。
メンテ
Re: ファイル分割 ( No.18 )
名前:求道者(旧通りすがり) 日時:2024/05/19 07:15

#include "DxLib.h" class Player { private: char KeyBuf[256]; int x; int y; int anime; int count; int time; int STAND; int WALK; int iGHandle[100]; public: void PlayerKeyInput(void); void PlayerIni(void); }pl; ...Player.h #pragma once #include "DxLib.h" #include "Player.h" // // プレイヤー操作+キャラ、変数描画 // void Player::PlayerKeyInput() { //上下左右パンチキックジャンプの操作 int PadInput; //ローカル変数を定義 PadInput = GetJoypadInputState(DX_INPUT_KEY_PAD1); //ジョイパッドを検出する if (PadInput & PAD_INPUT_LEFT)x -= 3, anime = WALK; if (PadInput & PAD_INPUT_UP)y -= 3, anime = WALK; if (PadInput & PAD_INPUT_RIGHT)x += 3, anime = WALK; if (PadInput & PAD_INPUT_DOWN)y += 3, anime = WALK; //アニメーション count++; if (count >= 5)anime = 1; if (count >= 10)anime = 2; if (count >= 15)anime = 3; if (count >= 20)anime = 4; if (count >= 25)anime = 5; if (count >= 30)anime = 6, count = 0; DrawGraph(x, y, iGHandle[anime], TRUE); // 白色の値を取得 int Cr = GetColor(255, 255, 255); // 文字列の描画 DrawFormatString(250, 240, Cr, "変数x=%d 変数y=%d", x, y); } // // プレイヤー初期設定変数+素材ロード // void Player::PlayerIni() { // キー入力初期設定 GetHitKeyStateAll(KeyBuf); // キャラロード SetTransColor(0, 255, 255); LoadDivGraph("player.bmp", 24, 7, 4, 48, 48, iGHandle); } ...Player.cpp #pragma once #include "DxLib.h" #include "Player.h" // // WIN MAIN関数 // int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { // クラス定義 Player pl; // ウインドウモードに変更 ChangeWindowMode(TRUE); // DXライブラリ初期化。出来なかったら終了 if (DxLib_Init() == -1)return -1; // プレイヤー初期変数設定 pl.PlayerIni(); // 画面モードのセット SetGraphMode(640, 480, 16); // 勝手に終了しない様にする SetWindowUserCloseEnableFlag(FALSE); // ループ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { // 画面を初期化する ClearDrawScreen(); // プレイヤー描画 pl.PlayerKeyInput(); // 裏画面の内容を表画面に反映させる ScreenFlip(); }; DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }; ...WinMain.cpp コード 説明 抑制状態 LNK2005 "class Player pl" (?pl@@3VPlayer@@A) は既に Player.obj で定義されています。 LNK1169 1 つ以上の複数回定義されているシンボルが見つかりました。 何とかここまで来ました。いまのエラーはこの二つです。 検証お願いします。次々すいません。
メンテ
Re: ファイル分割 ( No.19 )
名前:管理人 日時:2024/05/19 15:27

Visual Studio 2022 とのことで了解しました > 何とかここまで来ました。いまのエラーはこの二つです。 > 検証お願いします。次々すいません。 C言語には class はありませんが、C言語ではなく C++ に戻されたのでしょうか?
メンテ
Re: ファイル分割 ( No.20 )
名前:求道者 日時:2024/05/19 16:01

C++にしてみました。ローベルのC++というサイトを見ました。 もしアドバイスのしようがなかったらすいません、一から頑張ります。
メンテ
Re: ファイル分割 ( No.21 )
名前:求道者 日時:2024/05/19 16:46

C++とCはどっちが良いでしょうか。 C++の場合の上のソースの分割ファイルと C言語の場合の上のソースの分割ファイルを 教えて貰えるとうれしいです。 皆さん、いつもありがとうございます。
メンテ
Re: ファイル分割 ( No.22 )
名前:求道者 日時:2024/05/19 17:06

それと、これはもうオンライン教室とか入った方がいいでしょうか。 自分にはまだ早かったのかな。
メンテ
Re: ファイル分割 ( No.23 )
名前:管理人 日時:2024/05/20 01:21

> C++にしてみました。ローベルのC++というサイトを見ました。 了解です > C++とCはどっちが良いでしょうか。 ゲーム関係でしたらC++の方が良いかと思います ゲーム業界でCで開発している会社はごく僅かですので… > C++の場合の上のソースの分割ファイルと > C言語の場合の上のソースの分割ファイルを > 教えて貰えるとうれしいです。 C++もCも同じです Visual Studio 2022 での作業としては複数の cpp や c のファイルを一つの プロジェクトに含めた時点で『分割コンパイル』の状態となります > それと、これはもうオンライン教室とか入った方がいいでしょうか。 私は1〜2日に1回くらいしかご返信できませんので、 ちゃんとしたサポートを受けられたい場合はオンライン教室や 専門学校等に入った方が良いと思います > LNK2005 "class Player pl" (?pl@@3VPlayer@@A) は既に Player.obj で定義されています。 Player.h に class Player { private: char KeyBuf[256]; int x; int y; int anime; int count; int time; int STAND; int WALK; int iGHandle[100]; public: void PlayerKeyInput(void); void PlayerIni(void); }pl; ↑ このように書かれていますが、最後の }pl; が原因です ます class の定義の最後の }pl; の pl を無くして、 代わりに一つ下の行に extern Player pl; を追加します class Player { private: char KeyBuf[256]; int x; int y; int anime; int count; int time; int STAND; int WALK; int iGHandle[100]; public: void PlayerKeyInput(void); void PlayerIni(void); }; extern Player pl; そして Player.cpp の #include "Player.h" の一つ下の行に Player pl; を追加します #include "Player.h" Player pl; これでエラーは無くなりますので、よろしければお試しください ( 何故これでエラーが無くなるのかについては extern について調べてみてください 『C++ 分割コンパイル extern』←こちらのキーワードで検索すると幾つも解説ページが見つかります )
メンテ
Re: ファイル分割 ( No.24 )
名前:求道者 日時:2024/05/20 19:55

初心者は初心者講座で勉強しよう、と言ってくれなくて本当にうれしいです! ありがとうございます、丁寧なサンプルと返事まで! それとあと一つ質問ですが、キャラ画像が表示されません! 変数の文字列は表示されます。なぜでしょうか。 次から次から本当に失礼しております。
メンテ
Re: ファイル分割 ( No.25 )
名前:あっぷる 日時:2024/05/21 12:09

とりあえず、LoadDivGraph()文の戻り値を受け取っておいた方が良いてすね いわゆるエラー処理です ここでエラーが返るようであれば、イメージファイルのパスが間違ってて ファイルが読めていない可能性があります int err = LoadDivGraph(〜);
メンテ
Re: ファイル分割 ( No.26 )
名前:管理人 日時:2024/05/21 23:47

player.bmp はプロジェクトファイル( 拡張子が vcxproj のファイル )があるフォルダにありますでしょうか?
メンテ
Re: ファイル分割 ( No.27 )
名前:求道者 日時:2024/05/24 22:30

>あっぷるさん その一行を全体に組み込むにはどうしたら良いでしょうか。 いつもありがとうございます。 >管理人さん 画像ファイルはその階層にあります。でも表示されませんでした。 上のソースを使うと、歩いているキャラと X、Yの位置が表示されるはずです。
メンテ
Re: ファイル分割 ( No.28 )
名前:管理人 日時:2024/05/25 00:56

> 画像ファイルはその階層にあります。 了解です ではplayer.bmpのサイズは横336ピクセル、縦192ピクセル以上ありますでしょうか? ( LoadDivGraph("player.bmp", 24, 7, 4, 48, 48, iGHandle) の場合、横7×48、縦4×48以上のサイズである必要があります )
メンテ
Re: ファイル分割 ( No.29 )
名前:求道者 日時:2024/05/25 20:20

あります!縦にながーいです……。 と言うか全然画像はピッタリサイズじゃありません。
メンテ
Re: ファイル分割 ( No.30 )
名前:管理人 日時:2024/05/26 03:12

> あります!縦にながーいです……。 >  > と言うか全然画像はピッタリサイズじゃありません。 了解です ではプログラム実行時に作成される Log.txt を見てみてください ( Log.txt はプロジェクトファイルがあるフォルダに作成されます ) 恐らく LoadDivGraph が失敗している原因が出力されているのではないかと思います
メンテ
Re: ファイル分割 ( No.31 )
名前:管理人 日時:2024/05/31 13:27

すみません、メールを見落としていました Log.txt を拝見する限りでは LoadDivGraph は成功しているようです なので、改めてソースを拝見したところ原因が分かりました pl.PlayerIni(); の後に SetGraphMode を実行されていますが、SetGraphMode を使用すると それまでに LoadGraph や LoadDivGraph で読み込んでいたグラフィックハンドルが全て削除されます なので、pl.PlayerIni(); の中で LoadDivGraph で読み込まれたグラフィックハンドルは SetGraphMode(640,480,16); の実行によって削除されてしまっているため、画像が表示されなかったのです というわけで、SetGraphMode(640,480,16); を DxLib_Init() の呼び出し前の行に移動していただければ 画像が表示されるようになると思います #pragma once #include "DxLib.h" #include "Player.h" // // WIN MAIN関数 // int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nShowCmd) { // クラス定義 Player pl; // ウインドウモードに変更 ChangeWindowMode(TRUE); // 画面モードのセット SetGraphMode(640, 480, 16); // DXライブラリ初期化。出来なかったら終了 if (DxLib_Init() == -1)return -1; // プレイヤー初期変数設定 pl.PlayerIni(); // 勝手に終了しない様にする SetWindowUserCloseEnableFlag(FALSE); // ループ while (ProcessMessage() == 0 && CheckHitKey(KEY_INPUT_ESCAPE) == 0) { // 画面を初期化する ClearDrawScreen(); // プレイヤー描画 pl.PlayerKeyInput(); // 裏画面の内容を表画面に反映させる ScreenFlip(); }; DxLib_End(); // DXライブラリ使用の終了処理 return 0; // ソフトの終了 }; よろしければお試しください m(_ _)m
メンテ
Re: ファイル分割 ( No.32 )
名前:求道者 日時:2024/06/02 20:37

画像が表示されました! やっと出ました、楽しいですね! これで基礎の骨組みが出来るので、あまり良く分かって無い C++でゲーム開発が出来ます! このスレッドの皆さん、ありがとうございました。 次回ももし質問がありましたら是非お願いします。
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存