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系のプログラム