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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

0回答

519閲覧

p5 ライブラリ オブジェクトプールが機能しないで無限に生成を繰り返す原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/09/19 03:32

提示コードの///コメント部内部のコードですが敵のバレットのオブジェクトプールを作って全部が現在描画中だったら新しいたまをArray配列に代入してそうじゃない場合は既にあるバレットを有効にして描画するというプログラムなのですが何故無限に生成を繰り返してしまうのでしょうか?
一度に画面に出るバレットは多くても40くらいです。
※文字数の関係で省略していますがUpdateが計算で Rendererが描画です。毎フレームです。またフレームレートは固定しています。

イメージ説明

p5 ライブラリ: https://p5js.org/

js

1 2let BulletType = {Enemy: 0,Player: 1}; //バレットタイプ 3let rand = [1,2,3,4,5,6,7,8,9,10]; 4 5 6class Bullet 7{ 8 constructor(pos,type) 9 this.c = color(0,0,0); 10 11 if(type === BulletType.Enemy) 12 { 13 this.c = color(200,0,0); 14 } 15 else if(type === BulletType.Player) 16 { 17 this.c = color(0,0,200); 18 }else 19 { 20 21 } 22 23 this.size = new Vector(5,5); 24 this.speed = 20; 25 this.position = pos; 26 this.alive = true; 27} 28 29Init(pos,type) 30{ 31 if(type == BulletType.Enemy) 32 { 33 this.c = color(200,0,0); 34 } 35 else if(type == BulletType.Enemy) 36 { 37 this.c = color(0,0,200); 38 } 39 40 this.position = pos; 41 this.alive = true; 42} 43 44Update() 45{ 46 this.position.y += this.speed; 47 48 if(this.position.y > 400 ) 49 { 50 this.alive = false; 51 } 52} 53 54Renderer() 55{ 56 fill(this.c); 57 if(this.alive == true) 58 { 59 rect(this.position.x,this.position.y,this.size.x,this.size.y); 60 } 61 62} 63 64} 65 66 67 68class Enemy 69{ 70 71constructor(pos) 72{ 73 this.position = pos; 74 this.alive = true; 75 this.size = 20; 76 this.bullet = new Array(); //Enemy Bullet 配列 77 this.b = 0; 78} 79 80// バレットのオブジェクトプール 81BulletInstance() 82{ 83 if(this.bullet.length === 0) 84 { 85 //console.log("初回 生成"); 86 this.bullet.push(new Bullet(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy)); 87 return; 88 } 89 90 this.bullet.forEach(item => 91 { 92 if(item.alive == false) 93 { 94 // console.log("有効"); 95 item.Init(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy); 96 return; 97 } 98 }); 99 100 //console.log("生成"); 101 this.bullet.push(new Bullet(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy)); 102 return; 103} 104 105 106Init(pos) 107{ 108 this.position = pos; 109 this.alive = true; 110 111 112} 113 114Update() 115{ 116 117 118 //console.log(random(rand)); 119 120 console.log(this.bullet.length); 121 122 if( (Math.floor( Math.random() * (100 + 1 - 0) ) + 0  % 100) == 0) 123 { 124 this.BulletInstance(); 125 } 126 127 if(this.bullet.length > 0) 128 { 129 this.bullet.forEach(item => 130 { 131 if(item.alive == true) 132 { 133 item.Update(); 134 } 135 136 }); 137 } 138} 139 140Renderer() 141{ 142 fill(color(255,0,0)); 143 144 triangle(this.position.x,this.position.y + this.size, 145 this.position.x - this.size,this.position.y - this.size, 146 this.position.x + this.size,this.position.y - this.size); 147 148 if(this.bullet.length > 0) 149 { 150 this.bullet.forEach(item => 151 { 152 if(item.alive == true) 153 { 154 item.Renderer(); 155 } 156 157 }); 158 } 159} 160 161} 162 163 164class Game 165{ 166 167//オブジェクトプール 168EnemyInstance(pos) 169{ 170 this.enemy.forEach(item => 171 { 172 173 if(item.alive === false) 174 { 175 item.Init(pos); 176 return; 177 } 178 179 180 }); 181 182 this.enemy.push(new Enemy(pos)); 183 return; 184} 185 186 187 188 189constructor() 190{ 191 192 this.enemy = new Array(); //Enemy 配列 193 this.playerBullet = new Array(); //player Bullet 配列 194 195 196 this.player = new Player(new Vector(500,600)); //Player 197 198 for(let i = 0; i< 10; i++) 199 { 200 this.EnemyInstance(new Vector(100 + 40 * i,100)); 201 } 202 203 204} 205 206 207 208Update() 209{ 210 this.player.Update(); //プレイヤー更新 211 212 //エネミー更新 当たり判定 213 this.enemy.forEach(item => 214 { 215 item.Update(); 216 if( (Collision.Circle(this.player.position,this.player.size,item.position,item.size) === true) && (item.alive === true) ) 217 { 218 item.Update(); 219 } 220 }); 221 222 223 224 225} 226 227 228Renderer() 229{ 230 this.enemy.forEach( item => item.Renderer()); 231 this.player.Renderer(); 232} 233 234 235 236 237 238 239} this.c = color(0,0,0); 240 241 if(type === BulletType.Enemy) 242 { 243 this.c = color(200,0,0); 244 } 245 else if(type === BulletType.Player) 246 { 247 this.c = color(0,0,200); 248 }else 249 { 250 251 } 252 253 this.size = new Vector(5,5); 254 this.speed = 20; 255 this.position = pos; 256 this.alive = true; 257 } 258 259 Init(pos,type) 260 { 261 if(type == BulletType.Enemy) 262 { 263 this.c = color(200,0,0); 264 } 265 else if(type == BulletType.Enemy) 266 { 267 this.c = color(0,0,200); 268 } 269 270 this.position = pos; 271 this.alive = true; 272 } 273 274 Update() 275 { 276 this.position.y += this.speed; 277 278 if(this.position.y > 400 ) 279 { 280 this.alive = false; 281 } 282 } 283 284 Renderer() 285 { 286 fill(this.c); 287 if(this.alive == true) 288 { 289 rect(this.position.x,this.position.y,this.size.x,this.size.y); 290 } 291 292 } 293 294} 295 296 297 298class Enemy 299{ 300 301 constructor(pos) 302 { 303 this.position = pos; 304 this.alive = true; 305 this.size = 20; 306 this.bullet = new Array(); //Enemy Bullet 配列 307 this.b = 0; 308 } 309/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 310 // バレットのオブジェクトプール 311 BulletInstance() 312 { 313 if(this.bullet.length === 0) 314 { 315 //console.log("初回 生成"); 316 this.bullet.push(new Bullet(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy)); 317 return; 318 } 319 320 this.bullet.forEach(item => 321 { 322 if(item.alive == false) 323 { 324 // console.log("有効"); 325 item.Init(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy); 326 return; 327 } 328 }); 329 330 //console.log("生成"); 331 this.bullet.push(new Bullet(new Vector(this.position.x,this.position.y + this.size + 10),BulletType.Enemy)); 332 return; 333 } 334 335////////////////////////////////////////////////////////////////////////////////////////////////////////////// 336 Init(pos) 337 { 338 this.position = pos; 339 this.alive = true; 340 341 342 } 343 344 Update() 345 { 346 347 //////////////////////////////////////////////////////////////////////////////////////////////////////////////// 348 //console.log(random(rand)); 349 350 console.log(this.bullet.length); 351 352 if( (Math.floor( Math.random() * (100 + 1 - 0) ) + 0  % 100) == 0) 353 { 354 this.BulletInstance(); 355 } 356//////////////////////////////////////////////////////////////////////////////////////////////////////////////// 357 if(this.bullet.length > 0) 358 { 359 this.bullet.forEach(item => 360 { 361 if(item.alive == true) 362 { 363 item.Update(); 364 } 365 366 }); 367 } 368 } 369 370 Renderer() 371 { 372 fill(color(255,0,0)); 373 374 triangle(this.position.x,this.position.y + this.size, 375 this.position.x - this.size,this.position.y - this.size, 376 this.position.x + this.size,this.position.y - this.size); 377 378 if(this.bullet.length > 0) 379 { 380 this.bullet.forEach(item => 381 { 382 if(item.alive == true) 383 { 384 item.Renderer(); 385 } 386 387 }); 388 } 389 } 390 391} 392 393 394class Game 395{ 396省略 397} 398

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

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

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

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

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

cx20

2021/09/19 04:18

断片的なコードだとデバッグも行えない為、回答が付かないのではないかと思います。 JSFiddle 等を利用すると、オンラインでコードが共有できるので試してみては如何でしょうか。 ■ JSFiddle - Code Playground https://jsfiddle.net/ > 無限に生成を繰り返す原因 デバッグ実行は試されました?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問