コンピュータを楽しもう!!

今、自分が面白くていろいろやってみたことを書き綴りたいと思います。連絡先はtarosa.yでgmail.comです。

DS2DS通信Test2

DSとDSのWiFi通信ですが、通信させながらもう少しゲームっぽいことができないかと思い、テストプログラムを作ってみました。

キャラを競争させるゲーム

MVPenというものを買ったので、手書きキャラを描いてみました。二台のDSでこのキャラを競走させてみます。Youtubeに通信中の動画を上げてみました。
http://youtube.com/watch?v=fhiAMO34KX4
最初は、二台のDSでそれぞれ押したボタンをやり取りしていたのですが、元々同期させていないので、ゲームとして成り立ちませんでした。そこで、二台のDSをマスタ機とサブ機に分けて、マスタ機がゲームを動かしてサブ機はキー入力と画面表示だけをさせるようなプログラムを作ってみました。

マスタ機側のプログラム

//**************************************************
// 2台を通信させて、キャラを相手より早くゴールさせるゲームです。
// マスタ機の処理プログラムです。キャラ移動計算とかは全て
// こちらでやっています。
//**************************************************
void	gameMaster( int sockNum )
{
int		key, keyb, recvd_len;
u8		sendText[4];
u8		recvText[4];
int		eflg = 0;
int		xa, xb;
int		s;
int		i;
int		keyCd[2];
u8		sendData[2] = { 11, 12 };

 while( eflg==0 ){
   //ゲームの初期化
   xa = xb = 184;			//キャラ1とキャラ2の初期位置設定
   s = 0;					//キャラ速度評価値
   key = keyb = 0;			//キー判定値
   for( i=0; i<4; i++ ){	sendText[i] = 0;	}
	
   drow( xa, xb );		//画面を描く

   ShinoPrintCenter( SubScreenA, 128, 12*8, (u8 *)"[A]ボタンでゲームスタート", RGB(0,0,31),0, 0 );
   keyCd[0] = KEY_A;
   WiFi_SelectKey( sockNum, keyCd, 1, sendData, false );	//[A]キー待ち

   swiWaitForVBlank();	

   while( true ){
     scanKeys();
     key = keysHeld();
     if( key!=0 ){	key = 1;	}	//キー入力があるときは 1、それ以外は 0
       //データ受信
       recvd_len = getRecvData( sockNum, recvText, 1, 0, 20000L );
       if( recvd_len==1 ){
         if( recvText[0]!=0 ){
           keyb = 1;	//相手がキー入力しているときは 1、それ以外は 0
         }
         else{
           keyb = 0;
         }
       }
       if( (key!=0 && keyb!=0) || (key==0 && keyb==0) ){ //キャラ速度評価値のセット
         s--;
       }
       else{
         s++;
       }
       //ちょっと、待ちを入れる
       for( i=0; i<6; i++ ){	swiWaitForVBlank();	}
       //キャラの移動距離計算**********
       if( s<=-1 ){
         xa--;
         xb -=2;
         if( s<-2 ){	s = -2;}
       }
       else if( s>=1 ){
         xa -= 2;
         xb--;
         if( s>2 ){	s = 2;	}
       }
       else{
         xa--;
         xb--;
       }			
       //******************************
       if( xa<=0 || xb<=0 ){
         if( xa<=0 ){
           sendText[0] = 0;
           sendText[1] = (u8)xb;
         }
         else{
           sendText[0] = (u8)xa;
           sendText[1] = 0;
         }
         sendText[2] = (u8)0x3;	//0x03がゲーム終わりの合図
         send( sockNum, sendText, 3, 0 ); //キャラ位置とゲーム終わりの合図を送信
         break;
       }
       else{
         sendText[0] = (u8)xa;
         sendText[1] = (u8)xb;
         sendText[2] = (u8)0x1;
         send( sockNum, sendText, 3, 0 );	//キャラ位置をサブ機に送信
       }
       drow( xa, xb );		//画面を描く
     }
     drow( xa, xb );		//画面を描く
     if( xa<=0 ){
       ShinoPrintCenter( SubScreenA, 128, 12*3, (u8 *)"A Win!", RGB(0,0,0),0, 0 );
     }
     else if( xb<=0 ){
       ShinoPrintCenter( SubScreenA, 128, 12*11, (u8 *)"B Win!", RGB(0,0,0),0, 0 );
     }
     else{
       ShinoPrintCenter( SubScreenA, 128, 12*8, (u8 *)"Drawn Game.", RGB(0,0,0),0, 0 );
     }
   ShinoPrintCenter( SubScreenA, 128, 12*14, (u8 *)"[START]で再ゲーム", RGB(31,31,31),RGB(0,0,0), 1 );
   ShinoPrintCenter( SubScreenA, 128, 12*15, (u8 *)"[SELECT]で終了", RGB(31,31,31),RGB(0,0,0), 1 );
   keyCd[0] = KEY_START;
   keyCd[1] = KEY_SELECT;
   eflg = WiFi_SelectKey( sockNum, keyCd, 2, sendData, true );	//[START]or[SELECT]キー待ち
 }
 ClearBGL( SubScreenA,   RGB(31,31,31) );
 //少し間をおく
 for( i=0; i<50; i++ ){	swiWaitForVBlank();	}
}

サブ機側のプログラム

//**************************************************
// 2台を通信させて、キャラを相手より早くゴールさせるゲームです。
// サブ機の処理プログラムです。マスタ機から送られてくるデータ
// に基づいて、キャラ表示を行っています。
//**************************************************
void	gameSub( int sockNum )
{
int		key, keyb, recvd_len;
u8		sendText[4];
u8		recvText[4];
int	eflg = 0;
int	xa = 0;
int	xb = 0;
int	i;
int		keyCd[2];
u8		sendData[2] = { 11, 12 };

 while( eflg==0 ){
 xa = xb = 184;			//キャラ1とキャラ2の初期位置設定
 key = keyb = 0;			//キー判定値
 for( i=0; i<4; i++ ){	sendText[i] = 0;	}
 drow( xa, xb );		//画面を描く
 ShinoPrintCenter( SubScreenA, 128, 12*8, (u8 *)"[A]ボタンでゲームスタート", RGB(0,0,31),0, 0 );
		
 keyCd[0] = KEY_A;
 WiFi_SelectKey( sockNum, keyCd, 1, sendData, false );	//[A]キー待ち

 swiWaitForVBlank();	

 while( true ){
   scanKeys();
   key = keysHeld();
   if( key!=0 ){	key = 1;	}	//キー入力があるときは 1、それ以外は 0
     //データ送信
     if( sendText[0]!=(u8)key ){ //1つ前に送信したデータと異なれば、キーデータの送信
       sendText[0] = (u8)key;
       send( sockNum, sendText, 1, 0 );
     }
     //データを3バイト受信
     recvd_len = getRecvData( sockNum, recvText, 3, 0, 60000L );
     if( recvd_len==3 ){
       xa = (int)recvText[0];
       xb = (int)recvText[1];
       drow( xa, xb );		//画面を描く
       if( recvText[2]==3 ){	break;	}	//3バイト目が3だったら、ゲーム終わり
     }
     else{
       swiWaitForVBlank();
     }
   }
   if( xa<=0 ){
     ShinoPrintCenter( SubScreenA, 128, 12*3, (u8 *)"A Win!", RGB(0,0,0),0, 0 );
   }
   else if( xb<=0 ){
     ShinoPrintCenter( SubScreenA, 128, 12*11, (u8 *)"B Win!", RGB(0,0,0),0, 0 );
   }
   else{
     ShinoPrintCenter( SubScreenA, 128, 12*8, (u8 *)"Drawn Game.", RGB(0,0,0),0, 0 );
   }
   ShinoPrintCenter( SubScreenA, 128, 12*14, (u8 *)"[START]で再ゲーム", RGB(31,31,31),RGB(0,0,0), 1 );
   ShinoPrintCenter( SubScreenA, 128, 12*15, (u8 *)"[SELECT]で終了", RGB(31,31,31),RGB(0,0,0), 1 );
   keyCd[0] = KEY_START;
   keyCd[1] = KEY_SELECT;
   eflg = WiFi_SelectKey( sockNum, keyCd, 2, sendData, true ); //[START]or[SELECT]キー待ち
 }
 ClearBGL( SubScreenA,   RGB(31,31,31) );
 //少し間をおく
 for( i=0; i<50; i++ ){	swiWaitForVBlank();	}
}

プログラムは明日アップしたいと思います。

感想
MVPenは結構面白いですね。

本当にやりたいことリスト

(ブログの終わりにやりたいことを書いておきたいと思います)

  • 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
  • Androidプログラム
  • Web系のプログラム