1. // 画像の表示非表示のコード
  2. import processing.serial.*;
  3. import java.awt.*;
  4. import javax.swing.*;
  5. //↓音を出すminim class
  6. import ddf.minim.*;
  7. Minim minim;
  8. //AudioSample sound;
  9. AudioPlayer player;
  10. int x = 0;
  11. int y = 0;
  12. int dir_x = 1;
  13. int dir_y = 1;
  14. int speed = 3;
  15. Serial port;
  16. int lightThreshold = 80;
  17. boolean imageVisible = false;
  18. boolean sound_flag=false;
  19. PImage image;
  20. Kirakira[] kira = new Kirakira[250];
  21. void setup() {
  22.   size(1000, 600);
  23.   
  24.   frameRate( 30 );
  25.   
  26.   colorMode(HSB, 360, 100, 100);
  27.   background(360);
  28.   smooth();
  29.   strokeWeight(3);
  30.    for (int i = 0; i < kira.length; i++) {
  31.     kira[i] = new Kirakira();
  32.   }
  33.   // Arduinoとのシリアル通信の設定
  34.   port = new Serial(this, "COM4", 9600);
  35.   port.bufferUntil('\n');
  36.   // 画像の読み込み
  37.   image = loadImage("dflink.qr.png");
  38.   
  39.     //音
  40.    minim = new Minim(this);
  41.    player = minim.loadFile("sound.mp3");
  42. }
  43. void draw() {
  44.   background(360);
  45.   if (port.available() > 0) {
  46.     String lightValueString = port.readStringUntil('\n');
  47.     if (lightValueString != null) {
  48.       lightValueString = trim(lightValueString);
  49.       int lightValue = int(lightValueString);
  50.       if (lightValue <= lightThreshold) {
  51.         // 光センサの値が閾値以下の場合、画像を表示
  52.         imageVisible = true;
  53.       } else {
  54.         // 光センサの値が閾値より大きい場合、画像を非表示
  55.         imageVisible = false;
  56.         sound_flag = false;
  57.       }
  58.     }
  59.   }
  60.   if (imageVisible) {
  61.     // 画像が表示状態の場合、画像を表示
  62.     //imageMode(CENTER);
  63.     //image(image, width / 2, height / 2);
  64.     
  65.     x += dir_x * speed;
  66.   y += dir_y * speed;
  67.   if ( ( x < 0 ) || ( x > width - image.width ) ) {
  68.     dir_x = - dir_x;
  69.   }
  70.   if ( ( y < 0 ) || ( y > height - image.height ) ) {
  71.     dir_y = - dir_y;
  72.   }
  73.   image( image, x, y );
  74.     for (int i = 0; i < kira.length; i++) {
  75.       kira[i].display();
  76.       kira[i].move();
  77.     }
  78.     
  79.      //効果音流すーーーーーーー
  80.   
  81.      //sound.trigger();
  82.      if (sound_flag==false){
  83.         player.play(0);
  84.         sound_flag=true;
  85.      }
  86.   }
  87. }
  88. void stop() {
  89.   player.close();
  90.   minim.stop();
  91.   super.stop();
  92. }
  93. class Kirakira {
  94.   float delta = TWO_PI / 100;
  95.   float x = random(width);
  96.   float y = random(height);
  97.   float hue_fill = random(180,250);
  98.   float hue_stroke = random(180,250);
  99.   float R;
  100.   float R_start = random(10, 30);
  101.   float R_height = random(1.2, 1.6);
  102.   float R_theta = random(TWO_PI);
  103.   float R_theta_delta = random(0.03, 0.08);
  104.   float y_spd = random(1, 3);
  105.   Kirakira() {
  106.   }
  107.   void display() {
  108.     fill(hue_fill, 50, 100, 80);
  109.     stroke(hue_stroke, 100, 100, 80);
  110.     pushMatrix();
  111.     translate(x, y);
  112.     beginShape();
  113.     for (float t = 0; t < TWO_PI; t += delta) {
  114.       vertex(R* pow(cos(t), 3), R * R_height * pow(sin(t), 3));
  115.     }
  116.     endShape(CLOSE);
  117.     popMatrix();
  118.     R = R_start * abs(sin(R_theta)) ;
  119.     R_theta += R_theta_delta;
  120.   }
  121.   void move() {
  122.     y -= y_spd;
  123.     if (y < -R * R_height) {
  124.       y = height + R * R_height;
  125.     }
  126.   }
  127. }