プログラムの互換性について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KURO

プログラムの互換性について

#1

投稿記事 by KURO » 17年前

ゲームプログラミングの本を買ったのですが、以下のプログラムとDXライブラリの互換性はありますか?
どっちで勉強するか悩んでます…
#include<windows.h>

#define APP_NAME TEXT("Sample_MainWindow")

LRESULT CALLBACK WindowProc (
	HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam
) {
	int iMsgID;

	switch(uMsg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		iMsgID = MessageBox(
			NULL , TEXT("ウィンドウを生成しますか?") ,
			((LPCREATESTRUCT)lParam)->lpszName , MB_YESNO
		);

		return (iMsgID == IDYES ? 0 : -1);
	}
	return DefWindowProc(hWnd , uMsg , wParam , lParam);
}

int WINAPI WinMain(
	HINSTANCE hInstance, HINSTANCE hPrevInstance,
	PSTR lpCmdLine, int nCmdShow
) {
	WNDCLASS wc;
	MSG msg;

	wc.style		= CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc	= WindowProc;
	wc.cbClsExtra	= 0;
	wc.cbWndExtra	= 0;
	wc.hInstance	= hInstance;
	wc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	wc.hCursor	= LoadCursor(NULL , IDC_ARROW);
	wc.hbrBackground	= (HBRUSH)COLOR_BACKGROUND + 1;
	wc.lpszMenuName	= NULL;
	wc.lpszClassName	= APP_NAME;

	if (!RegisterClass(&wc)) return 0;

	if (CreateWindow(
		APP_NAME , TEXT("WM_CREATE Sample") ,
		WS_OVERLAPPEDWINDOW | WS_VISIBLE,
		CW_USEDEFAULT , CW_USEDEFAULT,
		CW_USEDEFAULT  , CW_USEDEFAULT, 
		NULL , NULL , hInstance , NULL
	) == NULL) return 0;

	while(GetMessage(&msg , NULL , 0 , 0) > 0) {
		DispatchMessage(&msg);
	}

	return msg.wParam;
}
よろしくお願いします…

バグ

Re:プログラムの互換性について

#2

投稿記事 by バグ » 17年前

これは、Win32APIを使用したプログラムのようですね。
互換に関しては、やれない事はない…とだけ言っておきましょうか…。
ただし、DxLibはその辺りの事を意識せずCライクにコーディングできるように作られていますので、まずはイベントドリブン形式のWindowsプログラムの仕組みを勉強して理解しないと始まらないのではないでしょうか?

KURO

Re:プログラムの互換性について

#3

投稿記事 by KURO » 17年前

アドバイスありがとうございます!
確かに仕組みそのものを理解する必要があるみたいですね…;
あきらめず勉強します!
ありがとうございました~

ibis

Re:プログラムの互換性について

#4

投稿記事 by ibis » 17年前

DXLibの中でもWin32APIが使われていますから、本質的には同じものなんですけどね。
よって、互換性は一応あります。

Win32APIの方が拡張性が高く、DXLibの方が簡単です。
Win32APIはイベント駆動ですので、何か根本的に違うという印象を受けるかもしれません。
状態遷移が比較的面倒ですが、いろんなことができます。

KURO

Re:プログラムの互換性について

#5

投稿記事 by KURO » 17年前

なるほど、覚えてしまえばWin32APIの方が幅が広いわけですね…
しかしやはり今の段階では簡単な方から覚えて徐々に難易度を上げていく感じで勉強したいと思います^^;
ありがとうございます

tk-xleader

Re:プログラムの互換性について

#6

投稿記事 by tk-xleader » 17年前

描画関連については互換性は薄いような…

DxライブラリはDirectXを使っていますから…、Win32 APIの標準的な描画(GDI)とは全く異なると思います。

Mist

Re:プログラムの互換性について

#7

投稿記事 by Mist » 17年前

KUROさんが目的とするところがよくわからないのですが
ただゲームを作りたいだけであればDXLibを使うのは簡単でいいと思います。
が、ゲーム作りを通してWindowsプログラミングを学習したいというの
であればDXLibは使わないほうがいいと思います。
Windowsプログラミングの肝であるメッセージ処理がきれいにラッピングされているので
DXLibを使っていると、Win32APIを使ったプログラムをできるようにはならないです。

KURO

Re:プログラムの互換性について

#8

投稿記事 by KURO » 17年前

今までWindowsプログラムの本で勉強していたのでそれを止めず、DXライブラリを使わない方向で行きたいと思います…複雑な分やりがいもありそうですし
ただニコ動のムービーを見て憧れてDXライブラリに手を出そうかと思ったんです;
わかりやすいアドバイスとても参考になりました!!
で、DXライブラリでなくても質問って受け付けてますよね…

バグ

Re:プログラムの互換性について

#9

投稿記事 by バグ » 17年前

そうですね、DXライブラリを否定する訳ではありませんが(実際、相当に便利だとは思います)、DXライブラリ無しでもゲーム製作を行っていくつもりがあるのならば、その方がよいかもしれません。

Windowsプログラムではなく、ゲームの作り方そのものを勉強するのならば、余計な事を考えなくていいぶんDXライブラリを使用する方が楽だったりするんですけどね。

管理人

Re:プログラムの互換性について

#10

投稿記事 by 管理人 » 17年前

そうですね・・、DXライブラリに嵌りすぎると私のようになります・・・。

tk-xleader

Re:プログラムの互換性について

#11

投稿記事 by tk-xleader » 17年前

ちょっと面白そうだったので、Windowsプログラム的にDxライブラリを使うコードのサンプルを作ってみました。
#include"DxLib.h"

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,INT)
{
	HWND hMainWindow;
	LPCSTR wcname="DXLIBUSEMYWINDOW";

	WNDCLASSEX wcex={0};

	//ウィンドウクラスの初期化
	wcex.cbSize=sizeof(wcex);
	wcex.hInstance=hInstance;
	wcex.style =0;
	wcex.lpfnWndProc=WndProc;
	wcex.hIcon=wcex.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
	wcex.hCursor=LoadCursor(NULL,IDC_ARROW);
	wcex.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wcex.lpszClassName=wcname;

	RegisterClassEx(&wcex);
	
	//ウィンドウの生成。
	hMainWindow=CreateWindowA(wcname,"DxLib",
		WS_OVERLAPPED|WS_BORDER|WS_SYSMENU,
		CW_USEDEFAULT,CW_USEDEFAULT,640,480,
		NULL,NULL,hInstance,NULL);
	if(hMainWindow==NULL){
		MessageBox(NULL,"ウィンドウ生成に失敗","",MB_OK);
		return -1;
	}
	ShowWindow(hMainWindow,SW_SHOW);

	//Dxライブラリの初期化
	SetUserWindow(hMainWindow);
	SetUserWindowMessageProcessDXLibFlag(FALSE);
	if(DxLib_Init()==-1)return -1;
	
	//メッセージ処理
	MSG omsg;
	int ret_msg;
	while(1){
		ret_msg=GetMessage(&omsg,NULL,NULL,NULL);
		if(ret_msg==0|ret_msg==-1)break;
		TranslateMessage(&omsg);
		DispatchMessage(&omsg);
	}
	DxLib_End();
	return omsg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wp,LPARAM lp){
	switch(message){
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
		case WM_CREATE:
			break;
		case WM_PAINT:
			DrawLine(0,0,300,300,GetColor(255,255,255));
			break;
	}
	return DefWindowProc(hWnd,message,wp,lp);
}
描画処理は楽になりそうです。(だったら普通にDxライブラリ使えば? というツッコミはなしで)

実際にはもっと厳密に書かなくてはならないのですが、まぁ併用のサンプルということで、動くように作ってあります。

閉鎖

“C言語何でも質問掲示板” へ戻る