トップページ > 過去ログ > 記事閲覧
クラスのメンバ関数内での命令呼び出しについて
名前:akiyama 日時: 2007/06/08 17:44

はじめまして、どうしてもよく分からないエラーが発生したので質問します WinMain関数内でGetJoypadInputStateを呼び出して 移動処理を行った場合は、予定通り座標変数が更新されるのですが、 クラスのメンバ関数内で同じ命令を呼び出した場合 座標変数の初期化が有効になっていないのに加え、座標の更新のされ方も(例えば)1ずつ減少しなかったりなどの問題が発生します。 いろいろ考えられる原因を試してみたのですが、どうも解決しません。 あと、同様の処理で描画系統の関数を呼び出す場合画像のハンドルをどう指定すればいいのか分かりません。 あわせて、アドバイス等をよろしくお願いします。

Page: 1 |

Re: クラスのメンバ関数内での命令呼び出しについて ( No.1 )
名前:管理人 日時:2007/06/09 11:42

akiyamaさん始めまして、DXライブラリの管理人です。 エラーの原因については直接プログラムを拝見してみないと ちょっとご返答できそうにありません。 もし不都合がありませんでしたらakiyamaさんが作成中の プログラムを、プロジェクトごと圧縮して BQE00322(アットマーク)nifty.com まで送って頂けないでしょうか? > あと、同様の処理で描画系統の関数を呼び出す場合画像の > ハンドルをどう指定すればいいのか分かりません。  指定するというのは具体的にはどのようなことを指しているのでしょうか? 画像ハンドルはただの int型の数値ですので、画像ハンドル値を保存した 変数を関数に渡すだけなのですが・・・
Re: クラスのメンバ関数内での命令呼び出しについて ( No.2 )
名前:akiyama 日時:2007/06/09 17:30

ありがとうございます 具体的に言うと、変数のスコープ問題みたいなもので、画像読み込みした関数とは別のところで描画処理を行う場合にハンドルをどう指定するかということです データに関しては既に送信を完了していますので確認をお願いします。
Re: クラスのメンバ関数内での命令呼び出しについて ( No.3 )
名前:akiyama 日時:2007/06/10 23:28

再検証の結果、入力状態を読み取る変数をゼロに初期化することで、一応正常な動作ができるようになることがわかりました。 描画処理についてはまだうまく行かないようです。 検証のため、画像ハンドルの中身をテキスト表示してみたらメモリの番地らしき数字が出てきました LoadGraph命令を実行した関数と別のところでDrawGraph系を呼び出す際は ポインタとかを用いてそれを指定しなければならない ということになるのでしょうか? アドバイスをよろしくお願いします。 >管理人さん データはうまく送信できていたでしょうか? 駄目だった場合別のアドレスから再送信します
Re: クラスのメンバ関数内での命令呼び出しについて ( No.4 )
名前:管理人 日時:2007/06/13 10:31

akiyamaさんどうも、DXライブラリの管理人です。 メールは届いていないようです。申し訳ありませんがもう一度お送り下さい。 画像ハンドルはメモリアドレスではなく、画像ハンドルのポインタ配列の インデックスに画像ハンドルだと言うことを示すビットとエラー防止用の ビットが加わったものとなっています。 どのようにご説明すればよいのか分かりませんが、とりあえず画像を読み込む クラスと使うクラスを別々にしたサンプルプログラムを作成してみましたので、 宜しければご覧になってみて下さい。 ResourceName 配列の画像ファイル名を実際にある画像ファイル名に書き換えて 実行すると、画像が左右に動きつつ画面端に行くたびに画像が変わる、という プログラムになっています。 #include "DxLib.h" #define HANDLE_NUM (5) // 読み込む画像の配列 const char *ResourceName[HANDLE_NUM] = { "Cursor.bmp", "Chara.bmp", "Bom.bmp", "Sample.bmp", "Enemy.bmp", }; // 画像ハンドルを扱うクラス class Resource { public: Resource() { // 画像を読み込む for( int i = 0; i < HANDLE_NUM; i ++ ) Handle[i] = LoadGraph( ResourceName[i] ); } ~Resource() { // 画像を解放する for( int i = 0; i < HANDLE_NUM; i ++ ) DeleteGraph( Handle[i] ); } // 指定の画像ハンドルを取得する int GetHandle( int No ) { return Handle[No]; } private: int Handle[HANDLE_NUM]; }; // 実処理を行うクラス class Main { public: Main() { // 画像ハンドルを扱うクラスを作成 res = new Resource; x = 0; add = 8; image = 0; } ~Main() { // 画像ハンドルを扱うクラスを削除 delete res; } // 動作処理 void Frame( void ) { x += add; if( x < 0 || x > 640 ) { add = -add; image++; if( image == HANDLE_NUM ) image = 0; } } // 描画処理 void Render( void ) { DrawGraph( x, 0, res->GetHandle( image ), TRUE ); } private: int x, add, image; Resource *res; }; Main *mp; // WinMain 関数 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ); // 実処理を行うクラスを作成 mp = new Main; // メインループ while( ProcessMessage() == 0 && CheckHitKeyAll() == 0 ) { // 実処理を行うクラスの動作を行う mp->Frame(); // 画面をクリア ClearDrawScreen(); // 実処理を行うクラスの描画を行う mp->Render(); // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: クラスのメンバ関数内での命令呼び出しについて ( No.5 )
名前:akiyama 日時:2007/06/15 19:39

ありがとうございます。メール送信何度か試したのですが、サーバーの容量超過で送れなかったようです。 とりあえずは引数でメンバ関数内にハンドルの値を渡すようにして対処はしました。 上記のプログラムも参考にさせていただきます

Page: 1 |