前提・実現したいこと
CANVAS APIにてJavascriptの学習を行っております。
上の記述で消した2つの四角の上にも、まだブロックがある場合
(空中に浮いている状態になっているもの)をy += gravity して下のブロックがある箇所or地面まで持っていきたいと思っているのですが、思い詰まっています。
前回に引き続きですが、考え方・記述等ご助力頂ければ幸いです。
該当のソースコード(必要そうな個所を記載)
Javascript
1 let canvas = $("maingame"); 2 let ctx = canvas.get(0).getContext("2d"); //決まり文句 3 4 let canvasWidth = canvas.width(); 5 let canvasHeight = canvas.height(); 6 7 let playGame; 8 9 let playAnimation = false; 10 11 let score = 0; 12 let koWidth = 80; 13 let koHeight = 100; 14 15 let colors = ["rgb(240,255,240)", "rgb(81, 102, 107)", "rgb(92, 66, 123)", "rgb(39, 125, 160)"]; 16 17 18 let title = $("#title"); 19 let startButton = $("#startAnimation"); 20 let gameover = $("#gameover"); 21 let restart = $("#restart"); 22 let titleback = $("#titleback"); 23 24 //抽象化 25 function Shape(x, y, width, height, gravity, boxColor) { 26 this.x = x; 27 this.y = y; 28 this.width = width; 29 this.height = height; 30 this.gravity = gravity; 31 this.boxColor = boxColor; 32 33 this.fixed = false; //静止の有無 34 }; 35 36 Shape.prototype.update = function (others) { 37 //地面の設定 38 let ground = { 39 x: 100, 40 y: canvasHeight - 50, 41 width: canvasWidth - 200, 42 height: 0 43 } 44 //地面に触れるor触れないの処理 45 if (!this.fixed && this.collision(ground)) { 46 this.y = canvasHeight - this.height - 50; 47 48 if ((this.y > koHeight && this.x > koWidth && this.x + this.height < 49 canvasWidth - 50 koWidth)) {//エリア内に全て入っていればOK 51 score++; 52 return this.fixed = true; 53 } else {//エリア外に触れてるのでgameover演出 54 gameover.show(); 55 restart.show(); 56 playAnimation = false; 57 58 restart.click(function (e) { 59 location.reload(); 60 }); 61 } 62 } 63 64 if (this.fixed) return; 65 66 others.some(other => { 67 //他のShapeとの衝突確認 68 if (other.fixed && other.collision(this)) { 69 this.y = other.y - this.height; 70 71 if(this.boxColor === other.boxColor ){ 72 //同色が積まれたときに消す記述 73 this.number = 0; 74 this.x = baseX + 1; 75 this.y = baseY + 1; 76 this.width = 0; 77 this.height = 0; 78 79 other.x = baseX + 2; 80 other.y = baseY + 2; 81 other.width = 0; 82 other.height = 0; 83 score++ 84 85 /*if { 86 ここら辺で追記…? 87 88 }*/ 89 90 } 91 92 if (this.y > koHeight && this.x > koWidth && this.x + this.height < 93 canvasWidth - 94 koWidth) { 95 score++; 96 return this.fixed = true; 97 98 } else { 99 gameover.show(); 100 restart.show(); 101 playAnimation = false; //gameover演出 102 103 restart.click(function (e) { 104 location.reload(); 105 }); 106 } 107 } 108 }); 109 110 if (!this.fixed) { 111 this.y += this.gravity; 112 //1コマごとの変化の記述はここで 113 } 114 } 115 116 Shape.prototype.render = function (ctx) { 117 ctx.beginPath(); 118 ctx.fillStyle = this.boxColor; //物体の色、場所 119 ctx.rect(this.x, this.y, this.width, this.height); 120 ctx.fill(); 121 122 ctx.strokeStyle = "rgba(5, 5, 5, 0.9)"; 123 ctx.lineWidth = 1; 124 ctx.stroke(); 125 } 126 127 Shape.prototype.collision = function (shape) { 128 let rect1 = this, 129 rect2 = shape; 130 return rect1.x < rect2.x + rect2.width && 131 rect1.x + rect1.width > rect2.x && 132 rect1.y < rect2.y + rect2.height && 133 rect1.height + rect1.y > rect2.y; //衝突判定 134 } 135 /*ここから初期位置配置*/ 136 let shapes = new Array(); 137 138 function onClick() { //出現させるブロックの位置、大きさ、落ちる速度 139 let width = height = Math.floor(Math.random() * 80 + 30); 140 let x = event.clientX - blockP.offsetLeft - width / 2; 141 let y = 10; 142 let gravity = 5; 143 let boxColor = colors[Math.floor(Math.random() * colors.length)]; 144 145 shapes.push(new Shape(x, y, width, height, gravity, boxColor)); 146 } 147 148 shapes.addEventListener('click', onClick, false); 149 /*ここまで*/ 150 151 function animate() { 152 ctx.clearRect(0, 0, canvasWidth, canvasHeight); 153 ctx.drawImage(img, 100, 648, 400, 60); //土台 154 155 for (let shape of shapes) { 156 shape.update(shapes); 157 shape.render(ctx); 158 } 159 160 if (playAnimation === true) { 161 setTimeout(animate, 33); 162 }; 163 }; 164 165 animate();
試したこと
ここらへんで記載するのかなとは思ってます。(コメントアウトしてる部分)
othersがfixedになっていて、かつcollisionがふれていない対象を取れれば実装できるかと考えているのですが、
コメントアウトの部分だとothers.collisionがfunctionになっていない為エラーが発生してしまいました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/16 01:06
2020/07/16 11:12
2020/07/20 01:38