###何に取り組んでいるか
Three.jsというjavaScriptのフレームワークでシューティングゲームを作っています。(Three.jsの文法自体はほとんどjavaScriptみたいなものだと思います)
###実装したい仕様
実装したい仕様としては、画面の左端に自機を配置しており、上下のみ動くことができます。また、弾は画面のスペースキーを押したら自機から右端方向へと発射されるという仕組みです。
###コード(抜粋)
※関係のない宣言、コードは一部端折って質問させていただきます。
javaScript
1function init(){ 2 const sprites = []; //弾(sprite)を格納するための配列 3 tick(); //毎秒描画される関数 4 5 window.addEventListener("keydown", handleKeydown); 6 function handleKeydown(event){ 7 var keyCode = event.keyCode; 8 //スペースキーを押したら弾(sprite)を作成 9 if (keyCode == 32) { 10 makeSprite(); 11 } 12 } 13 14 function makeSprite(){ 15 const sprite = new bullets(); 16 //box~は自機の座標 17 sprite.position.set(box.position.x, box.position.y); 18 sprites.push(sprite); 19 sprites.forEach(function(s) { 20 //画面に弾を追加(sceneはシーンのこと) 21 scene.add(s); 22 }); 23 } 24 25 //毎フレーム時に実行されるループイベントです 26 function tick() { 27 sprite.update(); 28 renderer.render(scene, camera); 29 requestAnimationFrame(tick); 30 } 31 } 32} 33 34 class bullets extends THREE.Mesh{ 35 //constructor()は省略 36 update(){ 37 //弾のx座標が画面幅を超えたら(spriteのdisposeの方法が不明) 38 if(this.sprite.position.x > 900){ //900は画面の右端と仮定(width) 39 40 }else{ 41 this.sprite.position.x += 10; 42 } 43 } 44}
現在困っていること
現在困っているのは、弾を打つ関数makeSprite()内にある、
jsx
1const sprite = new bullets();
という関数の扱いです。
現在のmakeSprite()内にspriteを宣言すると、弾はスペースキーを押した回数分だけscene上の自機の座標の上に生成されますが、tick()内にあるsprite.update()が機能しないため、弾は進みません。(spriteがスコープ外なので当然)
一方で、初期化関数init内で宣言すると、今度は最初の一発だけ想定通りに画面の端まで動いてくれます。しかし、スペースキーを押した際に複数発発射されることはなく、キーを押すたびに(x,y)=(900,現在のbox(自機)のy座標)に弾の位置が更新されます。
jsx
1function init(){ 2//キャンバスサイズを指定 3//レンダラー、カメラ、平行光源、シーン等を作成 4 //★【ここに宣言】 5 const sprite = new bullets(); 6 //弾(sprite)を格納するための配列 7 const sprites = []; 8 //毎秒描画される関数 9 tick();
試してみたこと
spriteにidを設定したり、spriteを格納したsprites配列をforeachで回してみるなど、色々と試しているのですが、自分の持っている知識と経験では限界で、想定通り動かすことはできていません。
bulletのクラス化につきましては以下の記事を参考にさせていただきました。
シューティングゲームで弾を連射したい
https://teratail.com/questions/85720
###やりたいこと
やりたいこととしては、とりあえず「スペースキーを押されたら自機からspriteを発射し、毎フレームx座標に+10しながら画面の右端に到達して止まる(スペースキーを何度も押されたら押された分だけ弾を生成し、同様に動く)」ということをやりたいです。
(弾が消える処理は自分で考えようと思っています)
どうかご教示の程をよろしくお願いいたします。
###補足
Processingだとdraw()関数のなかにぶっ込んでforループで入れ子構造にして回してあげると動いてくれますが、それをthree.jsで試した結果、キーを押した瞬間にいきなり右端に表示されました(あと処理が重たくなるような気がします)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/28 15:21
2021/11/28 15:36
2021/11/30 04:41