質問: 1) { fill(255,0,0); // 文字色 textSize(20); text("GameOver",20,20); noLoop(); } } ```
回答: > > 私がとった方法は、一つのゲーム中のvoid setup(),void draw()の中にもう一つのゲームのvoid draw(),void setup()の内容を書くというものです。 > > > 2つのゲームを組み合わせて、1つのゲームにしたいということですよね? 以下のようなコードでどうでしょうか。 ``` EnemyBall[] ball = new EnemyBall[7]; //敵ボールの定義 FriendBall frendball = new FriendBall(); float touch=0; class FriendBall { float frballx; //仲間ボールのx座標 float frbally; //仲間ボールのy座標 float frsp=0; //仲間ボールの速度 float fra=0; //仲間ボールの加速度 final float g = 3; FriendBall() { frballx = width / 2; } void latest() { frsp = frsp + g /30+fra; frbally += frsp; } void ballfun() { stroke(255,0,0); fill(255,0,0); ellipse(frballx, frbally, 30, 30); } void next() { frbally=-200; fra=0.0001; frsp=0; frballx=20 + random(465); } boolean isGameOver(){ return frbally > 665; } } class EnemyBall { //敵ボール PVector posi; //位置を定義 PVector ensp; //速度を定義 EnemyBall(float X, float Y, float enspX, float enspY) { posi = new PVector(X, Y); //向きベクトル ensp = new PVector(enspX, enspY); //速度ベクトル } void latest() { posi.add(ensp); //位置+速度 } void hitwall() { if ((posi.x > width)||(posi.x < 0)) { ensp.x = -ensp.x; //ボールが左右の壁に触れると反射 } if ((posi.y > height)||(posi.y < 0)) { ensp.y = -ensp.y; //ボールが上下の壁に触れると反射 } } void ballfun() { stroke(0,0,255); fill(0,0,255); ellipse(posi.x+10, posi.y+10, 30, 30); //ボールの描画 } void set(float X, float Y, float enspX, float enspY) { //位置、速度 posi.set(X, Y); ensp.set(enspX, enspY); } } void setup() { size(500,650); for (int i = 0; i < ball.length; i++) { ball[i] = new EnemyBall(30, 30, 30, 30); //敵ボール ball[i].set(mouseX + 15, mouseY + 15, random(5, 8), random(5,8)); //(float X, float Y, float enspX, float enspY) enspXは敵のボールのX速度 enspYは敵ボールのY速度 } } void draw() { background(255); for(EnemyBall enemy:ball) { enemy.latest(); //最新の画面に切り替える enemy.hitwall(); //画面の上下左右端に当たったときの設定用 enemy.ballfun(); //ボールの設定用 function hitme(enemy); // ボールが自機にヒットしたときの設定用 } stroke(255,0,0); fill(255,0,0); rect(mouseX-5, mouseY-5, 10, 10); //自機の設定 frendball.latest(); frendball.ballfun(); if(frendball.isGameOver()){ textSize(20); text("GameOver",20,20); noLoop(); } if(mouseX > frendball.frballx-30 && mouseX < frendball.frballx+30 && mouseY > frendball.frbally-30 && mouseY < frendball.frbally+30){ touch=80; frendball.next(); //次の球がでる } } void hitme(EnemyBall enemy) { //敵ボールが自機にヒットしたときGameOver if (mouseX + 18 > enemy.posi.x && mouseX - 18 < enemy.posi.x && mouseY + 18 > enemy.posi.y && mouseY - 18 < enemy.posi.y) { fill(255,0,0); // 文字色 textSize(20); text("GameOver",20,20); noLoop(); } } ``` ◇主な変更点 `FriendBall`クラスを新設(質問分の最初のコードで行っている事を一部クラス化) `enball`を`Java`の命名規則に合わせてクラス名の先頭を大文字に名称を`EnemyBall`に変更 ◇余談 `FriendBall`クラスの変数:`frballx`と`frbally`は`EnemyBall`クラスと同様に`PVector`で管理したほうがよいかもです。 変数:`frsp`と`fra`も同様です。