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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

0回答

367閲覧

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

noberon

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

1クリップ

投稿2019/05/08 02:34

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

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

サーバ側のコード

processing

1//ソケット通信のためのライブラリを読み込み 2import processing.net.*; 3Server server; 4//ポート番号を指定(今回は20000) 5int port = 20000; 6 7 8float[] ex =new float[12]; //敵の座標 9int[] ey = new int[12]; 10int[] ef = new int[12]; //フラグ  0:左方向  1:右方向 2:未使用 11float[] ev = new float[12]; //敵の移動速度 12 13 14 15int[] bEx = new int[20]; //Enemy弾 16int[] bEy = new int[20]; 17int[] bEv = new int[20]; //E弾速度 18 19int eA =0; 20int bEA =0; 21 22int bombWait; 23int keyKeep; //押下中のキー 24 25int scoreS = 0; 26int scoreC = 0; 27 28void setup(){ 29 //サーバを生成prot番ポートで立ち上げ 30 server = new Server(this, port); 31 32 size(600,800); 33 noStroke(); 34 frameRate(30); 35 36 gameInit(); //ゲーム初期化 37 38} 39 40void draw(){ 41 background(100); 42 FromC(); 43 ToC(); 44 45 enemyMove(); 46 enemyDisp(); 47 enemyDisp(); 48 bombEMove(); 49 50} 51void FromC(){ 52 Client c = server.available(); 53 if(c != null) { 54 //改行コード('\n')まで読み込む 55 String msg = c.readStringUntil('\n'); 56 if (msg != null){ 57 //メッセージを空白で分割して配列に格納 58 String[] data = splitTokens(msg); 59 60 61 62 63 } 64 } 65} 66 67 void ToC(){ 68 //全てのデータの送信 69 String msg = ex[0] + " " + ex[1] + " " + ex[2] + " "+ ex[3]+" "+ ex[4]+" "+ ex[5]+" " + ex[6]+ " " + ex[7]+ " "+ ex[8]+" "+ ex[9]+ 70 " "+ey[0] + " " + ey[1] + " " + ey[2] + " "+ ey[3]+" "+ ey[4]+" "+ ey[5]+" " + ey[6] + " " + ey[7] + " "+ ey[8]+" "+ ey[9]+ 71 " "+bEx[0] + " "+bEx[1] + " " + bEx[2]+ " "+bEx[3]+" "+ bEx[4]+" "+bEx[5]+" " + bEx[6] + " " + bEx[7]+ " "+ bEx[8]+" "+ bEx[9]+ 72 " "+bEy[0] + " "+bEy[1] + " " + bEy[2]+ " "+bEy[3]+" "+ bEy[4]+" "+bEy[5]+" " + bEy[6] + " " + bEy[7]+ " "+ bEy[8]+" "+ bEy[9]+'\n'; 73 print("server: " + msg); 74 //サーバが接続しているすべてのクライアントに送信 75 //(複数のクライアントが接続している場合は全てのクライアントに送信) 76 server.write(msg); 77 } 78 79 80void gameInit(){ 81 82 83 84 for(int i =0; i<12; i++){ 85 ef[i] = 2; 86 87 } 88 89 bombWait = 0; 90 keyKeep = 0; 91 92 for(int i=0; i<20; i++){ 93 bEy[i] = -20; //-20:未使用 94 } 95 96} 97 98//int px,int py,int pw,int ph,int[]bPx,int[]bPy 99void gamePlay(){ 100 101 102 103 104} 105 106 107 108 109void enemyMove(){ 110 for(int i=0; i<12; i++){ 111 ex[i] += ev[i]; 112 if( (ef[i] ==0) && (ex[i] < -50) ){ 113 ef[i]= 2; //画面外皮表示 114 } 115 if( (ef[i] ==1) && (ex[i] >600) ){ 116 ef[i]= 2; //画面外皮表示 117 } 118 } 119 if ( random(1000)<20){ //敵の発生率 120 enemyAdd(); 121 eA =1; 122 } else{ 123 eA =0; 124 } 125} 126 127 128void enemyDisp(){ 129 for(int i=0; i<10; i++){ 130 if ( ef[i] <2){ 131 rect(ex[i],ey[i],50,50); 132 } 133 if ( (ef[i] < 2) && (random(2000)<10) ){ //敵爆弾発生率 134 bombEAdd(int (ex[i]), ey[i] ); 135 bEA = 1; 136 }else{ 137 bEA = 0; 138 } 139 } 140} 141 142 void enemyAdd(){ 143 for(int i=0; i<10; i++){ 144 if( ef[i] == 2){ //未使用の中から敵を追加 145 ev[i] = random(0.5,2.5); 146 if (random(100) <50){ 147 ef[i] = 0 ; //左 148 ex[i] = 600; 149 ev[i] =-ev[i] ; 150 } 151 else{ 152 ef[i] = 1; 153 ex[i]= -80; 154 } 155 ey[i] = int(random(150,650)); 156 break; 157 } 158 } 159 } 160 161 162 163 164 165 166 167void bombEAdd(int xx, int yy){ 168 for( int i=0; i<10; i++){ 169 if ( bEy[i] == -20){ 170 bEx[i] = xx +18; 171 bEy[i] = yy; 172 if( random(100) < 50 ){ 173 bEv[i] = 1; 174 }else{ 175 bEv[i] = -1; 176 } 177 break; 178 } 179 } 180} 181 182void bombEMove(){ 183 for( int i = 0; i<10; i++){ 184 //bEv[i] = 1; 185 if ( (bEy[i] > 0) ){ 186 //if( random(100) < 50 ){ 187 bEy[i] -= bEv[i]; 188 // } 189 //else{ 190 // bEy[i] +=bEv[i]; 191 //} 192 } 193 if(( bEy[i] <= 0) || ( bEy[i] >=800) ) { 194 //if(bEy[i] < 90) { 195 bEy[i] = -20; 196 } 197 198 199 200 201 fill(0); 202 rect(bEx[i],bEy[i],10,10); 203 // image(bombP,bEx[i],bEy[i]-8,10,10); 204 } 205} 206 207

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

//ソケット通信のためのライブラリを読み込み 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] ); //}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

noberon

2019/05/08 03:54

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

2019/05/08 07:06

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問