質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

processing、サーバで作った配列データをクライアント側に送った際に正常に通信ができていないのかクライアント側の物体が動かない

受付中

回答 0

投稿

  • 評価
  • クリップ 1
  • VIEW 855

noberon

score 9

processingにて通信型シューティングゲームのための敵の動きを作っています。
敵の動きの概要としては、配列を用いてランダムに生成される敵が、画面中央部部分を横断しながら弾を発射するといった感じです。弾の発射などの基本動作はサーバ側で制御し、クライアント側では位置座標と打った弾の座標を送り、サーバから送られるサーバ側の自機や敵に関する座標を受け取り表示するコードを組みました。
サーバ側の動作はうまくいくのですが、クライアント側では敵が止まったまま動きません。
データの送受信もしくはクライアント側の敵に関するコードに問題があるとおもいます。詳しい方教えてください。

以前、自機の動きを含めたシューティングゲーム全コードに関する質問をしましたが、質問の幅が広すぎたので敵の動きに関する部分だけに焦点を当てて質問させてもらいます。https://teratail.com/questions/187947

サーバ側のコード

//ソケット通信のためのライブラリを読み込み
import processing.net.*;
Server server;
//ポート番号を指定(今回は20000)
int port = 20000;


float[] ex =new float[12]; //敵の座標
int[] ey = new int[12];
int[] ef = new int[12]; //フラグ  0:左方向  1:右方向 2:未使用
float[] ev = new float[12]; //敵の移動速度



int[] bEx = new int[20];  //Enemy弾
int[] bEy = new int[20];
int[] bEv = new int[20]; //E弾速度

int eA =0;
int bEA =0;

int bombWait;
int keyKeep; //押下中のキー

int scoreS = 0;
int scoreC = 0;

void setup(){
  //サーバを生成prot番ポートで立ち上げ
  server = new Server(this, port);

  size(600,800);
  noStroke();
  frameRate(30);

  gameInit(); //ゲーム初期化

}

void draw(){
  background(100);
  FromC();
   ToC();

    enemyMove();
  enemyDisp();
  enemyDisp();
  bombEMove();  

}
void FromC(){
  Client c = server.available();
  if(c != null) {
    //改行コード('\n')まで読み込む
    String msg = c.readStringUntil('\n');
    if (msg != null){
      //メッセージを空白で分割して配列に格納
      String[] data = splitTokens(msg);




    }
  }
}

    void ToC(){
    //全てのデータの送信
       String msg = ex[0] + " " + ex[1] + " " +  ex[2] + " "+ ex[3]+" "+ ex[4]+" "+ ex[5]+" " + ex[6]+ " " +  ex[7]+ " "+ ex[8]+" "+ ex[9]+
                              " "+ey[0] + " " + ey[1]  + " " +  ey[2] + " "+ ey[3]+" "+ ey[4]+" "+ ey[5]+" " + ey[6] + " " +  ey[7] + " "+ ey[8]+" "+ ey[9]+
                               " "+bEx[0] + " "+bEx[1] + " " + bEx[2]+ " "+bEx[3]+" "+ bEx[4]+" "+bEx[5]+" " + bEx[6] + " " + bEx[7]+ " "+ bEx[8]+" "+ bEx[9]+
                               " "+bEy[0] + " "+bEy[1] + " " + bEy[2]+ " "+bEy[3]+" "+ bEy[4]+" "+bEy[5]+" " + bEy[6]  + " " +  bEy[7]+ " "+ bEy[8]+" "+ bEy[9]+'\n';
      print("server: " + msg);
      //サーバが接続しているすべてのクライアントに送信
      //(複数のクライアントが接続している場合は全てのクライアントに送信)
      server.write(msg);
    }


void gameInit(){



 for(int i =0; i<12; i++){
   ef[i] = 2;

   }

   bombWait = 0;
   keyKeep = 0;

   for(int i=0; i<20; i++){
     bEy[i] = -20;  //-20:未使用
   }

}

//int px,int py,int pw,int ph,int[]bPx,int[]bPy
void gamePlay(){




}




void enemyMove(){
  for(int i=0; i<12; i++){
    ex[i] += ev[i];
    if( (ef[i] ==0) && (ex[i] < -50)  ){
      ef[i]= 2;  //画面外皮表示
    }
     if( (ef[i] ==1) && (ex[i] >600)  ){
      ef[i]= 2;  //画面外皮表示
    }
   }
   if ( random(1000)<20){ //敵の発生率
   enemyAdd();
   eA =1;
   } else{
     eA =0;
   }
}


void enemyDisp(){
  for(int i=0;  i<10; i++){
    if ( ef[i] <2){
      rect(ex[i],ey[i],50,50);
    }
    if ( (ef[i] < 2) && (random(2000)<10)  ){ //敵爆弾発生率
      bombEAdd(int  (ex[i]),  ey[i] );
      bEA = 1;
    }else{
      bEA = 0;
    }
  } 
}

  void enemyAdd(){
    for(int i=0; i<10; i++){
      if( ef[i] == 2){ //未使用の中から敵を追加
      ev[i] = random(0.5,2.5);
      if (random(100) <50){
        ef[i] = 0 ; //左
        ex[i] = 600;
        ev[i] =-ev[i] ;
      }
      else{
        ef[i] = 1;
        ex[i]= -80;
      }
      ey[i] = int(random(150,650));
      break;
      }
    }
  }







void bombEAdd(int  xx,  int  yy){
  for( int i=0;  i<10;  i++){
    if ( bEy[i] ==  -20){
      bEx[i] = xx +18;
      bEy[i] = yy;
      if(     random(100) < 50  ){
      bEv[i] = 1;
      }else{
         bEv[i] = -1;
      }
      break;
    }
  }
}

void bombEMove(){
  for( int i = 0;  i<10;  i++){
    //bEv[i] = 1;
   if (    (bEy[i] > 0)   ){
     //if(     random(100) < 50  ){
      bEy[i] -= bEv[i];
   // }
    //else{
    //  bEy[i] +=bEv[i];
    //}
   }
    if(( bEy[i] <= 0)   ||  ( bEy[i] >=800)  )  {
       //if(bEy[i] < 90)   {
      bEy[i]  = -20;
    }




    fill(0);
    rect(bEx[i],bEy[i],10,10);
   // image(bombP,bEx[i],bEy[i]-8,10,10);
  }
}

以下クライアント側です(おそらくこちらに問題あり)

//ソケット通信のためのライブラリを読み込み
import processing.net.*;
Client client;

//他のマシンに接続するときは適切に変更
String serverAdder = "10.20.216.125";
//ポート番号を指定(今回は20000)
int port = 20000;

float[] ex =new float[12]; //敵の座標
int[] ey = new int[12];
int[] ef = new int[12]; //フラグ  0:左方向  1:右方向 2:未使用
float[] ev = new float[12]; //敵の移動速度


int[] bEx = new int[20];  //Enemy弾
int[] bEy = new int[20];
int[] bEv = new int[20]; //E弾速度

int bombWait;
int keyKeep; //押下中のキー

int scoreS = 0;
int scoreC = 0;

void setup(){
//指定されたアドレスとポートでサーバに接続
  client = new Client(this, serverAdder, port);

  //サーバー側
  size(600,800);
  noStroke();
  frameRate(30);

  gameInit(); //ゲーム初期化

}

void draw(){
 background(100);


  ////サーバに送信するメッセージを作成
  ////空白で区切り末尾は改行
  //String msg = px2+" "+bPx2[0]+" "+bPx2[1]+" "+bPx2[2]+" "+bPy2[0]+" "+bPy2[1]+" "+bPy2[2]+"\n";
  //print("server: " + msg);
  ////サーバが接続しているすべてのクライアントに送信
  ////(複数のクライアントが接続している場合は全てのクライアントに送信)
  //client.write(msg);

 }

 //サーバーからデータを受け取るたびに呼び出される関数
void clientEvent(Client c) {
  //サーバからのデータ取得
  String msg = c.readStringUntil('\n');
  //メッセージが存在する場合
  if (msg != null) {
    //改行を取り除き,空白で分割して配列に格納
    String[] data = splitTokens(msg);

     //int()で文字列から整数に変換
     ex[0] = int(data[0]);   ex[1] = int(data[1]);  ex[2] = int(data[2]);   ex[3] = int(data[3]);  ex[4] = int(data[4]); ex[5] = int(data[5]);   ex[6] = int(data[6]);  ex[7] = int(data[7]);   ex[8] = int(data[8]);  ex[9] = int(data[9]);  
     ey[0] = int(data[10]);   ey[1] = int(data[11]);  ey[2] = int(data[12]);   ey[3] = int(data[13]);  ey[4] = int(data[14]); ey[5] = int(data[15]);   ey[6] = int(data[16]);  ey[7] = int(data[17]);   ey[8] = int(data[18]);  ey[19] = int(data[19]);  
      bEx[0] = int(data[20]);   bEx[1] = int(data[21]);   bEx[2] = int(data[22]);    bEx[3] = int(data[23]);   bEx[4] = int(data[24]);  bEx[5] = int(data[25]);    bEx[6] = int(data[26]);   bEx[7] = int(data[27]);    bEx[8] = int(data[28]);   bEx[9] = int(data[29]);
      bEy[0] = int(data[30]);   bEy[1] = int(data[31]);   bEy[2] = int(data[32]);    bEy[3] = int(data[33]);   bEy[4] = int(data[34]);  bEy[5] = int(data[35]);    bEy[6] = int(data[36]);   bEy[7] = int(data[37]);    bEy[8] = int(data[38]);   bEy[9] = int(data[39]);


  }
}

void gameInit(){


 for(int i =0; i<12; i++){
   ef[i] = 2;

   }

   bombWait = 0;
   keyKeep = 0;

   for(int i=0; i<10; i++){
     bEy[i] = -20;  //-20:未使用
   }
}



  void gamePlay(){

  //enemyMove();
  //enemyDisp(bPx1,bPy1);
  //enemyDisp(bPx2,bPy2);
  //bombP1Move(bPx1,bPy1);

  //bombEMove(px1,py1,pw1,ph1);
  //bombEMove(px2,py2,pw2,ph2);
  //scoreDisp();








}

////enemyMove ex,ev,ef
//if(eA ==1){
//  enemyAdd();
//}

////enemyDisp bPx,bPy
//if(bEA ==1){
//   bombEAdd(int  (ex[i]),  ey[i] );
//}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • asahina1979

    2019/05/08 12:04

    https://teratail.com/questions/187704 が解決していないからかと

    キャンセル

  • noberon

    2019/05/08 12:54

    ゴリ押しですが、配列の値を全部出してクライアント側へ送り、クライアント側でもう一度配列に格納するという形で一応データ通信はできました。
    そもそも前回の方とこちらで書いているコードは違います。

    キャンセル

  • thkana

    2019/05/08 16:06

    御自分の投稿を見直してみてください。
    そのプログラムでなにかが表示されたらその方が驚きます。

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Javaに関する質問
  • processing、サーバで作った配列データをクライアント側に送った際に正常に通信ができていないのかクライアント側の物体が動かない