- 1 名前:じっち [04/11/23 07:14:50 ID:CCsv+84e.net]
- 少し前まではHSPで作ろうと思っていたのですが、HSPでRPGゲームを作るのは難しいらしいので、C++で作ろうと思います。
C++のプログラミングは初めてですので、みんなの力が必要です。 お願いします。 あと質問ですが、C++ってMMORPGつくれますか?
- 788 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:23:55.03 ID:zj8b7q7C.net]
- (787続き)
いろんなアプローチがあるかと思うのでいろんな意見を参考にされるとよいと思います。 わたしはまずはprintfから作るオールドタイプです。 あと、DirectXはver9しか知らないです。 VisualC++は使ったことないのでまったくわからないです。
- 789 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:26:00.17 ID:LV/Xv7hB.net]
- >>787
はい、試しました
- 790 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:29:26.99 ID:LV/Xv7hB.net]
- >>788
DirectXは9.0cで作ろうと思っているので、ちょうど良いです 自分はもっとオールドタイプですね MSXの頃にプログラムしてたので、Windows環境はさっぱりです まあVC++が吐き出すWin32APIの雛形くらいは理解できますが
- 791 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:36:07.62 ID:zj8b7q7C.net]
- 次はとりあえずWindowを作成してしまいましょう。
WINDOWクラスに下記のメンバーを追加してください。 private: HWND handle; MSG message; bool sync; struct { unsigned int X,Y,W,H; unsigned int x,y,w,h; } screen; 変数名とか関数名は自分のポリシーにあわせて変更してください。
- 792 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:49:20.74 ID:zj8b7q7C.net]
- メンバー関数を作成します。
public: bool open( void ); ゲームの名称が決まっているならプロジェクト名をつけておくと愛着が湧きますよ。 #ifndef PROJECT #define PROJECT "お好きな名前" #endif そろそろファイルを.hと.cppに分割したほうがよいかも知れません。
- 793 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:51:12.61 ID:zj8b7q7C.net]
-
bool WINDOW::open( void ){ HINSTANCE hi = GetModuleHandle( NULL ); WNDCLASSEX wc; wc.cbSize = sizeof( wc ); wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = Proc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hi; wc.hIcon = ( HICON )LoadImage( NULL,IDI_APPLICATION,IMAGE_ICON, 0,0,LR_DEFAULTSIZE|LR_SHARED ); wc.hIconSm = wc.hIcon; wc.hCursor = ( HCURSOR )LoadImage( NULL,IDC_ARROW, IMAGE_CURSOR,0,0,LR_DEFAULTSIZE|LR_SHARED ); wc.hbrBackground= ( HBRUSH )GetStockObject( BLACK_BRUSH ); wc.lpszMenuName = NULL; wc.lpszClassName= _T( PROJECT );
- 794 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:52:43.01 ID:LV/Xv7hB.net]
- >>791-792
できました ちなみにどんな環境でコンパイルしてるんですか? 自分はVisual C++ Express 2010でやってます
- 795 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:55:08.70 ID:zj8b7q7C.net]
- RegisterClassEx( &wc );
handle = CreateWindow(wc.lpszClassName, wc.lpszClassName, WS_OVERLAPPEDWINDOW, screen.X = screen.x = ( GetSystemMetrics( SM_CXSCREEN ) - SCREEN_W )/ 2, screen.Y = screen.y = ( GetSystemMetrics( SM_CYSCREEN ) - SCREEN_H )/ 2, screen.W = screen.w = SCREEN_W + GetSystemMetrics( SM_CXFRAME ) * 2, screen.H = screen.h = SCREEN_H + GetSystemMetrics( SM_CYFRAME ) * 2 + GetSystemMetrics( SM_CYCAPTION ), NULL,NULL,hi,NULL); ShowWindow( handle, SW_SHOW ); UpdateWindow( handle ); return true; } これでコンパイルしてみてください。 "Procという関数がないよ"でエラーになります。
- 796 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:57:21.06 ID:LV/Xv7hB.net]
- >>795
そこまで出来ました ProcとSCREEN_WとSCREEN_Hが定義されていないので エラーになりますね
- 797 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 00:59:49.27 ID:n38lezle.net]
- windows.hのインクルード前に
#define WIN32_LEAN_AND_MEAN を入れておくとコンパイルが早くなったりとか _WIN32_WINNTを定義しておかないと勝手にVistaとか7専用にされたりとか
- 798 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:00:15.45 ID:zj8b7q7C.net]
- >>794
MinGW g++というコンパイラです。VCのような統合環境が苦手なんです。 静的メンバー関数としてProcを追加してください。 private: static LRESULT CALLBACK Proc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ); LRESULT CALLBACK WINDOW::Proc( HWND hWnd, UINT msg, WPARAM wp, LPARAM lp ){ switch ( msg ) { case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wp, lp ); }
- 799 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:04:37.18 ID:zj8b7q7C.net]
- >>796
スクリーン用の定数定義を忘れていました。 WINDOWクラスに下記の定義を追加してください。 private: enum { SCREEN_W = 800, SCREEN_H = 600, }; 数値はお好みで変更ください。 ファイルや環境変数で外部から取り込む方法もあるかと思いますが、 面倒くさいんでやってないです。最後の方で対応すればよいかと。
- 800 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:14:43.71 ID:LV/Xv7hB.net]
- >>798-799
できました LRESULT CALLBACK WINDOW::Proc〜の行で 同じパラメーターの型で静的な、または動的なメンバー関数をオーバーロードできません。 とのエラー
- 801 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:21:28.74 ID:zj8b7q7C.net]
- >>800
すいません原因よくわからないです。 ProcをWINDOWクラスのメンバーから外して、単なる外部関数にしてみてください。
- 802 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:25:17.77 ID:LV/Xv7hB.net]
- >>801
できました
- 803 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:30:45.13 ID:zj8b7q7C.net]
- >>802
そうですか。。。コンパイラの差異かも知れないです。 先々、この手の差異でどうにもわからない場合は、 申し訳ないですが自己解決か他に助言を求めてください。 下記の2つのメンバー関数を追加してください。 private: bool peek( void ); //ウィンドウのメッセージを処理します bool sync( void ); //タイマーの同期を取ります
- 804 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:36:52.24 ID:LV/Xv7hB.net]
- >>803
syncが再定義でエラーになりますね 以前にbool変数として定義されていますが
- 805 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:39:12.81 ID:zj8b7q7C.net]
- 最終的に作成した3つのメンバー関数はWinMaiに以下のように組み込みます。
window.open(); do { GameSystemInit(); while ( window.peek() ) { if ( !window.sync() ) { continue; } if ( !GameSystemMain()) { break; } } GameSystemFree(); } while ( window.sync() ); ↓これらがゲームっぽいプログラムを入れるところです。 bool GameSystemInit( void ){ return true; } bool GameSystemMain( void ){ return true; } bool GamaSystemFree( void ){ return true; } とりあえず空関数を適当に作成しておきます。
- 806 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:41:06.36 ID:zj8b7q7C.net]
- >>804
あまり自分の色が出ないように自分のソースからそのまま名前を持ってこないようにしています。 すいませんが適宜お好みの命名規則で回避してください。
- 807 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:47:57.19 ID:zj8b7q7C.net]
- (806続き)
混乱するので、以降はそのまま持ってくるようにします。 sync変数と関数は下記になります。 private: bool sync; public: bool Sync( void ) const { return sync; }
- 808 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:51:46.72 ID:LV/Xv7hB.net]
- >>807
そこまでできました peekもpublicになりますか? 今のままだと静的関数なんでアクセスできないですけど
- 809 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 01:53:56.05 ID:zj8b7q7C.net]
- Peek関数の中でタイマーを処理しているので、WINDOWクラスに下記のメンバーを追加してください。
struct { unsigned int old; unsigned int now; } time; コンストラクターで初期化します。 WINDOW::WINDOW() { timeBeginPeriod( 1 ); time.old = timeGetTime(); } で、デストラクターで後始末します。 WINDOW::~WINDOW(){ timeEndPeriod( 1 ); }
- 810 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 07:13:10.95 ID:zj8b7q7C.net]
- >>808
Peekはpublicです。privateは間違いでした。 あと静的(static)ではないです。
- 811 名前:名前は開発中のものです。 mailto:sage [2011/03/10(木) 22:22:49.60 ID:zj8b7q7C.net]
- Peekの実装です。これでWindowsが表示されると思います。
bool WINDOW::Peek( void ){ sync = false; if ( PeekMessage( &message, NULL, 0, 0, PM_NOREMOVE ) ) { switch ( GetMessage( &message, NULL, 0, 0 ) ) { case 0: case -1: return false; } TranslateMessage( &message ); DispatchMessage( &message ); } time.now = timeGetTime(); if ( time.now - time.old >= 1000/60 ) { time.old = time.now; sync = true; } return true; }
- 812 名前:名前は開発中のものです。 mailto:sage [2011/03/11(金) 00:55:58.78 ID:jGNSe99R.net]
- >>811
Window表示できました
- 813 名前:名前は開発中のものです。 mailto:sage [2011/03/11(金) 07:34:09.43 ID:tT3vlqKS.net]
- >>812
VC++上でのデバッガー実行はよくわからないんで自前でやっていただくとして、 先々、デバッグ目的で何かを表示するのに、よくprintfとMessageBoxを使ったりします。 これらに加えて、Windows上で表示されるフォントがあると便利なので、 デバッグ用にSpriteによる文字表示を作成するのがよいかと思います。 SpriteはDirectXの機能を使います。
- 814 名前:名前は開発中のものです。 mailto:sage [2011/03/11(金) 11:57:07.06 ID:cb9oR2jl.net]
- #include <windows.h>
OutputDebugStringA("これはデバッグ出力\n");
- 815 名前:名前は開発中のものです。 mailto:sage [2011/03/19(土) 10:31:39.54 ID:zpjTizC+.net]
- 皆様お元気でしょうか
ちょっとゴタゴタしてましたが、再開です >>813 スプライトによる文字表示がよく分からなかったので とりあえずDrawTextで文字列表示できました まあ、とりあえずデバッグ用としてこれでいいかなと >>814 VisualStudioだとそれでコンソール出力できるみたいですね 参考にします
- 816 名前:名前は開発中のものです。 mailto:sage [2011/03/19(土) 10:35:30.95 ID:zpjTizC+.net]
- それにしても、意外とDirectX9の解説サイト少ないですね
8以前だと結構あるんですが 特にプログラマブルシェーダーに対応したサイトは少ない 固定機能パイプラインとかもう廃止なので使いたくないし DirectXの知識は全くないので、情報が無いとなかなか進まない
- 817 名前:名前は開発中のものです。 mailto:sage [2011/03/19(土) 10:41:37.55 ID:zpjTizC+.net]
- マップチップとかって、どうやって読み込むんだろう
RPGツクールVXなどを見てみると、マップチップ数に制限が無い 仮に32*32ドットのマップチップ数が65536個だとすると RPGツクール仕様だと、横8個分のチップを縦方向に無限なので 256*262144ドットの巨大テクスチャとして読み込むのだろうか こんな巨大なテクスチャ作れるのかな?
- 818 名前:名前は開発中のものです。 mailto:sage [2011/03/19(土) 11:54:43.83 ID:tf/j5S+W.net]
- 俺なら複数枚のテクスチャを切り替えて表示するかな >817
1枚目のテクスチャにあるチップを描画して、SetTextureで切り替えて2枚目とか どんな方法がベストなのかは知らないけど
- 819 名前:名前は開発中のものです。 mailto:sage [2011/03/19(土) 12:16:09.47 ID:zpjTizC+.net]
- >>818
なるほど、やはり適当な大きさに分割するのが良いんですね 昔のゲームなら全部VRAMに読み込んでコピーとか普通だったけど 今のゲームの規模ならそれはないですね
- 820 名前:名前は開発中のものです。 mailto:sage [2011/03/21(月) 11:39:21.38 ID:t1zoR9O5.net]
- ここ数日DirectXの情報サイトばかり見ているけど
リソースの解放とか凄い面倒そうだ ある程度フレームワーク化しなきゃ駄目なのかな HLSLとかもさっぱりだし、先はかなり長そうだ・・・
- 821 名前:名前は開発中のものです。 mailto:sage [2011/03/21(月) 11:47:38.69 ID:KbfIo3Ze.net]
- 楽をしたいならOgreとかirrlichtとかDXLibとか高レベルライブラリを使うべき
Directxばかりに固執するといいことは何も無い それに良いフレームワークに触れない限り、 自分でフレームワークを組み立てることなどできないしな
- 822 名前:785 mailto:sage [2011/03/23(水) 21:00:30.42 ID:NMGIfDjO.net]
- Window表示が出来たなら、次は入力回りを整備するのがよいかと思います。
DirectInputでよいですかね?(他はわからないです)
- 823 名前:名前は開発中のものです。 mailto:sage [2011/03/23(水) 21:36:41.78 ID:iioYpWXA.net]
- >>822
はい、お願いします DirectInputはまだ未着手なので勉強しておきます
- 824 名前:名前は開発中のものです。 mailto:sage [2011/03/23(水) 21:40:39.44 ID:iioYpWXA.net]
- >>821
ゲーム自体をすぐに作りたいというよりは DirectXと最近のゲームの作り方を勉強したいので Win32API+DirectXでやっていきたいと思います DXライブラリは便利そうですね、いずれこういうライブラリも作りたいです
- 825 名前:785 mailto:sage [2011/03/23(水) 22:48:06.18 ID:NMGIfDjO.net]
- >>823
入力関連をまとめるクラスを作成しましょう。 クラス名(XXXXX)はお好みで変えてください。 class XXXXX { public: static bool Init( void ); // 初期化処理を記述する関数 static bool Main( void ); // 毎ループ呼び出される関数 static bool Free( void ); // 終了時処理を記述する関数 }; bool XXXXX::Init( void ){ return true; } bool XXXXX::Free( void ){ return true; } bool XXXXX::Main( void ){ return true; } 上記の関数はそれぞれ前述(>>805)のGameSystem系の対応する関数内で呼び出します。 InitとFreeの中身は対称(確保⇔解放)になる事が多いです。 また、Mainはどうしても記述量が多くなります。 なので、Init/Free/Mainの順に記載するとソースの見通しがよくなります。
- 826 名前:名前は開発中のものです。 mailto:sage [2011/03/24(木) 12:02:48.79 ID:+jtjlJX2.net]
- 入力関連なんてゲーム内で一つあればいいんだからグローバル関数でもなんでもいいよ
- 827 名前:名前は開発中のものです。 mailto:sage [2011/03/24(木) 17:44:17.05 ID:7A5Wm0Sp.net]
- 全部staticにするくらいなら潔くグローバル関数でいいな
シングルトンでもいいが
- 828 名前:名前は開発中のものです。 mailto:sage [2011/03/25(金) 00:33:52.87 ID:DZniurx+.net]
- >>825
そこまで出来ました。 >>826-827 グローバル関数にすると、管理が面倒になりませんか? フレームワークとかライブラリみたいな形にする時にも メンバ関数の形の方が良いような気がしますが
- 829 名前:名前は開発中のものです。 mailto:sage [2011/03/25(金) 00:49:34.24 ID:VJVVC59h.net]
- >>828
そりゃルート名前空間に直置きは最悪だが 名前空間でくくればまったく面倒ではない むしろすべてクラスクラスと固執する思考はよくないと思われ
- 830 名前:名前は開発中のものです。 mailto:sage [2011/03/25(金) 00:51:14.65 ID:VJVVC59h.net]
- とはいってもまあデザパタ使っていいならシングルトンでも使えばおk
- 831 名前: ◆MBbNHCnf2M mailto:sage [2011/03/25(金) 01:00:08.60 ID:DZniurx+.net]
- とりあえずトリップを付けてみる
>>829 C++で名前空間とか使ったこと無かったです >>830 シングルトンってデザインパターンですか そういうの考えてプログラム作ったこと無かったなぁ ああ、でもMVCでObserverパターンだけ知ってたかも
- 832 名前: ◆MBbNHCnf2M mailto:sage [2011/03/25(金) 01:03:33.95 ID:DZniurx+.net]
- ところで、すごく基本的な質問ですけど
staticなメンバ関数だと何が問題なんでしょう? 特に駄目だという理由が思い付かないんですけど
- 833 名前:名前は開発中のものです。 mailto:sage [2011/03/25(金) 02:00:59.85 ID:t5g0UlGF.net]
- C++ でシングルトンなんか持ち出すくらいなら素直にグローバル変数にしといたほうがよくないか?
- 834 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/25(金) 08:07:59.07 ID:iNPazjrA.net]
- >>828
私もゲームの作り方を勉強したいと思って、 DirectXをつい最近やり始めたという状況で、 自分のやった事を再確認的にお伝えするのが限界です。 いづれ追いつかれて飽和すると思いますので、 より抽象的な概念や高度な作法はいろいろな意見を参考にしてください。 ちなみにXXXXXの部分は何と命名しました?
- 835 名前: ◆MBbNHCnf2M mailto:sage [2011/03/25(金) 11:19:22.92 ID:DZniurx+.net]
- >>834
クラス名は GameInput としておきました
- 836 名前:名前は開発中のものです。 mailto:sage [2011/03/25(金) 17:44:09.60 ID:VJVVC59h.net]
- 最初からデザイン云々いいだしても進まないから、
とりあえず動くことを目的としてけばええと思う 動き始めてからいくらでもデザインは改良できるし。 最初は処理の手順を覚えるのが先、 アルゴリズムの訓練をするのが先決
- 837 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 10:36:17.74 ID:pvmCllah.net]
- 必要な変数(静的メンバ)を設定します。
.h public: enum { JOY1,JOY2,JOYMAX,}; private: static IDirectInput8* input; static IDirectInputDevice8* keyboard; static IDirectInputDevice8* mouse; static IDirectInputDevice8* joypad[]; static unsigned int joycnt; .cpp namespace { IDirectInput8* GameInput::input; IDirectInputDevice8* GameInput::keyboard; IDirectInputDevice8* GameInput::mouse; IDirectInputDevice8* GameInput::joypad[JOYMAX]; unsigned int GameInput::joycnt; }
- 838 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 11:18:46.58 ID:pvmCllah.net]
- DirectInputの初期化です。
GameInput::Init input = NULL; DirectInput8Create( GetModuleHandle( NULL ), DIRECTINPUT_VERSION, IID_IDirectInput8, reinterpret_cast< void** >( &input ), NULL ); GameInput::Free if ( input ) { input->Release(); input = NULL; } >>837 .hに#include <dinput.h>が必要でした。
- 839 名前:名前は開発中のものです。 mailto:sage [2011/03/26(土) 11:36:25.84 ID:oFPuFWap.net]
- デザインとか気にするんだったら、まずはDirectInputデバイスを晒すのをやめるべき。
入力を取得する関数かクラスを作って、直接デバイスにアクセスするのはその中だけに制限する。
- 840 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 13:03:14.90 ID:npmu6kKT.net]
- >>837
.cpp(GameInput.cppとしている)のnamespace内の定義は 現在のスコープでは定義できませんとなります
- 841 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 14:20:22.37 ID:pvmCllah.net]
- >>840
では、namespace{}での括りは外してしまってください。
- 842 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 14:22:30.73 ID:pvmCllah.net]
- keyboardの初期化です。
GameInput::Init input->CreateDevice( GUID_SysKeyboard, &keyboard, NULL ); keyboard->SetDataFormat( &c_dfDIKeyboard ); keyboard->SetCooperativeLevel( Window.Handle(), DISCL_FOREGROUND|DISCL_NONEXCLUSIVE ); { DIPROPDWORD dipd = {}; dipd.diph.dwSize = sizeof( DIPROPDWORD ); dipd.diph.dwHeaderSize = sizeof( DIPROPHEADER ); dipd.diph.dwObj = 0; dipd.diph.dwHow = DIPH_DEVICE; dipd.dwData = 8; keyboard->SetProperty( DIPROP_BUFFERSIZE, &dipd.diph ); } keyboard->Acquire(); GameInput::Free if ( keyboard ) { keyboard->Unacquire(); keyboard = NULL; }
- 843 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 14:36:20.30 ID:npmu6kKT.net]
- >>842
SetCooperativeLevelの引数、Window.Handle()って Handleって関数作ってないみたいです
- 844 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 14:40:47.38 ID:pvmCllah.net]
- WINDOWクラスに下記の関数を作成してください。
public: const HWND Handle( void ) const { return handle; } >>842 GameInput::Init keyboard = NULL // ねんのため追加してください input->CreateDevice( GUID_SysKeyboard, ... GameInput::Free: 解放の順番は初期化と反対にしてください。 input初期化->keyboard初期化 〜 keyboard解放→input解放
- 845 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 15:28:08.48 ID:npmu6kKT.net]
- 変数のスコープとかよく分からなくなってきた・・・
Window.Handle()のWindowって、最初の方で定義したWindow window;の windowっていうインスタンスだと思うんですけど GameInput::Initが書かれているファイルGameInput.cppからアクセスするには インスタンスを渡すしかないと思うんですけど そこの処理はまだ書いてませんよね? あれ、それともなんか勘違いしてるかな
- 846 名前:名前は開発中のものです。 mailto:sage [2011/03/26(土) 16:01:06.60 ID:QDwsR5XB.net]
- いいかげんスレ違い
RPGのロジックに入るまでブログでやれ
- 847 名前:名前は開発中のものです。 mailto:sage [2011/03/26(土) 16:35:54.83 ID:ai5/F2yB.net]
- どうせ他に使うやついないのになにいっちゃってんの?アホなの?
- 848 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 16:40:45.61 ID:pvmCllah.net]
- >>845
下記を宣言してください。 extern WINDOW window; この先いろんなところで参照するので、ヘッダに記載した方がよいです。 (>>846)のような意見も出ていますし、ソースを断片的に記載していくのは効率や誤謬が出やすいので、 別の手段を検討したほうがよいかも知れません。 ブログかアップローダを指定いただければそちらでお渡ししますんで、 ご検討ください。
- 849 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 16:53:57.96 ID:pvmCllah.net]
- extern WINDOW Window; でした(最初大文字)
ソース全体でこれだけはグローバル変数にしています。 他の変数はクラスの静的メンバでprivateにしています(IDirectInput8* input等)。 ここに書いてやり取りするのは楽でいいんですけど先々難しそうですね。 スレッドのリサイクル法が適用されて日記帳扱いになればOKかも。
- 850 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 17:11:30.81 ID:npmu6kKT.net]
- >>846
>>1の書き込みとスレッドの中身を見る限り、このレベルからやっても 良いように感じましたが・・・ >>1さんもC++のプログラミングは初めてって書いてますし >>848 確かにこのままソース書いていくのは難しいと感じてました どんどん大きくなっていきますからね とりあえず gmdev.xrea.jp/ このアップローダが、この板でプログラムを作っている方々が 使用しているアップローダのようです 今後はここにソース置きましょうか >>849 common.hみたいなヘッダを作成して #include "WINDOW.h" extern Window window; として WINDOWクラスにアクセスする必要があるクラス全部に インクルードしたら良いんですね
- 851 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 18:14:33.03 ID:pvmCllah.net]
- >>850
gmdevにDirectInputの.h/.cppを置きました。 ttp://gmdev.xrea.jp/st/up/245.txt >common.hみたいなヘッダ そうです。自分専用のマクロとか定義とかの置き場にヘッダ作りますよね。 そこに入れておいてください。 ついでに↓もお願いします。 #define ARRAY(a) (sizeof(a)/sizeof(a[0])) 配列の要素数のマクロです。 置いたソースですが現在の自分のソースからいろいろはしょって整形しているので、 部分的に文法がおかしくなったりで、エラーがでるかも知れません。 それはすいませんがうまく直してください。
- 852 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 18:47:47.52 ID:npmu6kKT.net]
- >>851
すごく見やすいソースですね、大体の感じは理解出来ました GameInput.cppのunsigned int GameInput::index;で 静的でないメンバーはクラスの外側で定義できませんと出たので ヘッダの宣言でstatic付けときましたけど、staticにして大丈夫ですか? それと、DATA_MAXが未定義だったので、適当に#define DATA_MAX 256 と、とりあえずしておきました 以上でコンパイルできました これからじっくりとソース見ていきたいと思います
- 853 名前: ◆MBbNHCnf2M mailto:sage [2011/03/26(土) 18:59:27.28 ID:npmu6kKT.net]
- 今ソース眺めてたら
enum { DATAMAX = 0x100, };ってあるけど これがDATA_MAXかな?
- 854 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/26(土) 19:15:55.16 ID:pvmCllah.net]
- >>852
index は static です。付け忘れました。 >>853 DATA_MAXです。記述ミス。 入力ワーク回りで間違い多いのは、現在その部分は環状リストで可変長で実装しているので、 急ごしらえで変更したためです。 一部、ヘッダにあって実装されていない関数(JoyPush等)は実際にゲーム中で使用する関数です。 これはGameInput.cppとは別ファイルにした方がよいです。 GameInput.cppはいったん完了するとほとんどいじらなくなります。 ライブラリィ化してもいいかも知れません。
- 855 名前:名前は開発中のものです。 mailto:sage [2011/03/27(日) 19:06:12.75 ID:7F6awSJl.net]
- >>825
> InitとFreeの中身は対称(確保⇔解放)になる事が多いです。 なんでコンストラクタとデストラクタ使わないの?
- 856 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/27(日) 22:08:40.18 ID:In3d1Uaw.net]
- >>855
インスタンスを作成しないからです。メンバーは変数も関数もstaticだけです。 インスタンスを作成できないように、privateでコンストラクタを記述しておくべきですね。
- 857 名前: ◆MBbNHCnf2M mailto:sage [2011/03/27(日) 22:25:46.92 ID:rtEoqdWq.net]
- ここ二日でDirectInputについては大体理解できた気がする
今頃気が付いたけど、DirectInputって今後非推奨なのか
- 858 名前:名前は開発中のものです。 mailto:sage [2011/03/27(日) 22:49:20.93 ID:7F6awSJl.net]
- >>856
いや、だからインスタンスを生成しないのはなんで?って話だったんだけど。 まぁプログラム中で1回だけしかやらないなら、 Init()/Free() 呼び忘れや2重呼び出しも そうそう起こらないだろうから、コンストラクタやデストラクタ使ってもそんなにおいしくないの かもね。
- 859 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/27(日) 22:58:33.14 ID:In3d1Uaw.net]
- >>858
Cで作り始めてからC++にしたのでグローバル関数が自分的にしっくりきたという理由です。 合理的な理由はとくになく、個人の好みの範疇を出ないです。 >>857 続きをおきました。 ttp://gmdev.xrea.jp/st/up/246.txt ゲーム中で使う関数の使い方さえ変えなければ、実装はDirectInputでなくともよいかと思います。
- 860 名前:名前は開発中のものです。 mailto:sage [2011/03/27(日) 23:12:17.94 ID:BpzKp4Cl.net]
- 「趣味の範疇」なら何回もつっこまれないと思うけどなぁ
自分も「えー」って思ったし
- 861 名前: ◆UUwiUCL1P6 mailto:sage [2011/03/27(日) 23:39:29.93 ID:In3d1Uaw.net]
- >>860
クラスのないCで作ってから、あとでclass{}で括るとこんな感じになりますよ。 そこからC++ならではの形に作り変えるまでに至らずというところです。 >◆MBbNHCnf2Mさん この先こんな感じで趣味っぽいところが満載なので自分流に変更するなり、 他の意見を参考いただくなりで、そこは適当にやってください。 ウィンドウ表示⇒コントローラ入力と来たので、次は描画&ファイル読み込みですが、 ここから私としてはタスクシステムをご提案になります。 すごーく突っ込みが入るテーマのようなんで少々気が重いです。
- 862 名前:名前は開発中のものです。 mailto:sage [2011/03/28(月) 00:17:25.15 ID:Dt+tXZ6j.net]
- >>861
わかってるならやめとけばいいのに。どうせ必要性もないんだろ? やるなら自分でわかってる範囲の突っ込み所と、それでも敢えて押し通す意義(必要性)を 最初にひととおり明示しておけば、繰り返しツッコミが入ってグダグダになるのは避けられる、 かもしれない。
- 863 名前:名前は開発中のものです。 mailto:sage [2011/03/28(月) 00:29:53.10 ID:iY/f3p70.net]
- RPGの描画や更新なんてすることもタイミングも決まりきってるのにタスクシステムなんか何に使うんだよw
上の人も言ってるけど、まずどういうものを作ろうとしててそのためにこういう技術が必要だというのを はっきりさせてくれ
- 864 名前: ◆MBbNHCnf2M mailto:sage [2011/03/28(月) 00:30:16.73 ID:+ECkFPgj.net]
- >>861
自分的には分かりやすいので、全然問題ないです まあ、細かい実装はそれぞれのやり方があるでしょうからね 私なんかCにしてもC++にしても言語仕様も十分に理解しないまま やってるので、基本的に何でも参考になります 本当はちゃんと勉強した方が良いんでしょうけど タスクシステムは、確かにこの板のスレ見ると荒れてますね そもそも、タスクシステムの定義自体が曖昧というか 人によって微妙に違う感じですね タスクシステムは一度勉強してみたかったので、ちょうど良かったです
- 865 名前: ◆MBbNHCnf2M mailto:sage [2011/03/29(火) 22:24:52.26 ID:o6OtSixI.net]
- どうやら風邪をひいてしまったようで、喉が痛い
ところで話は今までの流れと急に変わりますけど 今時のRPGってアイテムのデータはどのように持ってるんだろう 昔なら、アイテム番号だけを持ってて(ゲーム全体で256個までなら1バイト 65536個までなら2バイト)、その番号からアイテムデータを参照してたけれど 例えば、武器にランダム性があって、ショートソードに+1とかの強さの幅がある場合 アイテム番号1がショートソード、アイテム番号2がショートソード+1みたいな のだと無駄にアイテムデータ増えるからあり得ないかな 昔だと、メモリも少ないし、データをセーブする媒体の容量も少ないから アイテムのインデックスだけを持っていたけれど、今はデータ全体を そのまま持っているのかな
- 866 名前: ◆MBbNHCnf2M mailto:sage [2011/03/29(火) 22:28:15.54 ID:o6OtSixI.net]
- 多分、基本となるデータのみ存在していて、入手時にそのデータ元に
ランダムで性能を確定させて、そのデータを全部を持ってるのか
- 867 名前:名前は開発中のものです。 mailto:sage [2011/03/29(火) 23:19:08.33 ID:W0uoKekZ.net]
- これだ!っていうデータ構造なんて無いんじゃないかな
ゲームごとにチューニングする必要があるわけで パフォーマンスに余裕があればリレーショナルデータベースとか使っちゃうのかな
- 868 名前:名前は開発中のものです。 mailto:sage [2011/03/30(水) 00:26:46.80 ID:jEpUZgct.net]
- アイテムのインスタンスに持たせた方がいいんじゃないかなぁ
手持ちの装備を強化できるようなシステムが追加したくなった場合とかやりやすいし
- 869 名前:名前は開発中のものです。 mailto:sage [2011/03/30(水) 01:14:37.31 ID:fixmLHL7.net]
- >>865
仕様に沿って素直なコードを組むのが最強。 リソース制約が顔を出しにくくなった「今時」ならこれでいいでしょ。 "Premature optimization is the root of all evil."
- 870 名前: ◆MBbNHCnf2M mailto:sage [2011/03/30(水) 20:18:14.12 ID:eH7gPhm2.net]
- >>867-869
やっぱりデータが変化するようなものだと、インデックスだけで 管理は無理ですね。よく考えたら当たり前の事だった。 まあ、今ならアイテム程度のバイナリデータいくつ持ってても 問題無いか。携帯とかモバイル環境だと制限あるかもしれないけど そんな環境だと、そもそもそれ程大規模のゲームも作らないだろうし。
- 871 名前:名前は開発中のものです。 mailto:sage [2011/04/03(日) 21:06:06.82 ID:t0UP3s0y.net]
- しーん
- 872 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 21:10:34.12 ID:wtGWHPRo.net]
- >>871
ちょうど今書こうと思ってた所です 今週は、風邪をひいてあまり集中して出来なかったので とりあえず、ポリゴン出したりテクスチャ貼ったりというのは理解したと思う これで音を出す以外の大体の事は何とかなるような気がする
- 873 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 21:17:09.28 ID:wtGWHPRo.net]
- で、マップスクロールについて考えていたんですけど
d.hatena.ne.jp/aidiary/20040918/1251373370 上記のサイトのRPGの項目にあるような、マップ全体を裏画面に描画して そこから表示画面分だけ切り出すという方法が結構検索していると 見つかるのに驚いたわけです これって結構スタンダードな方法なのかな? いくらメモリを気にしなくてもいいPC環境とはいえ、マップ全体を描画って あり得るのだろうか、少なくとも市販作品では無いような気がする
- 874 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 21:23:57.58 ID:wtGWHPRo.net]
- 昔はマップスクロールというと、RPG作成において一番の難所で
これが出来たらもうRPGは出来たも同然というような感じだった 特に私が使っていたMSXなんかだと、ハードウェアスクロール機能が 縦方向しかなかったので、1ドットスクロールは厳しかった 本当に最初の頃は、レイヤという概念も無くて(知らなかっただけかも) そもそもレイヤをいくつも重ね合わせられるほどの処理速度もメモリも無かった
- 875 名前:名前は開発中のものです。 mailto:sage [2011/04/03(日) 21:27:16.75 ID:/2gPwasz.net]
- 昔とかどうでもいい話してないでDirectX使えよ。
無理ならDXライブラリでも使え
- 876 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 21:32:21.82 ID:wtGWHPRo.net]
- そこで、どういう風にマップスクロールを実装していたかと言うと
裏画面に表示画面より、縦・横共にマップチップ1個分大きいマップを描画し そこから1ドットずつずらしてコピーするという方法だった ページフリッピングも出来ないわけではなかったけど、VRAM容量を考えると そんなもったいない方法は許されなかった 今でも縦・横でマップチップ一個分だけの裏画面からコピーするのが 定番だと思っていたけれど、マップ全体からコピーするという方法が 多く見つかるというのは、そっちの方が定番のかな
- 877 名前:名前は開発中のものです。 mailto:sage [2011/04/03(日) 21:34:32.01 ID:t0UP3s0y.net]
- >>873
256*256のマップだけで256MB消費ってのは普通じゃないと思う
- 878 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 22:04:18.84 ID:wtGWHPRo.net]
- >>877
そうですか、やはり普通じゃないのか 説明しやすいからそうしているのが多いのかな 今考えている方法は 用意すべき画面 1. 表示画面分の表・裏のサーフェイス(DirectX初期標準) 2. 最終的に合成する画面、ここから1ドットずつすらして裏サーフェイスにコピー (表示画面より縦・横1チップだけ大きい画面を確保) 3. レイヤを3つ使うとして、各レイヤ分の裏画面(これも表示画面より1チップ分だけ大きい) 4. マップチップ・キャラやNPC等のグラフィック 処理 1. まず、方向キーが押されたら、3の各レイヤ用の画面にマップ描画 2. 最下層のレイヤ分を2に画面にコピー 3. 最下層上にいるキャラクタ・NPCを2に描画 4. 2-3をレイヤ分処理 5. 2の画面から1の裏画面にコピーして裏画面を表に 6. 2-5までを1ドットずらして1チップ分処理 無駄がありそうだけれど、これでいけそうな気がする でもテクスチャって座標指定でコピーできないから 1ドットずつコピーするのが難しそうな気が もっとテクスチャについて勉強する必要がありそう
- 879 名前:名前は開発中のものです。 mailto:sage [2011/04/03(日) 22:06:51.98 ID:/2gPwasz.net]
- あのさ?座標にマイナスを指定できるの知ってる?
- 880 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 22:36:46.84 ID:wtGWHPRo.net]
- >>879
失礼、連続で5回以上書き込めないようで テクスチャ座標に負の値が使えるのは知ってます それをどこに使うんですか? まだ勉強中なので教えてください
- 881 名前:名前は開発中のものです。 mailto:sage [2011/04/03(日) 23:07:20.50 ID:mqRgK4Gz.net]
- あなたの文章を読んでいて思ったのだが。
まさか、一枚のテクスチャに複数のレイヤーを重ねて最終的に 画面に描画しようとしている? DirectXのバージョンをいくつ使うか知らないけど いくらなんでも概念が古すぎるよ。 (DirectDrawとか使おうとしてる?) WindiwsXPターゲットのDirectX9ならポリゴンまたはスプライト使えば解決できることを わざわざ難しい方法でやろうとしているように見える。 ここで説明するのは無理があるからいくつかサイトのURL貼っとく DirectX8の解説サイト rina.jpn.ph/~rance/directx8/index.html Microsoft本家のゲームプログラミング入門資料(数学の知識必須) msdn.microsoft.com/ja-jp/academic/cc998598 まさかとは思うがDirectX7ならこの辺り rina.jpn.ph/~rance/directx7/directx7study/index.html 入門者ならDirectXと言わずDXライブラリを使うのもありだと思う。 DXライブラリを使った解説サイト dixq.net/g/ あと、ネットの情報は色々不足な部分や整理されていないから 一冊、入門書を買うことをお勧めする。
- 882 名前:879 mailto:sage [2011/04/03(日) 23:08:21.00 ID:mqRgK4Gz.net]
- あれID変ったw
- 883 名前: ◆MBbNHCnf2M mailto:sage [2011/04/03(日) 23:49:00.27 ID:wtGWHPRo.net]
- 全然連続で書き込めない、この板人が少な過ぎるのか・・・
>>881 DirectX 9.0c でやろうと思ってます つまり、DirectDrawでなくて、DirectX Graphicsですね そのサイトも読んだんですけど、多分ポリゴンにテクスチャに貼り付けて 2Dの処理をするのがよく理解できてないんですね 特にテクスチャの扱いが多分よく分かってないので、勉強しときます ポリゴンに単純にテクスチャ貼るところまでは理解できてる(と思う)んですが
- 884 名前:名前は開発中のものです。 mailto:sage [2011/04/04(月) 00:57:26.26 ID:EfnOmkqq.net]
- だったら素直にD3DXのSprite使えばいいよ
表示範囲内のタイルを毎フレーム全て描画しなおせばいいだけ 一見効率悪そうだけど>>878よりは遥かに効率が良い
- 885 名前:名前は開発中のものです。 mailto:sage [2011/04/04(月) 01:16:24.28 ID:EfnOmkqq.net]
- 一つのレイヤ内で使われるタイルを一つの大きなテクスチャにまとめておいて
レイヤ全体を一つの図形とみなしてテクスチャ座標でマッピングするのが 多分一番速くて効率の良い方法 スプライトはそれと同じようなことを自動でやってくれるから 毎フレーム大量の描画を行ってもわりと速い
- 886 名前:名前は開発中のものです。 [2011/04/23(土) 16:35:48.28 ID:CvPk8hGJ.net]
- ゲーム制作メンバーを募集しています。
yuzuru.2ch.net/test/read.cgi/ff/1298538064/l50 www31.atwiki.jp/fftsukurou/ ・最近のFFが嫌い ・昔のFFが好き どちらかに当てはまれば誰でも結構です。 昔ながらのFFをみんなで作りましょう。
- 887 名前:名前は開発中のものです。 mailto:sage [2011/04/28(木) 16:06:00.10 ID:odTXZLNY.net]
- 募集要項の大雑把さにフイタ
- 888 名前: 忍法帖【Lv=18,xxxPT】 mailto:sage [2011/05/05(木) 11:29:11.77 ID:Zs6VE70C.net]
- うん?
|

|