2012年6月14日木曜日

勉強(ゲームプログラマになる前に覚えておきたい技術)

ゲームを作っていても、プログラム的には上達する部分が少ないと思うので、
結構前に買ってちょっとしかやっていなかった
「ゲームプログラマになる前に覚えておきたい技術」という本で勉強しようと思います。

今は、アンドロイドで作っているし,言語はjavaだし、Openglだしと
つながっている部分はゲームプログラムという点しかないけれど、すこしでも上達すればという思いでやろうと思います。


チャプター1からチャプター27まであるんですが、前に2まではやってあったので3からスタートすることにしました。


しかし、しばらくC++とvisualstdioを触っていなかったので使いにくいし、C++も結構忘れている、
コードを書こうとするとjavaの書き方になってしまってなかなか進まないこともあり大変です。
C++は難しいというか使いこなすのが大変。


さらに勉強している途中で早速つまずきました。サンプルプログラムを実行してもゲームを動かすことができないんです。
ゲームを起動することはできるんですが、絵画面がでたままキー入力を受け付けずずっと更新状態のままで、おかしいなと思ってネットで探すも同じようなのはでてきません。

止まっていたのはNimotsuKunImageの以下の部分↓

cin >> input;

このcinはiostreamのcinではなくて、gamelibというオリジナルのライブラリーの関数でした。
その関数の中身を見てみると、

//StandardInput
StandardInput cin;
StandardInput::StandardInput() : mPrevEnterOn( false ){
}

StandardInput& StandardInput::operator>>( char& a ){
 a = '\0'; //初期値
 bool entered = false;
 while ( true ){ //無限ループ
  //スペース
  if ( GetAsyncKeyState( VK_SPACE ) & 0x8000 ){
   a = ' ';
   entered = true;
  }
  //0-9
  for ( char i = '0'; i <= '9'; ++i ){
   if ( GetAsyncKeyState( i ) & 0x8000 ){
    a = i;
    entered = true;
   }
  }
  //a-z
  for ( char i = 'A'; i <= 'Z'; ++i ){
   if ( GetAsyncKeyState( i ) & 0x8000 ){
    if ( GetAsyncKeyState( VK_SHIFT ) & 0x8000 ){
     a = i;
    }else{
     a = 'a' + ( i - 'A' );
    }
    entered = true;
   }
  }
  bool enterOn = ( ( GetAsyncKeyState( VK_RETURN ) & 0x8000 ) != 0 );
  if ( entered && enterOn && !mPrevEnterOn ){
   mPrevEnterOn = enterOn;
   break;
  }
  //ウィンドウから終了要請を受けているようなら抜ける
  bool alt = ( ( GetAsyncKeyState( VK_MENU ) & 0x8000 ) != 0 );
  bool f4 = ( ( GetAsyncKeyState( VK_F4 ) & 0x8000 ) != 0 );
  if ( alt && f4 ){
   Framework().requestEnd();
   break;
  }
  mPrevEnterOn = enterOn;
 }
 return *this;
}

となっており、よく見るとリターンキーを押さないと入力を受け付けないようになっていた。
さらにwhileで入力待ちになっていたから、更新されたままの状態になってしまっていた。

ということで、キーを入力した後にリターンキーを押せばちゃんと動かすことができました。
これを直すのに理解するのに時間がかかったし、これでとまったのは自分だけでしょう。
あーあ



0 件のコメント:

コメントを投稿