これまではボールの角度やスピードは一定でした。これを、点数が入るたびに変わるようにしましょう。
まず、微妙なスピード調整が可能になるよう、スピードの変数を int 型から float 型に修正します。これで少数が扱えるようになります。
int xSpeed, ySpeed;
↓ 以下に修正
float xSpeed, ySpeed;
点数が入った時に、1 から 4 までの値をランダムに xSpeed と ySpeed に入力するようにします。0 から 4 までにしてしまうと、極めて小さい値が入ってしまうことがあるため、1 以上としました。xSpeedとySpeedに別々の値を入力することで、角度を指定しなくてもボールが発射される角度が変わります。後から、自分の陣地にボールが入ったときと相手の陣地に入った時に異なる点数の処理を加えるため、別々に記述することにします。
if ((ballX+3 > width) || (ballX-3 < 0)) {
ballX = width/2; ballY = height/2;
}
↓ 以下に修正
if (ballX+3 > width) {
ballX = width/2;
ballY = height/2;
xSpeed = random(1, 4);
ySpeed = random(1, 4);
}
else if(ballX-3 < 0) {
ballX = width/2;
ballY = height/2;
xSpeed = random(1, 4);
ySpeed = random(1, 4);
}
ラリーが続くと少しずつボールのスピードが速くなり、白熱した展開になるようにしましょう。draw() の最後に以下を追加します。
xSpeed += 0.01;
ySpeed += 0.01;
とても小さな値ですが、毎フレームごとに 0.01 ずつスピードが速まるので、スピードの変化を実感できます。
ここまでの今日のコードです。
float ballX, ballY;
float racketY;
int xDir, yDir;
float xSpeed, ySpeed;
float enemyY;
float easing;
void setup() {
size (480,320);
ballX = width/2;
ballY = height/2;
racketY = height/2;
easing = 0.1;
xDir = 1;
yDir = 1;
xSpeed = 1;
ySpeed = 1;
}
void draw() {
background(0);
strokeWeight (1);
stroke(255);
for ( int i = 0; i < height; i += 10 ){
line(width/2, i, width/2, i+5); }
//my racket
float targetY = mouseY;
racketY += (targetY - racketY) * easing;
rect(440, racketY-25, 8, 50);
//enemy racket
enemyY += (ballY - enemyY) * easing;
rect(40, enemyY-25, 8, 50);
ellipse(ballX, ballY, 6, 6);
if((ballY+3>height) || (ballY-3<0)) yDir *= -1;
if ((ballX+3 >= 440) && (ballX+3 <= 448) && (ballY > racketY-25) && (ballY < racketY+30))
xDir *= -1;
if ((ballX-3 <= 48) && (ballX-3 >= 40) && (ballY > enemyY-25) && (ballY < enemyY+25))
xDir *= -1;
if (ballX+3 > width) {
ballX = width/2;
ballY = height/2;
xSpeed = random(1, 4);
ySpeed = random(1, 4);
}
else if(ballX-3 < 0) {
ballX = width/2;
ballY = height/2;
xSpeed = random(1, 4);
ySpeed = random(1, 4);
}
ballX += xSpeed * xDir;
ballY += ySpeed * yDir;
xSpeed += 0.01;
ySpeed += 0.01;
}