トップページ > 過去ログ > 記事閲覧
3Dアクションゲームで2P以上の対戦をしたいけど・・・
名前:お困りアズ 日時: 2009/12/16 09:47

初めて投稿させてもらいます。 今3Dでのアクションゲームを製作しているのですが、2P以上での対戦と言ったものを作りたいと思い製作して行き画面分けをしたまでは良いのですがカメラが1つしかないのが原因なのかカメラを動かすと描画された画像に合わせて画面がだんだん黒くなっていきました。 たぶん、画面の描画されている画像が消えていると思います。 ソースコードはこのようにして画面分けとカメラと描画をしています。 int WindowSizeX, WindowSizeY; // ウインドウのクライアント領域サイズを取得 GetWindowSize( &WindowSizeX, &WindowSizeY ); while(ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE){ ClearDrawScreen() ; // 1P用描画領域 SetDrawArea( 0, 0, WindowSizeX / 2, WindowSizeY / 2 ); SetCameraScreenCenter( ( float )( WindowSizeX / 2 / 2 ), ( float )( WindowSizeY / 2 / 2 ) ); St_3DDraw();//3Dの描画を行っています。 // 2P用描画領域 SetDrawArea( WindowSizeX / 2, 0, WindowSizeX, WindowSizeY / 2 ); SetCameraScreenCenter( ( float )( WindowSizeX - ( WindowSizeX / 2 / 2 ) ), ( float )( WindowSizeY / 2 / 2 ) ); St_3DDraw();//3Dの描画をおこなっています ScreenFlip() ; } です。他のところでカメラを設置したりキーボード操作でカメラの向きや移動をできるようにしています。 ちなみに2P用の画面はちゃんと動いて1P用の画面が問題になりました。 追伸: カメラの設定などはDXライブラリーのサイトでのサンプルプログラムの[3Dアクションの基本]を元に作っています。 判り難く申し訳ありませんがお願いします。

Page: 1 |

Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.1 )
名前:いっち 日時:2009/12/16 23:40

とりあえず上記ソースのSt_3DDraw関数をDrawTriangle3D関数に変えて実行してみましたが、 正しく描画されているように見受けられました。 上記のソース自体には問題無いと思います。 ライブラリのバージョンは3.00eです。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.2 )
名前:お困りアズ 日時:2009/12/17 03:14

いっち 様、返答ありがとうございました。 最初の質問の内容不足でした。 たしかにDrawTriangle3D関数で表示される三角形やDrawSphere3Dでの球体の表示などの図形表示だけ表示するなら問題がないのですが、ここでのSt_3DDrawはmqoファイル、xファイルの3Dモデルを表示していてそのモデルを動かしたら最初の質問のようになりました。 追伸でも書いたのですが、DXライブラリーのサイトでのサンプルプログラムの[3Dアクションの基本]を元に製作したので問題とされているソースを[3Dアクションの基本]に貼り付けたら同じような現象になります。 分かり難かったことですいませんでした。 最初の質問で書き忘れていましたがライブラリーのバージョンは12/16以降の日付で一番新しいライブラリーです。あとVCを使っています。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.3 )
名前:Masao 日時:2009/12/17 05:41

同じ現象を確認しました。 ver 3.00f VC++ 2008 Express Edition です。 メインループ内で以下のようにカメラ位置を更新して描画しました。 loopCount++; if(loopCount%2 == 0){ ClearDrawScreen() ; SetDrawArea( 0, 0, 640, 480 ); SetCameraScreenCenter( 320, 240 ); }else{ SetDrawArea( 0, 0, 100, 80 ); SetCameraScreenCenter( 50, 40 ); } 以下のようにすると、なぜかましになりましたが それでもチカチカします。 loopCount++; if(loopCount%2 == 0){ SetDrawArea( 0, 0, 640, 480 ); SetCameraScreenCenter( 320, 240 ); }else{ ClearDrawScreen() ; SetDrawArea( 0, 0, 100, 80 ); SetCameraScreenCenter( 50, 40 ); }
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.4 )
名前:お困りアズ 日時:2009/12/17 09:20

Masao様返答ありがとうございます。 私もその考えに至ってswitch文などで製作して見たもののかなり画面がチカチカするのでどうにかならないかなと考えていますが 解決方法がいまだ見つかりません。 チカチカさえ無くなれば問題無いのですがね^^;
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.5 )
名前:いっち 日時:2009/12/17 12:24

現象を(おそらく)確認できましたので、再現用のソースを作ってみました。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int ModelHandle; VECTOR CameraPos; int WindowSizeX, WindowSizeY; ChangeWindowMode( TRUE ); if( DxLib_Init() < 0 ) return -1; SetDrawScreen( DX_SCREEN_BACK ); GetWindowSize( &WindowSizeX, &WindowSizeY ); SetUseZBuffer3D( TRUE ) ; SetWriteZBuffer3D( TRUE ) ; ModelHandle = MV1LoadModel( "SimpleModel.mqo" ); // カメラの座標を初期化 CameraPos.x = 0.0f; CameraPos.y = 0.0f; CameraPos.z = -800.0f; { // Zバッファ オフ // MV1SetUseZBuffer( ModelHandle, FALSE ); // MV1SetWriteZBuffer( ModelHandle, FALSE ); // SetUseZBuffer3D( FALSE ) ; // SetWriteZBuffer3D( FALSE ) ; } while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 ) { // 画面をクリア ClearDrawScreen(); // 方向キーでカメラの座標を移動 if( CheckHitKey( KEY_INPUT_UP ) == 1 ) CameraPos.y += 20.0f; if( CheckHitKey( KEY_INPUT_DOWN ) == 1 ) CameraPos.y -= 20.0f; if( CheckHitKey( KEY_INPUT_LEFT ) == 1 ) CameraPos.x -= 20.0f; if( CheckHitKey( KEY_INPUT_RIGHT ) == 1 ) CameraPos.x += 20.0f; { // Screen 1 SetDrawArea( 0, 0, WindowSizeX / 2, WindowSizeY / 2 ); SetCameraScreenCenter( ( float )( WindowSizeX / 2 / 2 ), ( float )( WindowSizeY / 2 / 2 ) ); SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ); MV1DrawModel( ModelHandle ); DrawSphere3D( VGet( 0.0f, -250.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ); } { // Screen 2 SetDrawArea( WindowSizeX / 2, 0, WindowSizeX, WindowSizeY / 2 ); SetCameraScreenCenter( ( float )( WindowSizeX - ( WindowSizeX / 2 / 2 ) ), ( float )( WindowSizeY / 2 / 2 ) ); SetCameraPositionAndTarget_UpVecY( CameraPos, VGet( 0.0f, 0.0f, 0.0f ) ); MV1DrawModel( ModelHandle ); DrawSphere3D( VGet( 0.0f, -250.0f, 0.0f ), 80.0f, 32, GetColor( 255,0,0 ), GetColor( 255, 255, 255 ), TRUE ); } ScreenFlip(); } DxLib_End(); return 0; } ソース中の"SimpleModel.mqo"はDxLib用のサンプルとして配布されているものです。 ソース中の"Zバッファ オフ"ブロックのコメントをはずすと、 とりあえずちらつきはなくなりますが、描画順序はおかしくなります。 Z Bufferがらみの事象っぽいです。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.6 )
名前:お困りアズ 日時:2009/12/17 13:46

いっち様 返答ありがとうございます。 とりあえずはチカチカが無くなって見れるようになりました。 やはりいっち様が言ったように描画順序がおかしくなりました。 サンプルのキャラの頭が剥げました。 あともう少しで出来上がりそうですね^^ こちらも頑張って原因を探していきます。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.7 )
名前:管理人 日時:2009/12/19 02:24

すいません、ClearDrawScreen を呼んでも SetDrawArea で指定した範囲内しか Zバッファがクリアされないというバグがありました 修正版をアップしましたので、よろしければお試し下さい m(_ _;m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) > いっちさん 再現ソースの掲載ありがとうございます
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.8 )
名前:Masao 日時:2009/12/19 07:48

テストしてみました。 エリアがかぶらないときは正常に動作しましたが、 ふたつのエリアの一部が被った時に、何かまざったような現象がおきました。 よければ修正お願いします。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.9 )
名前:お困りアズ 日時:2009/12/19 07:58

管理人様 返答ありがとうございました。 取り合えずは成功しました。Masao様の用に動作がおかしくなったらまた報告させてもらいます。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.10 )
名前:お困りアズ(解決) 日時:2009/12/19 18:02

プログラムを進めて行きおそらく2P以上の対戦が出来そうです。 今までありがとうございました。 これからも質問や回答ができたら書き込んで行きます。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.11 )
名前:管理人 日時:2009/12/22 00:27

> Masaoさん カメラ設定の違う二つのエリアを被せた場合におかしな見た目になるということでしょうか? もしそことを指しているのでしたら、それは仕様となります 異なる視点での描画結果を重ねたことになるのでおかしな描画結果になります
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.12 )
名前:Masao 日時:2009/12/22 13:17

>カメラ設定の違う二つのエリアを被せた場合におかしな見た目になるということでしょうか? そうですね。 車の運転席からのビューをメインビューにして、バックミラーを再現したい場合、ミラーをメインビューの一部分に配置することになりますが、このとき描画エリアがかぶってしまいます。 ですが、仕様ということでしたら了解です。 ご対応ありがとうございました。
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.13 )
名前:管理人 日時:2009/12/27 12:40

バックミラーに映る映像は描画可能画像に「ミラーに映る映像」を描画した後に ミラーの部分に描画可能画像を使ったポリゴンを描画するといった方法で実現できます
Re: 3Dアクションゲームで2P以上の対戦をしたいけど・・・ ( No.14 )
名前:Masao 日時:2010/01/01 06:27

見るのが遅れてしまいました、すいません。 なるほど。 MakeGraph やらで作った画像に描画し、それをテクスチャに指定するみたいな感じですね。 ありがとうございました。

Page: 1 |