X



C++でRPGゲームを作成する
■ このスレッドは過去ログ倉庫に格納されています
0001じっち
垢版 |
04/11/23 07:14:50ID:CCsv+84e
少し前まではHSPで作ろうと思っていたのですが、HSPでRPGゲームを作るのは難しいらしいので、C++で作ろうと思います。
C++のプログラミングは初めてですので、みんなの力が必要です。
お願いします。
あと質問ですが、C++ってMMORPGつくれますか?
0757名前は開発中のものです。
垢版 |
2006/08/01(火) 04:11:10ID:lqTlZ2D0
きっと鬼ぃは喉を餅に詰まらせて診断だ
0760名前は開発中のものです。
垢版 |
2006/10/14(土) 17:56:19ID:TyTVrLwQ
ワロタ
0761名前は開発中のものです。
垢版 |
2006/10/26(木) 21:13:09ID:ssyUOzfl
C++でRPGシステムを作ろうと思っています。
汎用性重視で描画処理はすべてフレームバッファ(Win32ではDIBとして表示。LinuxとかMacは知らんw)。
フォントも安心して使える固定サイズのフリーフォント内蔵で画面イメージも統一できます。
シナリオエディタも搭載、ツクール感覚でオリジナルのRPGを作ることが可能。







設計書書くんで、誰かプログラミングしてください。
0763名前は開発中のものです。
垢版 |
2006/10/27(金) 15:19:29ID:PMSzIrz+
>>761
それは津クールXPやDxLib・SDLと何が違うんだ?
もし、おもしろそうなら、合間合間にcodingはしてもいいが。
0766名前は開発中のものです。
垢版 |
2007/04/12(木) 17:49:52ID:ZybyQoX6
>>764
今のレベルによるが、
ある程度も組めないようなら、本買ってきてそれに載ってるコードを読めるようになるとか
AngBandなどオープンソースの奴を頑張って読む。
その後は、何か2週間で作れるゲームを自力で作る(設計も自分でする)。

ここまで、できれば、あとはだいたいどんなRPGでも時間や物理的障害を除いて出来るようになると思うよ。
0767名前は開発中のものです。
垢版 |
2007/04/12(木) 17:50:34ID:bCgTq/qC
盛りage
0773名前は開発中のものです。
垢版 |
2008/10/04(土) 03:04:33ID:6CC7noIJ
world
0775名前は開発中のものです。
垢版 |
2009/03/04(水) 08:57:47ID:BIR8YGwO
RPGを作る前にミニゲームなどを作れるようにしたほうがいいよ。
ミニゲームで作った技術はRPGで応用できると思う
いきなり、 大作を作ろうとしても無理
0779名前は開発中のものです。
垢版 |
2010/08/04(水) 16:06:44ID:uZVXPzys
>>107 のサイトにあったマップエディタって誰か持ってない?

うっかり消してしまったから誰かうp頼む
0780名前は開発中のものです。
垢版 |
2010/09/13(月) 20:52:54ID:M+I9V0GA
旧態依然としたコマンド&ターン戦闘が激しくつまらないと思う今日この頃
0781名前は開発中のものです。
垢版 |
2010/10/14(木) 12:24:18ID:/y1Wbqlm
JavaScriptでも作れそう?

ttp://www.programmingmat.jp/game_dev/webgame_dev/mapevt.html
0784名前は開発中のものです。
垢版 |
2011/03/09(水) 22:15:31.71ID:hobFeZxC
このスレもらっていいかな?

C++とDirectXでRPGを作りたいんだが
誰か一から作り方を教えてくれる奇特な人はいる?
0786名前は開発中のものです。
垢版 |
2011/03/09(水) 23:38:44.90ID:hobFeZxC
>>785
おお、ありがたいです

とりあえずDirectXの知識とか皆無なので
ドラクエ1-4程度の2DRPGを作ってみようと思う
ゲーム性とか関係なく、コンパクトな物を完成させることを目標に
0787名前は開発中のものです。
垢版 |
2011/03/10(木) 00:15:24.30ID: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;
}
0788名前は開発中のものです。
垢版 |
2011/03/10(木) 00:23:55.03ID:zj8b7q7C
(787続き)
いろんなアプローチがあるかと思うのでいろんな意見を参考にされるとよいと思います。
わたしはまずはprintfから作るオールドタイプです。

あと、DirectXはver9しか知らないです。
VisualC++は使ったことないのでまったくわからないです。
0790名前は開発中のものです。
垢版 |
2011/03/10(木) 00:29:26.99ID:LV/Xv7hB
>>788
DirectXは9.0cで作ろうと思っているので、ちょうど良いです

自分はもっとオールドタイプですね
MSXの頃にプログラムしてたので、Windows環境はさっぱりです
まあVC++が吐き出すWin32APIの雛形くらいは理解できますが
0791名前は開発中のものです。
垢版 |
2011/03/10(木) 00:36:07.62ID:zj8b7q7C
次はとりあえずWindowを作成してしまいましょう。
WINDOWクラスに下記のメンバーを追加してください。

private:
HWND handle;
MSG message;
bool sync;

struct {
unsigned int X,Y,W,H;
unsigned int x,y,w,h;
} screen;

変数名とか関数名は自分のポリシーにあわせて変更してください。
0792名前は開発中のものです。
垢版 |
2011/03/10(木) 00:49:20.74ID:zj8b7q7C
メンバー関数を作成します。
public:
bool open( void );

ゲームの名称が決まっているならプロジェクト名をつけておくと愛着が湧きますよ。

#ifndef PROJECT
#define PROJECT "お好きな名前"
#endif

そろそろファイルを.hと.cppに分割したほうがよいかも知れません。
0793名前は開発中のものです。
垢版 |
2011/03/10(木) 00:51:12.61ID: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 );
0795名前は開発中のものです。
垢版 |
2011/03/10(木) 00:55:08.70ID: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という関数がないよ"でエラーになります。
0797名前は開発中のものです。
垢版 |
2011/03/10(木) 00:59:49.27ID:n38lezle
windows.hのインクルード前に
#define WIN32_LEAN_AND_MEAN
を入れておくとコンパイルが早くなったりとか
_WIN32_WINNTを定義しておかないと勝手にVistaとか7専用にされたりとか
0798名前は開発中のものです。
垢版 |
2011/03/10(木) 01:00:15.45ID: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 );
}

0799名前は開発中のものです。
垢版 |
2011/03/10(木) 01:04:37.18ID:zj8b7q7C
>>796
スクリーン用の定数定義を忘れていました。
WINDOWクラスに下記の定義を追加してください。

private:
enum {
SCREEN_W = 800,
SCREEN_H = 600,
};

数値はお好みで変更ください。
ファイルや環境変数で外部から取り込む方法もあるかと思いますが、
面倒くさいんでやってないです。最後の方で対応すればよいかと。
0800名前は開発中のものです。
垢版 |
2011/03/10(木) 01:14:43.71ID:LV/Xv7hB
>>798-799
できました
LRESULT CALLBACK WINDOW::Proc〜の行で
同じパラメーターの型で静的な、または動的なメンバー関数をオーバーロードできません。
とのエラー
0801名前は開発中のものです。
垢版 |
2011/03/10(木) 01:21:28.74ID:zj8b7q7C
>>800
すいません原因よくわからないです。
ProcをWINDOWクラスのメンバーから外して、単なる外部関数にしてみてください。
0803名前は開発中のものです。
垢版 |
2011/03/10(木) 01:30:45.13ID:zj8b7q7C
>>802
そうですか。。。コンパイラの差異かも知れないです。
先々、この手の差異でどうにもわからない場合は、
申し訳ないですが自己解決か他に助言を求めてください。

下記の2つのメンバー関数を追加してください。

private:
bool peek( void ); //ウィンドウのメッセージを処理します
bool sync( void ); //タイマーの同期を取ります
0805名前は開発中のものです。
垢版 |
2011/03/10(木) 01:39:12.81ID: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; }

とりあえず空関数を適当に作成しておきます。
0806名前は開発中のものです。
垢版 |
2011/03/10(木) 01:41:06.36ID:zj8b7q7C
>>804
あまり自分の色が出ないように自分のソースからそのまま名前を持ってこないようにしています。
すいませんが適宜お好みの命名規則で回避してください。
0807名前は開発中のものです。
垢版 |
2011/03/10(木) 01:47:57.19ID:zj8b7q7C
(806続き)
混乱するので、以降はそのまま持ってくるようにします。
sync変数と関数は下記になります。

private:
bool sync;

public:
bool Sync( void ) const { return sync; }
0808名前は開発中のものです。
垢版 |
2011/03/10(木) 01:51:46.72ID:LV/Xv7hB
>>807
そこまでできました

peekもpublicになりますか?
今のままだと静的関数なんでアクセスできないですけど
0809名前は開発中のものです。
垢版 |
2011/03/10(木) 01:53:56.05ID:zj8b7q7C
Peek関数の中でタイマーを処理しているので、WINDOWクラスに下記のメンバーを追加してください。

struct {
unsigned int old;
unsigned int now;
} time;

コンストラクターで初期化します。

WINDOW::WINDOW() {
timeBeginPeriod( 1 );
time.old = timeGetTime();
}

で、デストラクターで後始末します。

WINDOW::~WINDOW(){
timeEndPeriod( 1 );
}
0811名前は開発中のものです。
垢版 |
2011/03/10(木) 22:22:49.60ID: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;
}
0813名前は開発中のものです。
垢版 |
2011/03/11(金) 07:34:09.43ID:tT3vlqKS
>>812
VC++上でのデバッガー実行はよくわからないんで自前でやっていただくとして、
先々、デバッグ目的で何かを表示するのに、よくprintfとMessageBoxを使ったりします。

これらに加えて、Windows上で表示されるフォントがあると便利なので、
デバッグ用にSpriteによる文字表示を作成するのがよいかと思います。

SpriteはDirectXの機能を使います。
0815名前は開発中のものです。
垢版 |
2011/03/19(土) 10:31:39.54ID:zpjTizC+
皆様お元気でしょうか
ちょっとゴタゴタしてましたが、再開です

>>813
スプライトによる文字表示がよく分からなかったので
とりあえずDrawTextで文字列表示できました
まあ、とりあえずデバッグ用としてこれでいいかなと

>>814
VisualStudioだとそれでコンソール出力できるみたいですね
参考にします
0816名前は開発中のものです。
垢版 |
2011/03/19(土) 10:35:30.95ID:zpjTizC+
それにしても、意外とDirectX9の解説サイト少ないですね
8以前だと結構あるんですが

特にプログラマブルシェーダーに対応したサイトは少ない
固定機能パイプラインとかもう廃止なので使いたくないし

DirectXの知識は全くないので、情報が無いとなかなか進まない
0817名前は開発中のものです。
垢版 |
2011/03/19(土) 10:41:37.55ID:zpjTizC+
マップチップとかって、どうやって読み込むんだろう
RPGツクールVXなどを見てみると、マップチップ数に制限が無い

仮に32*32ドットのマップチップ数が65536個だとすると
RPGツクール仕様だと、横8個分のチップを縦方向に無限なので
256*262144ドットの巨大テクスチャとして読み込むのだろうか
こんな巨大なテクスチャ作れるのかな?
0818名前は開発中のものです。
垢版 |
2011/03/19(土) 11:54:43.83ID:tf/j5S+W
俺なら複数枚のテクスチャを切り替えて表示するかな >817
1枚目のテクスチャにあるチップを描画して、SetTextureで切り替えて2枚目とか
どんな方法がベストなのかは知らないけど
0819名前は開発中のものです。
垢版 |
2011/03/19(土) 12:16:09.47ID:zpjTizC+
>>818
なるほど、やはり適当な大きさに分割するのが良いんですね

昔のゲームなら全部VRAMに読み込んでコピーとか普通だったけど
今のゲームの規模ならそれはないですね
0820名前は開発中のものです。
垢版 |
2011/03/21(月) 11:39:21.38ID:t1zoR9O5
ここ数日DirectXの情報サイトばかり見ているけど
リソースの解放とか凄い面倒そうだ
ある程度フレームワーク化しなきゃ駄目なのかな

HLSLとかもさっぱりだし、先はかなり長そうだ・・・
0821名前は開発中のものです。
垢版 |
2011/03/21(月) 11:47:38.69ID:KbfIo3Ze
楽をしたいならOgreとかirrlichtとかDXLibとか高レベルライブラリを使うべき
Directxばかりに固執するといいことは何も無い
それに良いフレームワークに触れない限り、
自分でフレームワークを組み立てることなどできないしな
0822785
垢版 |
2011/03/23(水) 21:00:30.42ID:NMGIfDjO
Window表示が出来たなら、次は入力回りを整備するのがよいかと思います。
DirectInputでよいですかね?(他はわからないです)
0824名前は開発中のものです。
垢版 |
2011/03/23(水) 21:40:39.44ID:iioYpWXA
>>821
ゲーム自体をすぐに作りたいというよりは
DirectXと最近のゲームの作り方を勉強したいので
Win32API+DirectXでやっていきたいと思います

DXライブラリは便利そうですね、いずれこういうライブラリも作りたいです
0825785
垢版 |
2011/03/23(水) 22:48:06.18ID:NMGIfDjO
>>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の順に記載するとソースの見通しがよくなります。
0826名前は開発中のものです。
垢版 |
2011/03/24(木) 12:02:48.79ID:+jtjlJX2
入力関連なんてゲーム内で一つあればいいんだからグローバル関数でもなんでもいいよ
0828名前は開発中のものです。
垢版 |
2011/03/25(金) 00:33:52.87ID:DZniurx+
>>825
そこまで出来ました。

>>826-827
グローバル関数にすると、管理が面倒になりませんか?
フレームワークとかライブラリみたいな形にする時にも
メンバ関数の形の方が良いような気がしますが
0829名前は開発中のものです。
垢版 |
2011/03/25(金) 00:49:34.24ID:VJVVC59h
>>828
そりゃルート名前空間に直置きは最悪だが
名前空間でくくればまったく面倒ではない
むしろすべてクラスクラスと固執する思考はよくないと思われ
0831 ◆MBbNHCnf2M
垢版 |
2011/03/25(金) 01:00:08.60ID:DZniurx+
とりあえずトリップを付けてみる

>>829
C++で名前空間とか使ったこと無かったです

>>830
シングルトンってデザインパターンですか
そういうの考えてプログラム作ったこと無かったなぁ
ああ、でもMVCでObserverパターンだけ知ってたかも
0832 ◆MBbNHCnf2M
垢版 |
2011/03/25(金) 01:03:33.95ID:DZniurx+
ところで、すごく基本的な質問ですけど
staticなメンバ関数だと何が問題なんでしょう?

特に駄目だという理由が思い付かないんですけど
0833名前は開発中のものです。
垢版 |
2011/03/25(金) 02:00:59.85ID:t5g0UlGF
C++ でシングルトンなんか持ち出すくらいなら素直にグローバル変数にしといたほうがよくないか?
0834 ◆UUwiUCL1P6
垢版 |
2011/03/25(金) 08:07:59.07ID:iNPazjrA
>>828
私もゲームの作り方を勉強したいと思って、
DirectXをつい最近やり始めたという状況で、
自分のやった事を再確認的にお伝えするのが限界です。

いづれ追いつかれて飽和すると思いますので、
より抽象的な概念や高度な作法はいろいろな意見を参考にしてください。

ちなみにXXXXXの部分は何と命名しました?
0835 ◆MBbNHCnf2M
垢版 |
2011/03/25(金) 11:19:22.92ID:DZniurx+
>>834
クラス名は GameInput としておきました
0836名前は開発中のものです。
垢版 |
2011/03/25(金) 17:44:09.60ID:VJVVC59h
最初からデザイン云々いいだしても進まないから、
とりあえず動くことを目的としてけばええと思う
動き始めてからいくらでもデザインは改良できるし。
最初は処理の手順を覚えるのが先、
アルゴリズムの訓練をするのが先決
0837 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 10:36:17.74ID:pvmCllah
必要な変数(静的メンバ)を設定します。

.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;
}
0838 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 11:18:46.58ID:pvmCllah
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>が必要でした。
0839名前は開発中のものです。
垢版 |
2011/03/26(土) 11:36:25.84ID:oFPuFWap
デザインとか気にするんだったら、まずはDirectInputデバイスを晒すのをやめるべき。
入力を取得する関数かクラスを作って、直接デバイスにアクセスするのはその中だけに制限する。
0840 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 13:03:14.90ID:npmu6kKT
>>837
.cpp(GameInput.cppとしている)のnamespace内の定義は
現在のスコープでは定義できませんとなります
0841 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 14:20:22.37ID:pvmCllah
>>840
では、namespace{}での括りは外してしまってください。

0842 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 14:22:30.73ID:pvmCllah
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;
}
0843 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 14:36:20.30ID:npmu6kKT
>>842
SetCooperativeLevelの引数、Window.Handle()って
Handleって関数作ってないみたいです
0844 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 14:40:47.38ID:pvmCllah
WINDOWクラスに下記の関数を作成してください。

public:
const HWND Handle( void ) const { return handle; }

>>842
GameInput::Init
keyboard = NULL // ねんのため追加してください
input->CreateDevice( GUID_SysKeyboard, ...

GameInput::Free:
解放の順番は初期化と反対にしてください。

input初期化->keyboard初期化 〜 keyboard解放→input解放
0845 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 15:28:08.48ID:npmu6kKT
変数のスコープとかよく分からなくなってきた・・・

Window.Handle()のWindowって、最初の方で定義したWindow window;の
windowっていうインスタンスだと思うんですけど
GameInput::Initが書かれているファイルGameInput.cppからアクセスするには
インスタンスを渡すしかないと思うんですけど
そこの処理はまだ書いてませんよね?

あれ、それともなんか勘違いしてるかな
0848 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 16:40:45.61ID:pvmCllah
>>845
下記を宣言してください。

extern WINDOW window;

この先いろんなところで参照するので、ヘッダに記載した方がよいです。

(>>846)のような意見も出ていますし、ソースを断片的に記載していくのは効率や誤謬が出やすいので、
別の手段を検討したほうがよいかも知れません。
ブログかアップローダを指定いただければそちらでお渡ししますんで、
ご検討ください。

0849 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 16:53:57.96ID:pvmCllah
extern WINDOW Window; でした(最初大文字)

ソース全体でこれだけはグローバル変数にしています。
他の変数はクラスの静的メンバでprivateにしています(IDirectInput8* input等)。

ここに書いてやり取りするのは楽でいいんですけど先々難しそうですね。
スレッドのリサイクル法が適用されて日記帳扱いになればOKかも。
0850 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 17:11:30.81ID:npmu6kKT
>>846
>>1の書き込みとスレッドの中身を見る限り、このレベルからやっても
良いように感じましたが・・・
>>1さんもC++のプログラミングは初めてって書いてますし

>>848
確かにこのままソース書いていくのは難しいと感じてました
どんどん大きくなっていきますからね
とりあえず
http://gmdev.xrea.jp/
このアップローダが、この板でプログラムを作っている方々が
使用しているアップローダのようです
今後はここにソース置きましょうか

>>849
common.hみたいなヘッダを作成して
#include "WINDOW.h"
extern Window window;
として
WINDOWクラスにアクセスする必要があるクラス全部に
インクルードしたら良いんですね
0851 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 18:14:33.03ID:pvmCllah
>>850
gmdevにDirectInputの.h/.cppを置きました。
ttp://gmdev.xrea.jp/st/up/245.txt

>common.hみたいなヘッダ
そうです。自分専用のマクロとか定義とかの置き場にヘッダ作りますよね。
そこに入れておいてください。

ついでに↓もお願いします。
#define ARRAY(a) (sizeof(a)/sizeof(a[0]))
配列の要素数のマクロです。


置いたソースですが現在の自分のソースからいろいろはしょって整形しているので、
部分的に文法がおかしくなったりで、エラーがでるかも知れません。
それはすいませんがうまく直してください。
0852 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 18:47:47.52ID:npmu6kKT
>>851
すごく見やすいソースですね、大体の感じは理解出来ました

GameInput.cppのunsigned int GameInput::index;で
静的でないメンバーはクラスの外側で定義できませんと出たので
ヘッダの宣言でstatic付けときましたけど、staticにして大丈夫ですか?

それと、DATA_MAXが未定義だったので、適当に#define DATA_MAX 256
と、とりあえずしておきました

以上でコンパイルできました
これからじっくりとソース見ていきたいと思います
0853 ◆MBbNHCnf2M
垢版 |
2011/03/26(土) 18:59:27.28ID:npmu6kKT
今ソース眺めてたら
enum { DATAMAX = 0x100, };ってあるけど
これがDATA_MAXかな?
0854 ◆UUwiUCL1P6
垢版 |
2011/03/26(土) 19:15:55.16ID:pvmCllah
>>852
index は static です。付け忘れました。

>>853
DATA_MAXです。記述ミス。

入力ワーク回りで間違い多いのは、現在その部分は環状リストで可変長で実装しているので、
急ごしらえで変更したためです。

一部、ヘッダにあって実装されていない関数(JoyPush等)は実際にゲーム中で使用する関数です。
これはGameInput.cppとは別ファイルにした方がよいです。

GameInput.cppはいったん完了するとほとんどいじらなくなります。
ライブラリィ化してもいいかも知れません。
0855名前は開発中のものです。
垢版 |
2011/03/27(日) 19:06:12.75ID:7F6awSJl
>>825
> InitとFreeの中身は対称(確保⇔解放)になる事が多いです。

なんでコンストラクタとデストラクタ使わないの?
0856 ◆UUwiUCL1P6
垢版 |
2011/03/27(日) 22:08:40.18ID:In3d1Uaw
>>855
インスタンスを作成しないからです。メンバーは変数も関数もstaticだけです。
インスタンスを作成できないように、privateでコンストラクタを記述しておくべきですね。
0857 ◆MBbNHCnf2M
垢版 |
2011/03/27(日) 22:25:46.92ID:rtEoqdWq
ここ二日でDirectInputについては大体理解できた気がする
今頃気が付いたけど、DirectInputって今後非推奨なのか
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況