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

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

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

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

Q&A

解決済

1回答

1929閲覧

random関数の使い方について

miiso_soup

総合スコア7

Processing

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

0グッド

0クリップ

投稿2020/01/08 20:22

左の面からランダムに玉を飛ばすようにプログラムを組もうとしたのですが
一点からランダムに出現するだけになってしまいます。
その理由がイマイチ分かりません。

今のコードでは左面のランダムな地点からでなく、ただのランダムに出現するのみになってしまっているのでしょうか。
Ý座標の面からのランダム出現の方法が分かりません。
どなたかわかる人がおりましたらよろしくお願いします。

Java

1Bullet bullet; 2private Boss boss = new Boss(75, 35); 3private ArrayList<Bullet> danmaku = new ArrayList<Bullet>(); 4 5float[] z = new float[500]; 6 7void setup() { 8 size(420, 580); 9 10 frameRate(40); 11 12 noCursor(); 13 14 bullet = new Bullet(width/2, height/2, 10, 0, 0 ); 15 16 for (int r = 0; r < z.length; r++) { 17 z[r] = random(-1000,300); 18 } 19} 20 21void ship(int x, int y) { 22 23 noStroke(); 24 25 fill(255, 0, 0); 26 27 ellipse(mouseX, mouseY, 7.5, 7.5); 28} 29 30 31 32class Boss { 33 private int tx, ty; 34 private int dx, dy; 35 private long routine = 0; 36 Boss(int x, int y) { 37 tx = x; 38 ty = y; 39 dx = 1; 40 dy = -5; 41 } 42 void move() { 43 tx += dx; 44 ty += dy; 45 if (tx < 0 || tx > width) { 46 dx*= -1; 47 } 48 if (ty < 0 || ty > height) { 49 dy*= -1; 50 } 51 } 52 void doShinking() { 53 routine++; 54 if (routine % 10 == 0) { 55 move(); 56 } 57 if (routine % 30 == 0) { 58 danmaku.addAll(this.shot()); 59 println("#shot" +routine + ":" + tx + "," + ty); 60 } 61 } 62 ArrayList<Bullet> shot() { 63 ArrayList<Bullet> danmaku = new ArrayList(); 64 for (int i = 0; i < 360; i+= 11.5) { 65 double rad = radians(i); 66 danmaku.add(new Bullet(this.tx, this.ty, 10, Math.cos(rad), Math.sin(rad))); 67 } 68 return danmaku; 69 } 70} 71 72class Bullet { 73 74 private double tx, ty; 75 private final double tr; 76 private double dx, dy; 77 private boolean is_alive = true; 78 Bullet(double x, double y, double r, double temp_dx, double temp_dy ) { 79 tx = x; 80 ty = y; 81 tr = r; 82 dx = temp_dx; 83 dy = temp_dy; 84 } 85 boolean isAlive() { 86 return is_alive; 87 } 88 void update() { 89 tx += dx; 90 ty += dy; 91 if (Math.min(tx, ty) < 0) { 92 is_alive = false; 93 return ; 94 } 95 if (tx > width || ty > height) { 96 is_alive = false; 97 return ; 98 } 99 stroke(255, 0, 255); 100 101 fill(0, 0, 255); 102 103 ellipse((float)tx, (float)ty, (float)tr, (float)tr); 104 } 105} 106 107 108 109void draw() { 110 background(0); 111 for (int r = 0; r < z.length; r++) { 112 z[r] += 2; 113 float y = r * 0.5; 114 ellipse(z[r], width, 10, 10); 115 if(width >420 116 } 117 118 ship(mouseX, mouseY); 119 boss.doShinking(); 120 121 for (int i = danmaku.size() -1; i >= 0; i--) { 122 Bullet b = (Bullet)danmaku.get(i); 123 if (!b.isAlive()) { 124 danmaku.remove(i); 125 continue; 126 } 127 b.update(); 128 } 129 130 for (int r = 0; r < z.length; r++) { 131 z[r] += 2; 132 float y = r * 0.5; 133 ellipse(z[r], width, 10, 10); 134 } 135}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Java

1void draw() { 2 background(0); 3 for (int r = 0; r < z.length; r++) { 4 z[r] += 2; 5 float y = r * 0.5; 6 ellipse(z[r], width, 10, 10); //←ellipse(z[r], y, 10, 10);? 7 if(width >420 // コピペミス? 8 } 9 10 ship(mouseX, mouseY); 11 boss.doShinking(); 12 13 for (int i = danmaku.size() -1; i >= 0; i--) { 14 Bullet b = (Bullet)danmaku.get(i); 15 if (!b.isAlive()) { 16 danmaku.remove(i); 17 continue; 18 } 19 b.update(); 20 } 21 22 for (int r = 0; r < z.length; r++) { 23 z[r] += 2; 24 float y = r * 0.5; 25 ellipse(z[r], width, 10, 10);//←ellipse(z[r], y, 10, 10);? 26 } 27}

if文が途切れていて詳しくはわかりませんが、変数 y が使われていないようです

追記:

Java

1Bullet bullet; 2private Boss boss = new Boss(75, 35); 3private ArrayList<Bullet> danmaku = new ArrayList<Bullet>(); 4 5float[] z = new float[500]; 6float[] y = new float[500]; //左から流れる玉のy座標 7 8void setup() { 9 size(420, 580); 10 11 frameRate(40); 12 13 noCursor(); 14 15 bullet = new Bullet(width/2, height/2, 10, 0, 0 ); 16 17 for (int r = 0; r < z.length; r++) { 18 z[r] = random(-1000,300); 19 y[r] = random(height); //乱数(0~height)で初期化 20 } 21} 22 23void ship(int x, int y) { 24 25 noStroke(); 26 27 fill(255, 0, 0); 28 29 ellipse(mouseX, mouseY, 7.5, 7.5); 30} 31 32 33 34class Boss { 35 private int tx, ty; 36 private int dx, dy; 37 private long routine = 0; 38 Boss(int x, int y) { 39 tx = x; 40 ty = y; 41 dx = 1; 42 dy = -5; 43 } 44 void move() { 45 tx += dx; 46 ty += dy; 47 if (tx < 0 || tx > width) { 48 dx*= -1; 49 } 50 if (ty < 0 || ty > height) { 51 dy*= -1; 52 } 53 } 54 void doShinking() { 55 routine++; 56 if (routine % 10 == 0) { 57 move(); 58 } 59 if (routine % 30 == 0) { 60 danmaku.addAll(this.shot()); 61 println("#shot" +routine + ":" + tx + "," + ty); 62 } 63 } 64 ArrayList<Bullet> shot() { 65 ArrayList<Bullet> danmaku = new ArrayList(); 66 for (int i = 0; i < 360; i+= 11.5) { 67 double rad = radians(i); 68 danmaku.add(new Bullet(this.tx, this.ty, 10, Math.cos(rad), Math.sin(rad))); 69 } 70 return danmaku; 71 } 72} 73 74class Bullet { 75 76 private double tx, ty; 77 private final double tr; 78 private double dx, dy; 79 private boolean is_alive = true; 80 Bullet(double x, double y, double r, double temp_dx, double temp_dy ) { 81 tx = x; 82 ty = y; 83 tr = r; 84 dx = temp_dx; 85 dy = temp_dy; 86 } 87 boolean isAlive() { 88 return is_alive; 89 } 90 void update() { 91 tx += dx; 92 ty += dy; 93 if (Math.min(tx, ty) < 0) { 94 is_alive = false; 95 return ; 96 } 97 if (tx > width || ty > height) { 98 is_alive = false; 99 return ; 100 } 101 stroke(255, 0, 255); 102 103 fill(0, 0, 255); 104 105 ellipse((float)tx, (float)ty, (float)tr, (float)tr); 106 } 107} 108 109 110 111void draw() { 112 background(0); 113 /*不要?なのでコメントアウト 114 for (int r = 0; r < z.length; r++) { 115 z[r] += 2; 116 //float y = r * 0.5; 117 ellipse(z[r], y[r], 10, 10); 118 } 119 */ 120 121 ship(mouseX, mouseY); 122 boss.doShinking(); 123 124 for (int i = danmaku.size() -1; i >= 0; i--) { 125 Bullet b = (Bullet)danmaku.get(i); 126 if (!b.isAlive()) { 127 danmaku.remove(i); 128 continue; 129 } 130 b.update(); 131 } 132 133 134 for (int r = 0; r < z.length; r++) { 135 z[r] += 2; 136 if(z[r] > width + 10){ //玉が画面外に出たら 137 z[r] = random(-1000,-10); //画面左外に戻す 138 y[r] = random(height); 139 } 140 stroke(255, 0, 255); //輪郭線の色 141 fill(0,0,255); //玉の色 142 ellipse(z[r], y[r], 10, 10); //y座標に y[r]を使う 143 } 144}

左から流れる玉のy座標をランダムにしたいのであれば玉1つ1つのy座標を覚えておく必要があります。
ループさせるには x座標( z[r] )が width(画面横幅) + 10(玉の半径) を超えたら画面外に出ているので画面左外に戻す必要があります。

投稿2020/01/08 20:45

編集2020/01/08 21:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

miiso_soup

2020/01/08 20:55

返信ありがとうございます。 すみません、途切れているif分はミスです。 ちなみに、ある一点が集中して出現してしまうところの対処法は分かりますでしょうか。
miiso_soup

2020/01/08 20:58

加えて連続して出現させる方法も余裕がありましたらご教授願います。
退会済みユーザー

退会済みユーザー

2020/01/08 21:42

すみません私が勘違いしていたかもしれませんが、一点に出現してしまうというのは玉が重なってしまうということでしょうか? もし玉を重ならないように出したいのであれば少し難しくなってしまうので新しく質問したほうがいいかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問