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

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

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

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

Processing

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

Q&A

3回答

4063閲覧

Processing、通信型シューティングゲームにて弾が発射されない

noberon

総合スコア17

Java

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

Processing

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

0グッド

1クリップ

投稿2019/05/08 01:57

編集2022/01/12 10:55

processingにて通信型シューティングゲームを作成しています。
ゲーム概要としては画面の上と下に横移動しか出来ない自機を2つ配置します。それぞれがスペースキーで弾を打ちます。弾の発射などの基本動作はサーバ側で制御し、クライアント側では自機の位置座標と打った弾の座標を送り、サーバから送られるサーバ側の自機や敵に関する座標を受け取り表示するコードを組みました。
サーバ側の動作はうまくいくのですが、クライアント側の自機から弾が発射されません。
自機の位置に弾を生成し、それを画面外出るまでfor文で回すというシンプルな方法を使っています。サーバ側は同じ概要のコードで正常に動作しているので、データの送受信もしくはクライアント側の弾に関する関数(PlayerMove,bombP2Move辺り)に問題があるとおもいます。デバックがわかりません。詳しい方教えてください。

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

サーバ側のコード

processing

1//ソケット通信のためのライブラリを読み込み 2import processing.net.*; 3Server server; 4//ポート番号を指定(今回は20000) 5int port = 20000; 6 7 8int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅 9int px2=240,py2=700,pw2=50,ph2=50;//プレイヤー2の座標と高さ幅 10 11 12 13int[] bPx1= new int[6]; //Player1弾 14int[] bPy1= new int[6]; 15int bcntS; //残弾表示 16int[] bPx2 = new int[6]; //Player2弾 17int[] bPy2= new int[6]; 18 19 20 21int bombWait; 22int keyKeep; //押下中のキー 23 24 25 26void setup(){ 27 //サーバを生成prot番ポートで立ち上げ 28 server = new Server(this, port); 29 30 size(600,800); 31 noStroke(); 32 frameRate(30); 33 34 gameInit(bPy1); //ゲーム初期化 35 gameInit(bPy2); 36} 37 38void draw(){ 39 background(100); 40 px1 = playerMove(bPx1,bPy1,px1,pw1); 41 rect(px1,py1,pw1,ph1); 42 rect(px2,py2,pw2,ph2); 43 bombP1Move(bPx1,bPy1); 44 FromC(); //クライアント側からデータ受け取る 45 ToC(); //クライアント側にデータを送る 46 47 48 49} 50void FromC(){ 51 Client c = server.available(); 52 if(c != null) { 53 //改行コード('\n')まで読み込む 54 String msg = c.readStringUntil('\n'); 55 if (msg != null){ 56 //メッセージを空白で分割して配列に格納 57 String[] data = splitTokens(msg); 58 59 60 px2 = int(data[0]); 61 bPx2[0] = int(data[1]); bPx2[1] = int(data[2]); bPx2[2] = int(data[3]); 62 bPy2[0] = int(data[4]); bPy2[1] = int(data[5]); bPy2[2] = int(data[6]); 63 64 65 } 66 } 67} 68 69 void ToC(){ 70 //全てのデータの送信 71 String msg = px1+ " "+bPx1[0] + " " +bPx1[1] + " " + bPx1[2] +" "+bPy1[0] + " " +bPy1[1] + " " + bPy1[2] +" " + bcntS +'\n'; 72 print("server: " + msg); 73 //サーバが接続しているすべてのクライアントに送信 74 //(複数のクライアントが接続している場合は全てのクライアントに送信) 75 server.write(msg); 76 } 77 78 79void gameInit(int[] bPy){ 80 // keyy = 0; 81 //px1 =240; 82 83 84 for(int i =0; i<12; i++){ 85 //ef[i] = 2; 86 87 } 88 for(int i=0; i<6; i++){ 89 bPy[i] = -20; //-20:未使用 90 91 } 92 bombWait = 0; 93 keyKeep = 0; 94 95 96 97} 98void gameTitle(){ 99 //keyy =1; 100} 101 102void gamePlay(){ 103 px1 = playerMove(bPx1,bPy1,px1,pw1); 104 rect(px1,py1,pw1,ph1); 105 106 rect(px2,py2,pw2,ph2); 107 bombP1Move(bPx1,bPy1); 108 109} 110 111 112int playerMove(int[] bPx,int[] bPy,int px,int pw){ 113 114 if( ( keyKeep == LEFT) && (px>0) ){ 115 px -= 3; 116 } 117 if( ( keyKeep == RIGHT) &&(px <600-pw) ){ 118 px += 3; 119 } 120 // } 121 if( bombWait>0){ 122 bombWait--; 123 } 124 if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){ 125 bombWait =10; //10秒まち 126 bombP1Add(bPx,bPy,px,pw); 127 // bombP2Add(bPx,bPy,px,pw); 128 } 129 return px; 130 } 131 132void keyPressed(){ 133 if (key == CODED){ 134 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 135 keyKeep = keyCode; 136 } 137 } 138} 139void keyReleased(){ 140 if (key == CODED){ 141 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 142 keyKeep = 0; 143 } 144 } 145} 146 147 148 149 void bombP1Add(int[] bPx,int[]bPy,int px,int pw){ 150 for(int i=0; i<3; i++){ 151 if ( bPy[i] == -20){ //未使用の弾を使う 152 bPx[i] = px + (pw/2)-15; //Pの中心 153 bPy1[i] = 70; 154 break; //一発のみ 155 } 156 } 157 } 158 159void bombP1Move(int[] bPx,int[]bPy){ 160 int bcntS =3; 161 for(int i= 0; i<3; i++){ 162 if ( bPy[i] >0){ 163 bPy[i] += 5; 164 bcntS--; 165 } 166 if ( bPy[i] >800){ //画面上外 167 bPy[i] = -20; //未使用に戻す 168 } 169 rect(bPx[i],bPy[i]-8,30,30); 170 171 172 173 } 174 for(int i=0; i< bcntS; i++){ 175 rect( 230+i*26,10,25,25); 176 177 } 178} 179 180

クライアント側のコード(恐らくこちらに問題あり)

processing

1 2//ソケット通信のためのライブラリを読み込み 3import processing.net.*; 4Client client; 5 6//他のマシンに接続するときは適切に変更 7String serverAdder = "10.20.216.125"; 8//ポート番号を指定(今回は20000) 9int port = 20000; 10 11 12 13int px1=240,py1=50,ph1=50,pw1=50; //プレイヤー1の座標と高さ幅 14int px2=240,py2=700,pw2=50,ph2=50;//プレイヤー2の座標と高さ幅 15int[] bPx1= new int[6]; //Player1弾 16int[] bPy1= new int[6]; 17int[] bPx2 = new int[6]; //Player2弾 18int[] bPy2= new int[6]; 19 20int bombWait; 21int keyKeep; //押下中のキー 22 23 24void setup(){ 25//指定されたアドレスとポートでサーバに接続 26 client = new Client(this, serverAdder, port); 27 28 //サーバー側 29 size(600,800); 30 noStroke(); 31 frameRate(30); 32 33 gameInit(bPy1); //ゲーム初期化 34 gameInit(bPy2); 35} 36 37void draw(){ 38 background(100); 39 rect(px1,py1,pw1,ph1); //サーバ側プレイヤー 40 41 px2 = playerMove(bPx2,bPy2,px2,pw2); 42 rect(px2,py2,pw2,ph2); //クライアント側プレイヤー 43 44 bombP2Move(); //クライアント側の弾の動き 45 46 //サーバ側の弾の生成 47 int bcntS =3; 48 for(int i= 0; i<3; i++){ 49 rect(bPx1[i],bPy1[i]-8,30,30); 50 51 bcntS--; 52 } 53 //残弾の表記 54 for(int i=0; i< bcntS; i++){ 55 rect(230+i*26,10,25,25); 56 57 } 58 59 60 61 //サーバに送信するメッセージを作成 62 //空白で区切り末尾は改行 63 String msg = px2+" "+bPx2[0]+" "+bPx2[1]+" "+bPx2[2]+" "+bPy2[0]+" "+bPy2[1]+" "+bPy2[2]+"\n"; 64 print("server: " + msg); 65 //サーバが接続しているすべてのクライアントに送信 66 //(複数のクライアントが接続している場合は全てのクライアントに送信) 67 client.write(msg); 68 69 } 70 71 //サーバーからデータを受け取るたびに呼び出される関数 72void clientEvent(Client c) { 73 //サーバからのデータ取得 74 String msg = c.readStringUntil('\n'); 75 //メッセージが存在する場合 76 if (msg != null) { 77 //改行を取り除き,空白で分割して配列に格納 78 String[] data = splitTokens(msg); 79 80 //int()で文字列から整数に変換 81 82 px1 = int(data[0]); bPx1[0] = int(data[1]); bPx1[1] = int(data[2]); bPx1[2] = int(data[3]); bPy1[0] = int(data[4]); bPy1[1] = int(data[5]); bPy1[2] = int(data[6]); 83 84 85 } 86} 87 88void gameInit(int[] bPy){ 89 90 for(int i=0; i<6; i++){ 91 bPy[i] = -20; //-20:未使用 92 93 } 94 bombWait = 0; 95 keyKeep = 0; 96 97} 98 99 100 101 //クライアント側の弾の動き 102void bombP2Move(){ 103 int bcnt =3; 104 for(int i= 0; i<3; i++){ 105 if ( bPy2[i] >0){ 106 bPy2[i] -= 5; 107 bcnt--; 108 } 109 if ( bPy2[i] >0){ //画面上外 110 bPy2[i] = -20; //未使用に戻す 111 } 112 rect(bPx2[i],bPy2[i]+8,30,30); 113 114 } 115 for(int i=0; i< bcnt; i++){ 116 rect(230+i*26,750,25,25); 117 118 } 119} 120 121 122 123int playerMove(int[] bPx,int[] bPy,int px,int pw){ //**** void → int 124 // if( (keyPressed == true) && (key == CODED) ){ 125 if( ( keyKeep == LEFT) && (px>0) ){ 126 px -= 3; 127 } 128 if( ( keyKeep == RIGHT) &&(px <600-pw) ){ 129 px += 3; 130 } 131 // } 132 if( bombWait>0){ 133 bombWait--; 134 } 135 if( (keyPressed == true) && (key == ' ' ) && (bombWait == 0) ){ 136 bombWait =10; //10秒まち 137 //bombP1Add(bPx,bPy,px,pw); 138 bombP2Add(); 139 // bombP2Add(bPx,bPy,px,pw); 140 } 141 return px; 142 } 143 144 //クライアント側の弾追加発射 145 void bombP2Add(){ 146 //void bombP2Add(int[] bPx,int[]bPy,int px,int pw){ 147 for(int i=0; i<3; i++){ 148 if ( bPy2[i] == -20){ //未使用の弾を使う 149 bPx2[i] = px2 + (pw2/2)-15; //Pの中心 150 bPy2[i] = 650; 151 break; //一発のみ 152 } 153 } 154 } 155 156 void keyPressed(){ 157 if (key == CODED){ 158 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 159 keyKeep = keyCode; 160 } 161 } 162} 163 164void keyReleased(){ 165 if (key == CODED){ 166 if( (keyCode == LEFT) || (keyCode == RIGHT) ){ 167 keyKeep = 0; 168 } 169 } 170} 171 172

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

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

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

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

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

guest

回答3

0

基本的な構造自体からかなり突っ込みどころが多いですね。
シューティングゲームは常に弾を発射している状態が多いので、打った弾の座標を送るのは設計的にまずい気がします。
自機の弾を発射する座標が決まっているのなら、スペースを押下を送信すれば同じように作れそうな気はします。

投稿2019/05/08 07:41

stdio

総合スコア3307

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

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

0

作成されているゲームに関して幾つもご質問されているようですが, こちらはデバックするところでは無いと思います.
「デバックの方法が分からない」ということでしたら, そのようなご質問をするほうが良いかと思います.

投稿2019/05/08 04:42

jimbe

総合スコア12543

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

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

noberon

2019/05/08 05:02

アドバイスありがとうございます。訂正してきます。
guest

0

//クライアント側の弾の動き void bombP2Move(){ (略) if ( bPy2[i] >0){ //画面上外 bPy2[i] = -20; //未使用に戻す } (略) }

ここはおかしくありませんか?

投稿2019/05/08 04:34

jimbe

総合スコア12543

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

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

noberon

2019/05/08 05:06

回答ありがとうございます。 画面下にある自機付近から生成され上に向かって発射される弾が画面の一番上まで行ったら未使用の状態にする。というコードなんですがどこがおかしいですか?
jimbe

2019/05/08 05:31

"noberon さんが 書いたつもりの仕様" を確認しているわけではありません. このコードがそのように書かれているかを調べるのがデバックの第一歩ですので, 思い込みやコメントに惑わされずに, コードを読んでみてください.
thkana

2019/05/08 07:03

合っているはずなのに動かない、と考えていると間違いを見落とします。動かないのだからどこかが間違っているはず、そう信じて探さないと。 bombP2Add()で爆弾を生成すると、 bPy2[i] = 650; ですね。これがbombP2Move()で if ( bPy2[i] >0){ でどういう挙動を引き起こしますか?
noberon

2019/05/08 07:23

あ、不等号の向きが逆ですね。お二人のおっしゃる通り思い込みでお手数をおかけしてすみません。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問