Processing で2人対戦型シューティングゲームを作っています。サーバ側の動作はうまくいったのですが、クライアント側が動きません。
ゲーム概要としては画面の上と下に横移動しか出来ない自機を2つ配置します。それぞれがスペースキーで弾を打ちます。
画面中央にはランダムに動く敵を配置し、敵も弾を撃ちます。
プレイヤーは敵の攻撃を避けつつ敵を倒しスコアが高い方が勝ちと言ったものです。
弾の発射や当たり判定などの基本動作はサーバ側で制御し、クライアント側では自機の位置座標と打った弾の座標を送り、サーバから送られるサーバ側の自機や敵に関する座標を受け取り表示するコードを組んだのですが、データ通信がうまくいってないのかクライアント側が正常に表示されません。
説明が上手くできず申し訳ありませんが、以下のサーバ側のコードとクライアント側のコードを実行したら意味がわかると思います。(おそらくデータの送受信がうまくいってないと考えられます)
すみませんが詳しい方教えてください。
以下にサーバ側のコード、クライアント側のコードは回答への返信欄に載せてあります。
processing
1サーバー 2//ソケット通信のためのライブラリを読み込み 3import processing.net.*; 4Server server; 5//ポート番号を指定(今回は20000) 6int port = 20000; 7 8int keyy; //流れ管理 9PImage player1,player2,bg, bombP1,bombP2;// bP: プレイヤーの弾 10PImage[] enemy = new PImage[2]; 11 12int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅 13int px2,py2=700,pw2=50,ph2=50;//プレイヤー2の座標と高さ幅 14 15float[] ex =new float[12]; //敵の座標 16int[] ey = new int[12]; 17int[] ef = new int[12]; //フラグ 0:左方向 1:右方向 2:未使用 18float[] ev = new float[12]; //敵の移動速度 19 20int[] bPx1= new int[6]; //Player1弾 21int[] bPy1= new int[6]; 22int[] bPx2 = new int[6]; //Player2弾 23int[] bPy2= new int[6]; 24 25int[] bEx = new int[20]; //Enemy弾 26int[] bEy = new int[20]; 27int[] bEv = new int[20]; //E弾速度 28 29int eA =0; 30int bEA =0; 31 32int bombWait; 33int keyKeep; //押下中のキー 34 35int scoreS = 0; 36int scoreC = 0; 37 38void setup(){ 39 //サーバを生成prot番ポートで立ち上げ 40 server = new Server(this, port); 41 42 size(600,800); 43 noStroke(); 44 frameRate(30); 45 imgLoad(); 46 gameInit(bPy1); //ゲーム初期化 47 gameInit(bPy2); 48} 49 50void draw(){ 51 background(100); 52 //FromC(); 53 // ToC(); 54 55 56 if( keyy == 0){ 57 gameTitle(); 58 59 }else if( keyy == 1){ 60 61 gamePlay(); 62 }else if( keyy == 2){ 63 gameOver(); 64 } 65 66} 67void FromC(){ 68 Client c = server.available(); 69 if(c != null) { 70 //改行コード('\n')まで読み込む 71 String msg = c.readStringUntil('\n'); 72 if (msg != null){ 73 //メッセージを空白で分割して配列に格納 74 String[] data = splitTokens(msg); 75 76 77 px2 = int(data[0]); 78 bPx2[0] = int(data[1]); bPx2[1] = int(data[2]); bPx2[2] = int(data[3]); 79 bPy2[0] = int(data[4]); bPy2[1] = int(data[5]); bPy2[2] = int(data[6]); 80 81 82 } 83 } 84} 85 86 void ToC(){ 87 //全てのデータの送信 88 String msg = ex[0] + " " + ex[1] + " " + ex[2] + " "+ ex[3]+" "+ ex[4]+" "+ ex[5]+" " + ex[6] + " " + ex[7] + " "+ ex[8]+" "+ ex[9]+ 89 " "+ey[0] + " " + ey[1] + " " + ey[2] + " "+ ey[3]+" "+ ey[4]+" "+ ey[5]+" " + ey[6] + " " + ey[7] + " "+ ey[8]+" "+ ey[9]+ 90 91 " "+bEx[0] + " "+bEx[1] + " " + bEx[2]+ " "+bEx[3]+" "+ bEx[4]+" "+bEx[5]+" " + bEx[6] + " " + bEx[7]+ " "+ bEx[8]+" "+ bEx[9]+ 92 " "+bEy[0] + " "+bEy[1] + " " + bEy[2]+ " "+bEy[3]+" "+ bEy[4]+" "+bEy[5]+" " + bEy[6] + " " + bEy[7]+ " "+ bEy[8]+" "+ bEy[9]+ 93 " "+px1+ " "+bPx1[0] + " " +bPx1[1] + " " + bPx1[2] +" "+bPy1[0] + " " +bPy1[1] + " " + bPy1[2] +" "+scoreS+ " "+scoreC +" "+keyy+'\n'; 94 print("server: " + msg); 95 //サーバが接続しているすべてのクライアントに送信 96 //(複数のクライアントが接続している場合は全てのクライアントに送信) 97 server.write(msg); 98 } 99 100 101void gameInit(int[] bPy){ 102 keyy = 0; 103 //px1 =240; 104 105 106 for(int i =0; i<12; i++){ 107 ef[i] = 2; 108 109 } 110 for(int i=0; i<6; i++){ 111 bPy[i] = -20; //-20:未使用 112 113 } 114 bombWait = 0; 115 keyKeep = 0; 116 117 for(int i=0; i<20; i++){ 118 bEy[i] = -20; //-20:未使用 119 } 120 121} 122void gameTitle(){ 123 keyy =1; 124} 125//int px,int py,int pw,int ph,int[]bPx,int[]bPy 126void gamePlay(){ 127 px1 = playerMove(bPx1,bPy1,px1,pw1); 128 image(player1,px1,py1,pw1,ph1); 129 // px2 = playerMove(bPx2,bPy2,px2,pw2); 130 image(player2,px2,py2,pw2,ph2); 131 132 enemyMove(); 133 enemyDisp(bPx1,bPy1); 134 enemyDisp(bPx2,bPy2); 135 bombP1Move(bPx1,bPy1); 136 bombP2Move(bPx2,bPy2); 137 bombEMove(px1,py1,pw1,ph1); 138 bombEMove(px2,py2,pw2,ph2); 139 scoreDisp(); 140} 141void gameOver(){ 142 scoreDisp(); 143} 144 145void imgLoad(){ 146 player1 = loadImage("player2.png"); 147 player2 = loadImage("player1.png"); 148 enemy[0] =loadImage("敵.png"); 149 bombP1=loadImage("2弾.png"); 150 bombP2 =loadImage("1弾.png"); 151} 152int playerMove(int[] bPx,int[] bPy,int px,int pw){ //**** void → int 153 // if( (keyPressed == true) && (key == CODED) ){ 154 if( ( keyKeep == LEFT) && (px>0) ){ 155 px -= 3; 156 } 157 if( ( keyKeep == RIGHT) &&(px <600-pw) ){ 158 px += 3; 159 } 160 // } 161 if( bombWait>0){ 162 bombWait--; 163 } 164 if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){ 165 bombWait =10; //10秒まち 166 bombP1Add(bPx,bPy,px,pw); 167 // bombP2Add(bPx,bPy,px,pw); 168 } 169 return px; //**** 追加 170 } 171 172void keyPressed(){ 173 if (key == CODED){ 174 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 175 keyKeep = keyCode; 176 } 177 } 178} 179void keyReleased(){ 180 if (key == CODED){ 181 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 182 keyKeep = 0; 183 } 184 } 185} 186 187void enemyMove(){ 188 for(int i=0; i<12; i++){ 189 ex[i] += ev[i]; 190 if( (ef[i] ==0) && (ex[i] < -50) ){ 191 ef[i]= 2; //画面外皮表示 192 } 193 if( (ef[i] ==1) && (ex[i] >600) ){ 194 ef[i]= 2; //画面外皮表示 195 } 196 } 197 if ( random(1000)<20){ //敵の発生率 198 enemyAdd(); 199 eA =1; 200 } else{ 201 eA =0; 202 } 203} 204 205 206void enemyDisp(int[] bPx,int[] bPy){ 207 for(int i=0; i<10; i++){ 208 if ( ef[i] <2){ 209 image(enemy[0],ex[i],ey[i],50,50); 210 211 for(int j=0; j<6; j++){ 212 if( (bPx[j] < ex[i]+50) && (bPx[j]+25 > ex[i]) 213 && (bPy[j] < ey[i]+50) && (bPy[j]+25 > ey[i]) ){ 214 bPy[j] = -20; 215 ef[i] = 2; 216 scoreS +=10; 217 break; 218 } 219 220 } 221 222 } 223 if ( (ef[i] < 2) && (random(2000)<10) ){ //敵爆弾発生率 224 bombEAdd(int (ex[i]), ey[i] ); 225 bEA = 1; 226 }else{ 227 bEA = 0; 228 } 229 } 230} 231 232 void enemyAdd(){ 233 for(int i=0; i<10; i++){ 234 if( ef[i] == 2){ //未使用の中から敵を追加 235 ev[i] = random(0.5,2.5); 236 if (random(100) <50){ 237 ef[i] = 0 ; //左 238 ex[i] = 600; 239 ev[i] =-ev[i] ; 240 } 241 else{ 242 ef[i] = 1; 243 ex[i]= -80; 244 } 245 ey[i] = int(random(150,650)); 246 break; 247 } 248 } 249 } 250 251 void bombP1Add(int[] bPx,int[]bPy,int px,int pw){ 252 for(int i=0; i<3; i++){ 253 if ( bPy[i] == -20){ //未使用の弾を使う 254 bPx[i] = px + (pw/2)-15; //Pの中心 255 bPy1[i] = 70; 256 break; //一発のみ 257 } 258 } 259 } 260 261void bombP1Move(int[] bPx,int[]bPy){ 262 int bcnt =3; 263 for(int i= 0; i<3; i++){ 264 if ( bPy[i] >0){ 265 bPy[i] += 5; 266 bcnt--; 267 } 268 if ( bPy[i] >800){ //画面上外 269 bPy[i] = -20; //未使用に戻す 270 } 271 image(bombP1,bPx[i],bPy[i]-8,30,30); 272 273 274 } 275 for(int i=0; i< bcnt; i++){ 276 image(bombP1, 230+i*26,10,25,25); 277 } 278} 279 280void bombP2Move(int[] bPx,int[] bPy){ 281 int bcnt =3; 282 for(int i= 0; i<3; i++){ 283 if ( bPy[i] >0){ 284 bPy[i] -= 5; 285 bcnt--; 286 } 287 if ( bPy[i] >0){ //画面上外 288 bPy[i] = -20; //未使用に戻す 289 } 290 image(bombP2,bPx[i],bPy[i]+8,30,30); 291 //for(int e= 0; e<12; e++){ 292 // if( (bPx[i] < ex[e]+50) && (bPx[i]+25 > ex[e]) 293 // && (bPy[i] < ey[e]+50) && (bPy[i]+25 > ey[e]) ){ 294 // scoreS +=10; 295 296 // } 297 //} 298 299 } 300 for(int i=0; i< bcnt; i++){ 301 image(bombP2, 230+i*26,750,25,25); 302 } 303} 304 305void bombEAdd(int xx, int yy){ 306 for( int i=0; i<10; i++){ 307 if ( bEy[i] == -20){ 308 bEx[i] = xx +18; 309 bEy[i] = yy; 310 if( random(100) < 50 ){ 311 bEv[i] = 1; 312 }else{ 313 bEv[i] = -1; 314 } 315 break; 316 } 317 } 318} 319 320void bombEMove(int px,int py,int pw,int ph ){ 321 for( int i = 0; i<10; i++){ 322 //bEv[i] = 1; 323 if ( (bEy[i] > 0) ){ 324 //if( random(100) < 50 ){ 325 bEy[i] -= bEv[i]; 326 // } 327 //else{ 328 // bEy[i] +=bEv[i]; 329 //} 330 } 331 if(( bEy[i] <= 0) || ( bEy[i] >=800) ) { 332 //if(bEy[i] < 90) { 333 bEy[i] = -20; 334 } 335 336 if( (bEx[i] < px+pw) && (bEx[i]+10 >px) 337 && (bEy[i] < py+ph) && (bEy[i]+10 >py) ) { 338 bEy[i] = -20; 339 scoreS -=50; 340 } 341 342 343 fill(0); 344 rect(bEx[i],bEy[i],10,10); 345 // image(bombP,bEx[i],bEy[i]-8,10,10); 346 } 347} 348 349void scoreDisp(){ 350 textSize(24); 351 text( "score:"+scoreS, 10,25); 352 text( "score:"+scoreC, 10,770); 353 354}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。