• ベストアンサー

DXライブラリでの2Dの描画法[RPG作成]

VidualStudio.net C++ DXライブラリでRPGを初めて作成中なのですが、キャラ移動、マップ移動、マップスクロールなど実装したのはいいのですが、ゲームがとても重いです。 CPUの使用状況によってはスムーズな動きをするので、おそらくマップの描画に問題があるのだとおもいますが、マップは32x32ピクセルのものをゲームのスタート時に読み込み、2D配列に格納したintタイプのマップにあわせてDrawGraphイメージハンドルからひとつひとつ描いています。 これでは効率が悪すぎるのでしょうか?それとも初めからすべてマップ情報をメモリにロードするとメモリ不足で結局ディスクから読み込んでいるのでしょうか。(でもそれほどの量はテスト段階ですので扱っていないのですが。。。) もっと効率のいいマップの描き方があれば教えていただきたいのでここに投稿させていただきました。 ちなみに、DXライブラリはここのものを使わせていただいています http://homepage2.nifty.com/natupaji/DxLib/dxdload.html

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

参考になりそうなQ&A:http://okwave.jp/qa4329951.html 要は「マップは予め一枚絵にしておけ」ってことですが。 #描画回数が増えれば増えるほどRAM→VRAMの転送にかかる時間が馬鹿にならなくなります

dkdkabcd
質問者

お礼

なるほど。 参考になりそうです。ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

回答No.3

 こんにちは。補足いただきました。  私の勘違いで、的外れな事を書いてしまった様です。読み飛ばして下さい、すんません。

dkdkabcd
質問者

お礼

いえいえ、私も曖昧な質問でしたので。 回答ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

 こんばんは。    オフスクリーンA,B共に、VRAM上に確保されている事を前提としますが、加速させるのであるならば、前もって32x32のマップパーツを、オフスクリーンBへタイルの様に並べて置き、2D配列を使用して、オフスクリーンBのマップパーツを参照して、オフスクリーンAに向かって並べれば、速くなると思います。  ↓width = (32x4) height = 32 マップパーツをファイルから読んでタイル状に整列させて一枚絵に仕立てる  オフスクリーンB  ○☆▲■  オフセット位置  ○-0、☆-1、▲-2、■-3  ↓オフスクリーンBのオフセット位置をマップする  int array2d[][]...  11111111  12300001  11111111  10000001  10000001  11111111  12111111  11111111  ↓オフセット位置に対応した絵をオフスクリーンBからオフスクリーンAに向かって転送して埋め尽くす  オフスクリーンA  ☆☆☆☆☆☆☆☆  ☆▲■○○○○☆  ☆☆☆☆☆☆☆☆  ☆○○○○○○☆  ☆○○○○○○☆  ☆☆☆☆☆☆☆☆  ☆▲☆☆☆☆☆☆  ☆☆☆☆☆☆☆☆

dkdkabcd
質問者

補足

こんにちわ。 恥ずかしながら、貴方が何をしているのかよく理解できません。 ええと、今私がやっているのはファイルから整数型2D配列を読み込み、その整数に対応した絵をイメージハンドルを格納した配列を指定して描画する。 つまりファイルから map[][]={ 1,1,1,1,1,1, 2,2,1,1,0,0, 0,0,0,1,1,1, 1,1,1,1,3,3, 0,0,2,3,1,1,} このようなものを2d配列に格納、 イメージファイルから ○☆▲■ を読み込み、イメージハンドルの配列に img[0] = ○、img[1] = ☆、img[2] = ▲、img[3] = ■、 と格納し、 for(i=0;i<;i++){ for(j=0; j<; j++){ DrawGraph(x,y, img[map[i][j]],TRUE) } } みたいな感じでやってます。 なにが具体的に違うか教えてください。再度すみません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • DXライブラリでゲームを作成しているのですが、通信対戦機能をつけるため

    DXライブラリでゲームを作成しているのですが、通信対戦機能をつけるために、 http://homepage2.nifty.com/natupaji/DxLib/function/dxfunc_other.html#R13N1 のページの、ConnectNetWorkのサンプルプログラムを、 設定するIPにプライベートアドレス、グローバルアドレスを入れたりしてとりあえず試しているのですが、 ポート開放している私のパソコンを接続待ち側とし、友人宅から接続側プログラムを試してもらっているのですがうまくいきません。 自宅で2台のパソコンを使って試した所、プライベートアドレスでは成功、グローバルアドレスは失敗しました。 サンプルプログラムのままなのに失敗するのですが、なぜか分かりますか?

  • DXライブラリについて

    今、DXライブラリを使ってのゲーム制作をしています。 以前は、DrectXを使っての3Dゲーム制作を行っていたのですが、objectの配置の際に、Finalize関数を使って解放しないとメモリ破壊を起こすというのを学習しました。 今回のDXライブラリにおいても、同じような処理を施さなければならないのでしょうか? というのも。 適当に組んだプログラム(画像をいくつか読み込ませたうえ、キーボードで操作できるようなもの)をF5を押したまま数秒放置していたらブルースクリーン?が出てきて電源を強制終了する羽目になったので、今、怖くて触れない状況なのです。 (一応念のため補足)・・・DxLib_End(); は、打ち込んであります。 どなたか回答をお願い申し上げます。

  • DXライブラリで作成したゲーム

    DXライブラリを使用したゲームを作ろうとしているのですが、作った物の起動が5秒ぐらい掛かります。また参考にDXライブラリを使用したフリーのゲームをプレイしてみたのですが、同じく5~10秒掛かります。  ちなみにvista ultimate メモリ:4GB CPU:core2duo 2.53GHzのPCを使用しています。  DXライブラリを使用しないでdirectXを使用したゲームはちゃんと起動します。 DXライブラリ、directXは最新のバージョンです。 DXライブラリのバージョンを下げてみても変わりませんでした。ご教授の方御願いします。

  • DXライブラリで作成したゲーム

    DXライブラリを使用したゲームを作ろうとしていたのですが、起動が5秒ぐらい掛かります。また参考にDXライブラリを使用したフリーのゲームをプレイしてみたのですが、同じく5~10秒掛かります。これはしょうがないのでしょうか。 ちなみにvista ultimate メモリ:4GB CPU:core2duo 2.53GHzのPCを使用しています。 DXライブラリを使用しないでdirectXを使用したゲームはちゃんと起動します。 DXライブラリ、directXは最新のバージョンです。

  • ゲームプログラマー志望の作品提出について

    ゲームプログラマーとして就職するときの作品提出で聞きたいのですが 作る時はDXライブラリを使って作ってもいいのでしょうか? それとも、Win32 APIやDirectXなどを使って作らないといけないのでしょうか? もちろん、後者の方がいいのはわかっているのですが、Win32 APIやDirectXの勉強をするための時間がなくなってDXライブラリで作る時に、それが合格範囲に入るか、落選範囲に入るかが気になるのです。 どなたかよろしくお願いします。 ちなみにDXライブラリを知らない人へ http://homepage2.nifty.com/natupaji/DxLib/

  • DXライブラリでの画像表示

    ゲームプログラミング初心者です。 DXライブラリを用いて画像を表示させようと以下のプログラムを組んで実行してみたのですが、ウィンドウは表示されるのに画像が表示されません。 使用しているのはBorland C++ 5.5.,BCC Developer,DXライブラリです。 ちゃんと画像もプロジェクトファイルの中に入っていると思います。 OSはwindows8です。 考えられる原因を教えてもらえないでしょうか。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode(TRUE); if( DxLib_Init() == -1 ) { return -1; } LoadGraphScreen(0,0,"image.png",TRUE); WaitKey(); DxLib_End(); return 0; }

  • DXライブラリを使用した画像表示について

    ゲームプログラミングを始めたいと考えている初心者です。 Borland C++ 5.5.1,BCC Developer,DXライブラリを使用しています。 下記のプログラムをメイクして実行すると、ウィンドウは表示されるのですが、画像が表示されません。画像の保存場所はプロジェクトの中のDebugフォルダです。どんな原因が考えられるでしょうか?ウィンドウは表示されていて実行できているのでプログラムの記述の問題ではないと考えます。 使用しているOSがMeです。Meではできないのでしょうか? お詳しい方、ぜひご回答お願いします。 ---------------------------------------------------------------- #include "DxLib.h" // プログラムは WinMain から始まります int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { ChangeWindowMode( TRUE ) ; // ウインドウモードに変更 if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1 ; // エラーが起きたら直ちに終了 } /*--ここから下に処理を記述--*/ LoadGraphScreen( 0 , 0 , "char.png" , TRUE ) ; /*--ここまでが処理--*/ WaitKey() ; // キー入力待ち DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

  • DXライブラリによるパズルゲーム制作について

     今、私はDXライブラリによるパズルゲーム制作に取り掛かっています。 そこで、画像をランダムに表示する際のプログラムの書き方に詰まってしまったので、教えていただければと思い投稿しました。 LoadDivGraph( "BLOCK.png" , 16 , 4 , 4 , 32 , 32 , Block ); for(int i=0;i<15;i++) {     for(int j=0;j<20;j++)     {         int n =GetRand(14);   if(i==0||i==14||j==0||j==19)   { DrawGraph( j*32, i*32 , Block[7], TRUE );   }   else   { DrawGraph( j*32, i*32 , Block[n], TRUE );   }     } } ※インデントに関してはご容赦ください。 かなり端折っていますが、上記のような感じで打ってしまうと、(ここには書いていませんが)while文があるおかげで、一秒間に60回のペースでBlock[n]の中身が変化してしまいます。 これを解消したいのですが、かといって、いちいち変数を用意してコピーするのでは効率が悪いですよね。あと、パズルゲームですので、この先、表示した画像を入れ替えたり消したりといった処理があることを念頭に入れたうえでのベストな書き方を教えていただければと思います。 ちなみに、C言語・C++の書き方でお願いします。

  • DXライブラリでマップが作れません・・・。

    今DXライブラリとVisualC++2008を使ってゲーム(アクション)を作っているのですがマップが作れません・・・、構造体?をつかってマップの描写は成功したのですが、0のところに判定を持たせることができません・・・。どのようにすればいいのでしょうか?色々試してみてもできず困っています。 ソースの一部 #include"DxLib.h" #define MAP_SIZE 64 // マップチップ一つのドットサイズ #define MAP_WIDTH 10 // マップの幅 #define MAP_HEIGHT 8 // マップの縦長さ int MapData[ MAP_HEIGHT ][ MAP_WIDTH ] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 1, 1, 1, 1, 1, 1, 1, 1, 0 } , { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } , } ; void HYOUZI(void); void SYOKIKA(void); struct dousa{ int power; int flag; }; struct dousa jump; struct zahyou { int x,y; int img; int flag; int muki_y; int muki_x; int x1; int x2; int x3; int x4; int y1; int y2; int y3; int y4; }; struct zahyou haikei; struct charcter { int x,y; int img; int flag; }; struct charcter ziki; struct map; //初期化 void SYOKIKA(void){ jump.flag=0; ziki.x=100; ziki.y=100; ziki.img=LoadGraph("red_player.bmp"); } //背景 void HYOUZI(void){ int i,j; for( i = 0 ; i < MAP_HEIGHT ; i ++ ) { for( j = 0 ; j < MAP_WIDTH ; j ++ ) { if( MapData[ i ][ j ] == 0 ) { DrawBox( j * MAP_SIZE , i * MAP_SIZE , j * MAP_SIZE + MAP_SIZE , i * MAP_SIZE + MAP_SIZE , GetColor( 255 , 0 , 0 ) , TRUE ) ; } } } DrawGraph(ziki.x,ziki.y,ziki.img,TRUE); ScreenFlip(); } //動き void ugoki(void){ int OldX , OldY ; OldX = ziki.x ; OldY = ziki.y ; if (CheckHitKey(KEY_INPUT_RIGHT) == 1){ ziki.x=ziki.x+4; } if (CheckHitKey(KEY_INPUT_RIGHT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x+8; } if (CheckHitKey(KEY_INPUT_LEFT) == 1){ ziki.x=ziki.x-4; } if (CheckHitKey(KEY_INPUT_LEFT) == 1) if (CheckHitKey(KEY_INPUT_Z) == 1) { ziki.x=ziki.x-8; } if(ziki.x>640){ ziki.x=-10; } if(ziki.x<-10){ ziki.x=640; } //ジャンプ jump.power-=1; ziki.y -=jump.power; if(ziki.y>400){ jump.power=0; ziki.y=400; jump.flag=0; } if (CheckHitKey(KEY_INPUT_DOWN) == 1 && jump.flag == 0){ jump.power=30; jump.flag=1; } if (CheckHitKey(KEY_INPUT_UP) == 1 && jump.flag == 0){ jump.power=20; jump.flag=1; } if( MapData[ ziki.x ][ ziki.y ] == 0 ) { ziki.x = OldX ; ziki.y = OldY ; } } int WINAPI WinMain ( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init()==-1) { return -1; } SYOKIKA(); SetDrawScreen(DX_SCREEN_BACK); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0){ HYOUZI(); ugoki(); ClearDrawScreen(); } DxLib_End(); return(0); } 分かる人がいたらぜひ教えてください(o_ _)o

  • Visual C++ 2008でのDXライブラリ導入について

    Visual C++ 2008でのDXライブラリ導入について 最近プログラムの勉強を始めたばかりの初心者です。 Microsoft Visual C++ 2008 Express EditionにDXライブラリを導入しようと思い、http://homepage2.nifty.com/natupaji/DxLib/dxuse_vc2008express.html ↑のサイトで手順どおりにやっていたのですが、サンプルプログラムの実行でエラーが出ました。 エラーの内容は include ファイルを開けません。'excpt.h': No such file or directory といったものです。 プログラムの記述はコピー&ペーストしたので間違ってはいないと思います。 なので、サンプルプログラムの前の設定で何か変になっている事があると思うのですが、 どうにも手順を間違っているように思えません。 念のため書いておくとOSはvistaを使用しています 分かりづらいかと思いますが原因がわかる方いましたらぜひ教えてください。足りない部分があったら補足します。よろしくおねがいします