第10回 課題の模範解答

課題の模範解答です。
   
課題1
<演習1>の400個の〇を描くプログラムを、色もランダムになるように修正しなさい
size(400,400);
background(255);

for(int i=0;i<400;i++){
  float x = random(0,400);
  float y = random(0,400);
  fill(random(0,255),random(0,255),random(0,255));
  ellipse( x, y, 20, 20 );
}

 

課題2
下記のソースはマウスをクリックすると、その位置に×を描画するプログラムである。
また、×は毎回ランダムで色が変わるようにする。

void setup()
{
  size(400, 400);
  background(255);
  strokeWeight(3);
}

void draw(){}

void mousePressed()
{
  stroke(random(0,255),random(0,255),random(0,255));
  line( mouseX-10, mouseY-10, mouseX+10, mouseY+10 );
  line( mouseX+10, mouseY-10, mouseX-10, mouseY+10 ); 

}
 
 
課題3
下記のソースは、砲台(インベーダーゲームのような)を描画するプログラムである。
これを、マウスの水平位置がそのまま砲台の水平位置になるように修正しなさい。

float hx; // 砲台のx座標

void setup()
{
  size(400, 400);
  noStroke();
  hx = 200.0;
}

void draw()
{
  background(0);

  hx = mouseX;
  fill(255,255,255);
  rect( hx-20, 360, 40, 20);
  rect( hx-3, 360-6, 6, 10);
}
  
 
課題4
課題3のプログラムで、マウスボタンを押すと弾が発射されるように修正しなさい。
float hx; // 砲台のx座標
float bx,by; // 弾の座標

void setup()
{
  size(400, 400);
  noStroke();
  hx = 200.0;
  bx = 500.0;
  by = 0.0;
}

void draw()
{
  background(0);

  hx = mouseX;
  fill(255,255,255); // 白色
  rect( hx-20, 360, 40, 20); // 砲台の描画
  rect( hx-3, 360-6, 6, 10);
 
  fill(255,255,0); // 黄色
  rect(bx-2,by-4,4,8); // 弾の描画
  by -= 8;
}
void mousePressed()
{
  bx = mouseX;
  by = 360-6;
}

    
  
課題5(難しい)
課題4のプログラムをさらに改良し、マウスボタンを押している間、弾が連続で発射されるように修正しなさい。さらに、発射された弾は少しブレるようにすること。
float hx; // 砲台のx座標
float [] bx; // 弾の座標
float [] by;
float [] ex; // ブレ度合い(横方向)
int fcnt = 0;
final int interval = 5; // 次の弾を発射するまでの間隔
final int b_max = 100; // 弾を同時に表示する最大個数

void setup()
{
  size(400, 400);
  noStroke();
  hx = 200.0;
  bx = new float [b_max];
  by = new float [b_max];
  ex = new float [b_max];
  for(int i=0;i<b_max;i++) by[i] = -1.0;
}

void draw()
{
  background(0);

  hx = mouseX;
  fill(255,255,255); // 白色
  rect( hx-20, 360, 40, 20); // 砲台の描画
  rect( hx-3, 360-6, 6, 10);
 
  fill(255,255,0); // 黄色
  for(int i=0;i<b_max;i++){
    rect(bx[i]-2,by[i]-4,4,8); // 弾の描画
    by[i] -= 8;
    bx[i] += ex[i];
  }
  if( ++fcnt >= interval ) fcnt = 0;
  if( fcnt == 0 && mousePressed == true ) fire();
}

// 弾を1個発射する
void fire()

  for(int i=0;i<b_max;i++){
    if( by[i]<0.0 ){
      bx[i] = mouseX;
      by[i] = 360-6;
      ex[i] = random(2.0) - 1.0;
      break;
    }
  }
}