- C++でRPGゲームを作成する
787 :名前は開発中のものです。[sage]:2011/03/10(木) 00:15:24.30 ID:zj8b7q7C - >>786
まったく一からと仮定して下記を試してみてください。 #include <windows.h> #include <stdio.h> class WINDOW { public: WINDOW(); }; WINDOW window; WINDOW::WINDOW(){ AllocConsole(); freopen( "CONOUT$", "w", stdout ); freopen( "CONIN$", "r", stdin ); } int APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ){ printf( "hello world\n" ); do { ; } while ( 1 ); return 0; }
|
- C++でRPGゲームを作成する
788 :名前は開発中のものです。[sage]:2011/03/10(木) 00:23:55.03 ID:zj8b7q7C - (787続き)
いろんなアプローチがあるかと思うのでいろんな意見を参考にされるとよいと思います。 わたしはまずはprintfから作るオールドタイプです。 あと、DirectXはver9しか知らないです。 VisualC++は使ったことないのでまったくわからないです。
|
- C++でRPGゲームを作成する
791 :名前は開発中のものです。[sage]:2011/03/10(木) 00:36:07.62 ID:zj8b7q7C - 次はとりあえずWindowを作成してしまいましょう。
WINDOWクラスに下記のメンバーを追加してください。 private: HWND handle; MSG message; bool sync; struct { unsigned int X,Y,W,H; unsigned int x,y,w,h; } screen; 変数名とか関数名は自分のポリシーにあわせて変更してください。
|
- C++でRPGゲームを作成する
792 :名前は開発中のものです。[sage]:2011/03/10(木) 00:49:20.74 ID:zj8b7q7C - メンバー関数を作成します。
public: bool open( void ); ゲームの名称が決まっているならプロジェクト名をつけておくと愛着が湧きますよ。 #ifndef PROJECT #define PROJECT "お好きな名前" #endif そろそろファイルを.hと.cppに分割したほうがよいかも知れません。
|
- C++でRPGゲームを作成する
793 :名前は開発中のものです。[sage]:2011/03/10(木) 00:51:12.61 ID:zj8b7q7C -
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 );
|
- C++でRPGゲームを作成する
795 :名前は開発中のものです。[sage]:2011/03/10(木) 00:55:08.70 ID:zj8b7q7C - 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という関数がないよ"でエラーになります。
|
- C++でRPGゲームを作成する
798 :名前は開発中のものです。[sage]:2011/03/10(木) 01:00:15.45 ID:zj8b7q7C - >>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 ); }
|
- C++でRPGゲームを作成する
799 :名前は開発中のものです。[sage]:2011/03/10(木) 01:04:37.18 ID:zj8b7q7C - >>796
スクリーン用の定数定義を忘れていました。 WINDOWクラスに下記の定義を追加してください。 private: enum { SCREEN_W = 800, SCREEN_H = 600, }; 数値はお好みで変更ください。 ファイルや環境変数で外部から取り込む方法もあるかと思いますが、 面倒くさいんでやってないです。最後の方で対応すればよいかと。
|
- C++でRPGゲームを作成する
801 :名前は開発中のものです。[sage]:2011/03/10(木) 01:21:28.74 ID:zj8b7q7C - >>800
すいません原因よくわからないです。 ProcをWINDOWクラスのメンバーから外して、単なる外部関数にしてみてください。
|
- C++でRPGゲームを作成する
803 :名前は開発中のものです。[sage]:2011/03/10(木) 01:30:45.13 ID:zj8b7q7C - >>802
そうですか。。。コンパイラの差異かも知れないです。 先々、この手の差異でどうにもわからない場合は、 申し訳ないですが自己解決か他に助言を求めてください。 下記の2つのメンバー関数を追加してください。 private: bool peek( void ); //ウィンドウのメッセージを処理します bool sync( void ); //タイマーの同期を取ります
|
- C++でRPGゲームを作成する
805 :名前は開発中のものです。[sage]:2011/03/10(木) 01:39:12.81 ID:zj8b7q7C - 最終的に作成した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; } とりあえず空関数を適当に作成しておきます。
|
- C++でRPGゲームを作成する
806 :名前は開発中のものです。[sage]:2011/03/10(木) 01:41:06.36 ID:zj8b7q7C - >>804
あまり自分の色が出ないように自分のソースからそのまま名前を持ってこないようにしています。 すいませんが適宜お好みの命名規則で回避してください。
|
- C++でRPGゲームを作成する
807 :名前は開発中のものです。[sage]:2011/03/10(木) 01:47:57.19 ID:zj8b7q7C - (806続き)
混乱するので、以降はそのまま持ってくるようにします。 sync変数と関数は下記になります。 private: bool sync; public: bool Sync( void ) const { return sync; }
|
- C++でRPGゲームを作成する
809 :名前は開発中のものです。[sage]:2011/03/10(木) 01:53:56.05 ID:zj8b7q7C - Peek関数の中でタイマーを処理しているので、WINDOWクラスに下記のメンバーを追加してください。
struct { unsigned int old; unsigned int now; } time; コンストラクターで初期化します。 WINDOW::WINDOW() { timeBeginPeriod( 1 ); time.old = timeGetTime(); } で、デストラクターで後始末します。 WINDOW::~WINDOW(){ timeEndPeriod( 1 ); }
|
- C++でRPGゲームを作成する
810 :名前は開発中のものです。[sage]:2011/03/10(木) 07:13:10.95 ID:zj8b7q7C - >>808
Peekはpublicです。privateは間違いでした。 あと静的(static)ではないです。
|
- C++でRPGゲームを作成する
811 :名前は開発中のものです。[sage]:2011/03/10(木) 22:22:49.60 ID:zj8b7q7C - 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; }
|