ハッカーっぽい画面を作る

Processingで作る爆発エフェクト

 前回爆発音を作成しましたが、今回はそれを利用した爆発エフェクトの作成です。

 Processingを用いた爆破エフェクトの作成はGoogleで検索するといくつか出てきますが、今回はシンプルに円を拡大することにしました。
 特に難しいことはしていないので下の動画を見ればどのような表現をしているかわかると思います。


 中身としては、"爆発モード"に入る際に更新情報としてそのタイミングでの時間を取得し、そこからの経過時間で一番大きな円の大きさを変えています。小さい円は、ある程度ランダムな場所にある程度ランダムな最大サイズの円を設定し、半径0の円から最大サイズになるまで描画しています。小さい円は5個描画され、一つの描画が終わると次の円が表示されるようになっています。

 以下コードです。ある程度コメントで説明してあります。
  1. import java.util.Random;
  2. import ddf.minim.*;
  3. import ddf.minim.analysis.*; 
  4. import ddf.minim.effects.*;
  5. import ddf.minim.signals.*;
  6. import ddf.minim.spi.*;
  7. import ddf.minim.ugens.*;

  8. int[][] circle = new int[4][5];//x,y,r,t0,t
  9. char[] mode = new char[2];
  10. int[] bubble = new int[4];
  11. int[] noisevolmode = new int[2];

  12. Minim minim; 
  13. AudioOutput out;
  14. Random random = new Random();
  15. Noise[][] noisevol = new Noise[8800][2];

  16. void setup() {
  17.   size(1920, 1080);
  18.   colorMode(HSB, 360, 255, 255, 255);
  19.   strokeWeight(5);
  20.   background(0);
  21.   
  22.   minim = new Minim(this);
  23.   out = minim.getLineOut(Minim.STEREO);
  24.   for (int i = 0; i < 8800; i++) {
  25.     noisevol[i][0] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.BROWN);
  26.   }
  27.   for (int i = 0; i < 8800; i++) {
  28.     noisevol[i][1] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.RED);
  29.   }
  30. }
  31.   
  32. void draw() {//ループ処理
  33.   background(0);
  34.   if (mode[1] != mode[0]) {//更新処理の判定
  35.     update();
  36.     mode[1] = mode[0];
  37.   }
  38.   switch(mode[0]) {//現在のモードの実効
  39.   case 'b':
  40.     bubble();
  41.     break;
  42.   default:
  43.     break;
  44.   }
  45. }

  46. void update() {//更新処理
  47.   switch(mode[1]) {//終了処理
  48.   case 'b':
  49.     noisevol[noisevolmode[1]][0].unpatch(out);
  50.     noisevol[noisevolmode[1]][1].unpatch(out);
  51.     break;
  52.   default:
  53.     break;
  54.   }
  55.   switch(mode[0]) {//開始処理
  56.   case 'b':
  57.     if (mode[1] != mode[0]) {
  58.       bubble[0] = millis();
  59.     }
  60.     break;
  61.   default:
  62.     break;
  63.   }
  64. }

  65. void keyPressed() {//キーボード入力の割り込み
  66.   mode[0] = key;
  67. }

  68. void bubble() {//円と音の出力
  69.   background(0);
  70.   bubble[1] = millis() - bubble[0];
  71.   bubble[2] = (millis() - bubble[0]) * 10;
  72.   bubble[3] = bubble[2] % 2200;
  73.   
  74.   if (bubble[2] >= 4 * 2200) {//終了判定
  75.     mode[0] = 's';
  76.     return;
  77.   }
  78.   circle[0][4] = (millis() - circle[0][3]) * 2;
  79.   if (circle[0][2] == 0 || circle[0][2] < circle[0][4]) {
  80.     circle[0][4] = 0;
  81.     circle[0][3] = millis();
  82.     circle[0][2] = random.nextInt(500);
  83.     circle[0][1] = height / 4 + random.nextInt(height /2);
  84.     circle[0][0] = width / 4 + random.nextInt(width /2);
  85.   }
  86.   circle[1][4] = (millis() - circle[1][3]) * 2;
  87.   if (circle[1][2] == 0 || circle[1][2] < circle[1][4]) {
  88.     circle[1][4] = 0;
  89.     circle[1][3] = millis();
  90.     circle[1][2] = random.nextInt(500);
  91.     circle[1][1] = height / 4 + random.nextInt(height /2);
  92.     circle[1][0] = width / 4 + random.nextInt(width /2);
  93.   }
  94.   circle[2][4] = (millis() - circle[2][3]) * 2;
  95.   if (circle[2][2] == 0 || circle[2][2] < circle[2][4]) {
  96.     circle[2][4] = 0;
  97.     circle[2][3] = millis();
  98.     circle[2][2] = random.nextInt(500);
  99.     circle[2][1] = height / 4 + random.nextInt(height /2);
  100.     circle[2][0] = width / 4 + random.nextInt(width /2);
  101.   }
  102.   circle[3][4] = (millis() - circle[3][3]) * 2;
  103.   if (circle[3][2] == 0 || circle[3][2] < circle[3][4]) {
  104.     circle[3][4] = 0;
  105.     circle[3][3] = millis();
  106.     circle[3][2] = random.nextInt(500);
  107.     circle[3][1] = height / 4 + random.nextInt(height /2);
  108.     circle[3][0] = width / 4 + random.nextInt(width /2);
  109.   }

  110.   noisevolmode[0] = bubble[2];
  111.   noisevol[noisevolmode[1]][0].unpatch(out);
  112.   noisevol[noisevolmode[0]][0].patch(out);
  113.   noisevol[noisevolmode[1]][1].unpatch(out);
  114.   noisevol[noisevolmode[0]][1].patch(out);
  115.   noisevolmode[1] = noisevolmode[0];

  116.   fill(0, 0, 255, 255);
  117.   circle(width / 2, height / 2, bubble[3]);
  118.   circle(circle[0][0], circle[0][1], circle[0][4]);
  119.   circle(circle[1][0], circle[1][1], circle[1][4]);
  120.   circle(circle[2][0], circle[2][1], circle[2][4]);
  121.   circle(circle[3][0], circle[3][1], circle[3][4]);
  122. }

Processingで作る爆発音

 皆さん爆発音を自分で用意したくなった時があると思います。でも、どう作ればいいかわからないですよね? そんな方のために今回は爆発音を作る方法を紹介しようと思います!

 まず、作成経緯です。爆発音のフリー素材なんかネット上にごろごろ転がっているので、それを持ってくればこの記事はいりません。しかし、全部Processingで完結させるといってしまった以上Processingで作るしかありません。いくら調べてもProcessing上で爆発音を作っている人はいなかったので日本初の試みです。
 次に爆発音についてです。爆発音は調べたところノイズを減衰させるといい感じに聞こえるらしいです。それなのでminimの中にあるNoiseというものを使って作ることにします。

 これを実装するためにはノイズの大きさを変える必要があるのですが、自分が英語リファレンスを読んだ感じできませんでした。それなので今回は音量が違う8800通りのノイズを定義しています。この8800という数字はほかのところとの兼ね合いで生まれたものなので特に気にしなくていいです。

 また、Processingには
  1. ホワイトノイズ
  2. ブラウンノイズ
  3. ピンクノイズ
  4. レッドノイズ
の4つのノイズが存在します。それぞれのノイズをsinカーブで減衰させたときの例を↓に出します。自分の好みに合わせて、組み合わせるノイズや減衰の関数を選んでください。



 個人的にはブラウンノイズとレッドノイズがそれっぽいと思うので今回のコードではこの二つを採用しています。

 ↓にそれぞれのツイートの元のコードを書いておきます。
1つ目のツイート
  1. import java.util.Random;
  2. import ddf.minim.*;
  3. import ddf.minim.analysis.*; 
  4. import ddf.minim.effects.*;
  5. import ddf.minim.signals.*;
  6. import ddf.minim.spi.*;
  7. import ddf.minim.ugens.*;

  8. Noise[] noisevol = new Noise[5];
  9. int mode;

  10. Minim minim; 
  11. AudioOutput out;

  12. void setup() {
  13.   size(300, 100);
  14.   textAlign(CENTER, CENTER);
  15.   fill(255);
  16.   textSize(64);
  17.   background(0);
  18.   minim = new Minim(this);
  19.   out = minim.getLineOut(Minim.STEREO);
  20.   noisevol[1] = new Noise(1.0, Noise.Tint.WHITE);
  21.   noisevol[2] = new Noise(1.0, Noise.Tint.BROWN);
  22.   noisevol[3] = new Noise(1.0, Noise.Tint.PINK);
  23.   noisevol[4] = new Noise(1.0, Noise.Tint.RED);
  24. }

  25. void draw() {
  26. }

  27. void keyPressed() {
  28.   background(0);
  29.   if (mode != 0) {
  30.     noisevol[mode].unpatch(out);
  31.   }
  32.   switch(key) {
  33.   case '1':
  34.     mode = 1;
  35.     text("WHITE", width / 2, height / 2);
  36.     break;
  37.   case '2':
  38.     mode = 2;
  39.     text("BROWN", width / 2, height / 2);
  40.     break;
  41.   case '3':
  42.     mode = 3;
  43.     text("PINK", width / 2, height / 2);
  44.     break;
  45.   case '4':
  46.     mode = 4;
  47.     text("RED", width / 2, height / 2);
  48.     break;
  49.   default:
  50.     break;
  51.   }
  52.   noisevol[mode].patch(out);
  53. }
2つ目のツイート
  1. import java.util.Random;
  2. import ddf.minim.*;
  3. import ddf.minim.analysis.*; 
  4. import ddf.minim.effects.*;
  5. import ddf.minim.signals.*;
  6. import ddf.minim.spi.*;
  7. import ddf.minim.ugens.*;

  8. Noise[][] noisevol = new Noise[8800][5];
  9. int[] noisevolmode = new int[3];
  10. int mode;

  11. Minim minim; 
  12. AudioOutput out;

  13. void setup() {
  14.   size(300,100);
  15.   textAlign(CENTER, CENTER);
  16.   fill(255);
  17.   textSize(64);
  18.   background(0);
  19.   minim = new Minim(this);
  20.   out = minim.getLineOut(Minim.STEREO);
  21.   for (int i = 0; i < 8800; i++) {
  22.     noisevol[i][1] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.WHITE);
  23.   }
  24.   for (int i = 0; i < 8800; i++) {
  25.     noisevol[i][2] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.BROWN);
  26.   }
  27.   for (int i = 0; i < 8800; i++) {
  28.     noisevol[i][3] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.PINK);
  29.   }
  30.   for (int i = 0; i < 8800; i++) {
  31.     noisevol[i][4] = new Noise(1.0 + cos(map(i, 0, 8800, 0, PI)), Noise.Tint.RED);
  32.   }
  33. }

  34. void draw() {
  35.   noisevolmode[0] = (millis() - noisevolmode[2]) * 10;
  36.   if (mode != 0) {
  37.     if (noisevolmode[0] > 8800) {
  38.       noisevol[noisevolmode[1]][mode].unpatch(out);
  39.       noisevolmode[0] = 0;
  40.     } else {
  41.       noisevol[noisevolmode[1]][mode].unpatch(out);
  42.       noisevol[noisevolmode[0]][mode].patch(out);
  43.       noisevolmode[1] = noisevolmode[0];
  44.     }
  45.   }
  46. }

  47. void keyPressed() {
  48.   background(0);
  49.   if (mode != 0) {
  50.     noisevol[noisevolmode[1]][mode].unpatch(out);
  51.   }
  52.   switch(key) {
  53.   case '1':
  54.     mode = 1;
  55.     text("WHITE", width / 2, height / 2);
  56.     break;
  57.   case '2':
  58.     mode = 2;
  59.     text("BROWN", width / 2, height / 2);
  60.     break;
  61.   case '3':
  62.     mode = 3;
  63.     text("PINK", width / 2, height / 2);
  64.     break;
  65.   case '4':
  66.     mode = 4;
  67.     text("RED", width / 2, height / 2);
  68.     break;
  69.   default:
  70.     break;
  71.   }
  72.   noisevolmode[2] = millis();
  73. }

Processingでカウントダウンタイマーを作る

 今まで使った技術で↓のカウントダウンが作れます。
 やってることとしては、その時間の時刻を表示し、文字の透明度をsinで変えているだけです。多分もっとスマートな方法があります。

 ↓にこれのコードを貼っておくのでこれをコピペして、コピペした先の.pdeと同じ階層にフォントの.ttfファイルを入れれば動きます。また、OBSに入れることを前提として制作していたのでFHDになってますが、小さくしたいときはsize(,)の中身で調節してください。その時多少文字がずれてしまう時は、121行目のrect(,,,)の係数を少しずつ変えてください。

  1. import ddf.minim.*;
  2. import ddf.minim.analysis.*; 
  3. import ddf.minim.effects.*;
  4. import ddf.minim.signals.*;
  5. import ddf.minim.spi.*;
  6. import ddf.minim.ugens.*;

  7. PFont D14;
  8. int[] now = new int[5];
  9. char[] mode = new char[2];
  10. int target;
  11. String s;

  12. Minim minim; 
  13. AudioOutput out;
  14. Oscil oscil;

  15. void setup() {
  16.   size(1920, 1080);
  17.   D14 = createFont("DSEG14Modern-Regular.ttf", 60);
  18.   colorMode(HSB, 360, 255, 255, 255);
  19.   textAlign(CENTER, CENTER);

  20.   strokeWeight(5);

  21.   minim = new Minim(this);
  22.   out = minim.getLineOut(Minim.STEREO);
  23.   oscil = new Oscil(440, 0.5, Waves.SQUARE);
  24. }

  25. void draw() {
  26.   background(0);
  27.   if (mode[1] != mode[0]) {
  28.     update();
  29.     mode[1] = mode[0];
  30.   }
  31.   switch(mode[0]) {
  32.   case 'c':
  33.     count();
  34.     break;
  35.   default:
  36.     break;
  37.   }
  38. }

  39. void count() {
  40.   now[0] = target - millis();
  41.   now[1] = int( map( sin( map( now[0] / 2 % 1000, 0, 1000, 0, 2*PI) + PI / 4), -1, 1, 0, 255));
  42.   now[2] = now[0] % 1000;
  43.   now[4] = now[0];
  44.   if (now[0]<10) {
  45.     mode[0] = 'b';
  46.     return;
  47.   }
  48.   if (now[0] % 1000 <10) {
  49.     s = "00" + str(now[0] % 1000);
  50.   } else {
  51.     if (now[0] % 1000 < 100) {
  52.       s = "0" + str(now[0] % 1000);
  53.     } else {
  54.       s = str(now[0] % 1000);
  55.     }
  56.   }
  57.   now[0] = now[0] / 1000;
  58.   if (now[0] % 60 <10) {
  59.     s = "0" + str(now[0] % 60) + ":" + s;
  60.   } else {
  61.     s = str(now[0] % 60) + ":" + s;
  62.   }
  63.   now[0] = now[0] / 60;
  64.   if (now[0] % 60 <10) {
  65.     s = "0" + str(now[0] % 60) + ":" + s;
  66.   } else {
  67.     s = str(now[0] % 60) + ":" + s;
  68.   }
  69.   now[0] = now[0] / 60;
  70.   if (now[0] % 60 <10) {
  71.     s = "0" + str(now[0] % 60) + ":" + s;
  72.   } else {
  73.     s = str(now[0] % 60) + ":" + s;
  74.   }

  75.   if (now[4] >10000) {
  76.     if (now[2] < 100) {
  77.       if (now[3] != 1) {
  78.         oscil.patch(out);
  79.         now[3] = 1;
  80.       }
  81.     } else {
  82.       oscil.unpatch(out);
  83.       now[3] = 0;
  84.     }
  85.   } else {
  86.     if (now[4] > 5000) {
  87.       if (now[2] < 100 || (now[2] > 500 && now[2] < 600)) {
  88.         if (now[3] != 1) {
  89.           oscil.patch(out);
  90.           now[3] = 1;
  91.         }
  92.       } else {
  93.         oscil.unpatch(out);
  94.         now[3] = 0;
  95.       }
  96.     } else {
  97.       if (now[4] > 1000) {
  98.         if (now[2] < 100 || (now[2] > 500 && now[2] < 600) || (now[2] > 250 && now[2] < 350) || (now[2] > 750 && now[2] < 850)) {
  99.           if (now[3] != 1) {
  100.             oscil.patch(out);
  101.             now[3] = 1;
  102.           }
  103.         } else {
  104.           oscil.unpatch(out);
  105.           now[3] = 0;
  106.         }
  107.       }
  108.     }
  109.   }

  110.   stroke(0, 0, 255, map( now[1], 0, 255, 100, 255));
  111.   fill(0, 0, 0, 0);
  112.   rect(width / 2 - textWidth(s) / 2, height / 2 - (textAscent() + textDescent()) / 2 - 5, textWidth(s), textAscent() + textDescent() + 10);
  113.   textFont(D14);
  114.   fill(0, 0, 255, now[1]);
  115.   text(s, width / 2, height / 2);
  116. }

  117. void update() {
  118.   switch(mode[1]) {
  119.   case 'c':
  120.     stroke(0, 0, 0, 255);
  121.     oscil.unpatch(out);
  122.     break;
  123.   default:
  124.     break;
  125.   }
  126.   switch(mode[0]) {
  127.   case 'c':
  128.     if (mode[1] != mode[0]) {
  129.       target = millis() + (((((0 * 60) + 1) * 60) + 0) * 1000);
  130.     }
  131.     break;
  132.   default:
  133.     break;
  134.   }
  135. }

  136. void keyPressed() {
  137.   mode[0] = key;
  138. }

Processing+minimで波を鳴らす

 processingのライブラリにminimというものがあり、これでは音に関することが簡単に実装することができるようになります。
 今回はその中でもOscilという機能を使っていろいろな波を鳴らす方法です。
 デフォルトでならせる波は6種類あります。それそれ下図の左上から
  1. 正弦波
  2. 三角波
  3. ノコギリ波
  4. 矩形波
  5. 1/4パルス波
  6. フェーザ波
です。
blog
 それぞれ音を鳴らしたときの音色が違うので、目的にあった音を鳴らすことになります。
 これらの音をキーボードの1~6キーで買えられるようにしたテストプログラムを↓に書いておきます。実行すると画面に↑と同じ画面が現れそれぞれの440Hzの音が流れます。
  1. import ddf.minim.*;
  2. import ddf.minim.analysis.*;
  3. import ddf.minim.effects.*;
  4. import ddf.minim.signals.*;
  5. import ddf.minim.spi.*;
  6. import ddf.minim.ugens.*;

  7. Minim minim;
  8. AudioOutput out;
  9. Oscil oscil;

  10. void setup(){
  11.   size(1920, 1080);
  12.   minim = new Minim(this);
  13.   out = minim.getLineOut();//ここまでおまじない
  14.   oscil = new Oscil(440, 0.5, Waves.SINE);//oscilという変数に440Hzで大きさ0.5のsin波を挿入
  15.   oscil.patch(out);//oscilという変数を出力する".unpatch(out)"で出力を停止
  16.   noFill();
  17. }

  18. void draw(){
  19.   background(0);
  20.   
  21.   stroke(0, 0, 255);
  22.   strokeWeight(5);
  23.   beginShape();
  24.   for(int i = 0; i < width; i++){
  25.     vertex(i / 2, height / 2 - oscil.getWaveform().value(float(i) / (width)) * 100);//波形を描写(左半分)
  26.   }
  27.   for(int i = 0; i < width; i++){
  28.     vertex(width / 2 + i / 2, height / 2 - oscil.getWaveform().value(float(i) / (width)) * 100);//波形を描写(右半分)
  29.   }
  30.   endShape();
  31.   
  32.   stroke(255);
  33.   strokeWeight(1);
  34.   line(0, height / 2, width, height / 2);
  35. }

  36. void keyPressed(){//キーが押された時そのキーによってoscilの中の波形データを書き換える
  37.   switch(key){
  38.     case '1':
  39.       oscil.setWaveform(Waves.SINE);
  40.       break;
  41.     case '2':
  42.       oscil.setWaveform(Waves.TRIANGLE);
  43.       break;
  44.     case '3':
  45.       oscil.setWaveform(Waves.SAW);
  46.       break;
  47.     case '4':
  48.       oscil.setWaveform(Waves.SQUARE);
  49.       break;
  50.     case '5':
  51.       oscil.setWaveform(Waves.QUARTERPULSE);
  52.       break;
  53.     case '6':
  54.       oscil.setWaveform(Waves.PHASOR);
  55.       break;
  56.   }
  57. }

Processingで配列を定義する方法

 Processingで配列を定義する方法は↓のとおりです。Processingの配列はmatlabとかとは違い0から始まります。つまり、大きさが3の配列は0,1,2と番号を振られます。

int[][] matrix = new int[a][b];//a*b
このように定義をすることでa*bの配列を作ることができます。また、[]の数を増やすことで要素の数を増やすこともできますし、int型以外の例えばchar型やfloat型でも作ることができます。

 これを使った簡単な例を↓に書いておきます。
  1. int[][] matrix = new int[2][3];

  2. void setup() {
  3.   for (int j = 0; j < 3; j++) {
  4.     for (int i = 0; i < 2; i++) {
  5.       matrix[i][j] = i + j;
  6.     }
  7.   }
  8.   for (int j = 0; j < 3; j++) {
  9.     print("[");
  10.     for (int i = 0; i < 2; i++) {
  11.       print(matrix[i][j]);
  12.       if (i < 2 - 1) {
  13.         print(", ");
  14.       }
  15.     }
  16.     println("]");
  17.   }
  18. }
 このプログラムの出力は↓のようになります。
スクリーンショット 2021-01-04 181847

Processingで時間を表示(取得)する方法

 Processingで何かを作っていて、現在時刻を表示したいことがたまにあると思います。そうでなくても、現在時刻によって変化する作品を作ることはあると思います。それなので今回は例としてデジタル時計を作ってみます。

 使う関数は、hour(),minute(),second()です。その名の通りこれらはその瞬間の"時間""分""秒"を返してくれます。これを使ってデジタル時計を作ると↓のようになります。

スクリーンショット 2020-12-31 004041

 前に紹介したフォントの追加方法(http://blog.livedoor.jp/chisato_tofu/archives/25772956.html)を使っています。一応使ったプログラムを下に貼っておきます。適当に書いたのできれいじゃないのは許してください。
  1. PFont D14;
  2. String t;
  3. int s;
  4. int m;
  5. int h;

  6. void setup() {
  7.   size(320, 80);
  8.   strokeWeight(5);
  9.   colorMode(HSB, 360, 255, 255, 255);
  10.   D14 = createFont("DSEG14Modern-Regular.ttf", 60);
  11. }
  12. void draw() {
  13.   background(0);
  14.   textFont(D14);
  15.   stroke(0, 0, 255, 255);
  16.   fill(0, 0, 255, 255);
  17.   s = second();
  18.   m = minute();
  19.   h = hour();
  20.   if (h < 10) {
  21.     t = "0" + str(h);
  22.   }else{
  23.     t = str(h);
  24.   }
  25.   if (m < 10) {
  26.     t = t + ":" + "0" + str(m);
  27.   }else{
  28.     t = t + ":" + str(m);
  29.   }
  30.   if (s < 10) {
  31.     t = t + ":" + "0" + str(s);
  32.   }else{
  33.     t = t + ":" + str(s);
  34.   }
  35.   text(t, 0, 70);
  36. }

Processingで自作関数を定義する方法

プログラムが長くなってきたとき自分で関数を作ることがあると思うのですが、今回はProcessingでやる方法です。

 ↓のように書けば大丈夫です
  1. void setup(){
  2.   function1();
  3.   function2();
  4.   function3();
  5.   function4();
  6. }

  7. void function1(){
  8.   println("a");
  9. }
  10. void function2(){
  11.   println("b");
  12. }
  13. void function3(){
  14.   println("c");
  15. }
  16. void function4(){
  17.   println("d");
  18. }
 これを実行すると↓のようになります。
スクリーンショット 2020-12-28 232318


 ちなみに↓の画像の▽のマークをクリックすると出る"新規タブ"をクリックすると二ページ目が出せます。
スクリーンショット 2020-12-28 230905

 これを保存すると↓のように二つの.pdeとして保存されますが、どちらを開いても同じように起動できます。
スクリーンショット 2020-12-28 231937

Processingでランダムな数字を生成する(Random())

 Processingでランダムな数字を生成する方法です。プログラミングをしているとたまにランダムな数字が欲しいときがあり、その時はその環境に合わせた関数を使うのですが、今回はProcessingのRandom関数の使い方です。

 コードは下のとおりです。
  1. import java.util.Random;//Random関数のインポート
  2. Random random = new Random();//"random"という変数を定義

  3. void draw() {
  4.   int i = random.nextInt(255);//"i"という変数に0~255の間のランダムな値を挿入
  5.   println(i);//"i"を表示
  6. }
 これを実行すると↓のように0~255のランダムな値が連続して表示されます。
スクリーンショット 2020-12-28 215038

Processingで好きなフォントを使う方法(PFont)

Processingでフォントを使う時はPFontで指定するのですが、これで選べるフォントは結構少ないです。デフォルトで使えるフォントは、"ツール"->"フォント作成"で出てくるものだけです。結構あるように見えますが、デザインフォントは基本ないので好きなフォントを使えるわけではありません。それなので今回は好きなフォントを使えるようにする方法を紹介します。

①好きなフォントの.ttfファイルを用意する。
 この状態の単体のファイルを用意します。今回はこちらのサイト(https://www.keshikan.net/fonts.html)のフォントを利用させていただいています。
スクリーンショット 2020-12-23 225249

②用意した.ttfファイルを使いたいプログラムに配置する。
 ↓の画像のようにProcessingのファイル構成として、"ファイル"->"プログラム"という風に自動で保存されるのですが、"プログラム"と同じ階層に.ttfファイルを配置します。
スクリーンショット 2020-12-24 182601

③プログラムで読み込む。
 今回のテスト用のプログラムを↓に出しておきます。
  1. PFont D7;//配列を格納する変数を定義
  2. void setup() {
  3.   size(600, 400);
  4.   D7 = createFont("DSEG7ClassicMini-Regular.ttf", 60);//変数に"DSEG7ClassicMini-Regular.ttf"の60pのサイズのフォントを格納
  5. }

  6. void draw() {
  7.   background(0);
  8.   textFont(D7);//text()で表示するフォントをD7という変数に格納されているフォントに変更
  9.   textAlign(CENTER, CENTER);//text()で指定した座標を中心としたテキストボックスを作成
  10.   text("0123456789", width / 2, height / 2);//画面の真ん中に"0123456789"を表示
  11. }
 これを実行すると↓のようになります。
スクリーンショット 2020-12-25 172007

Processingだけでハッカーっぽい画面を作った話

なんとなく、Processingの中で完結するハッカーっぽい画面とそれに付随する映像を作ったので、その記事です。細かいのをちょくちょく出します。

 一応できたものとしては、ちょうど555行のコードを書いて↓みたいな映像を作りました。
 これからちょくちょく使った技術のメモを”ハッカーっぽい画面を作る”のタグで書いていこうと思います。
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

読者登録
LINE読者登録QRコード