[p5入門]クリエティブコーディングで暇を持て余したいあなたへ

# p5.jsとは？

processingがブラウザでできるようになったよ、みたいなやつ。

# 準備

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>p5.js practice</title>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/p5.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/addons/p5.dom.min.js"></script>
  <script src="try1.js"></script>
</body>
</html>
```

```try1.js
function setup(){
  ////描画範囲指定
  createCanvas(windowWidth, windowHeight); 
  //背景色指定
  background('gray');
  //円描画（位置指定x軸,位置指定y軸,円の縦幅指定,円の横幅指定）
  ellipse(windowWidth/2, windowHeight/2, 72, 72); 
}

function draw(){
}

```

これだけで・・・はじめられる！
円の描き方などはrefferenceとか、processingを参考にしましょう。

![](https://i.gyazo.com/ac8fa8bdd93c2f40ac789eeb17a4cf39.png)

# コミュニティ　openprocessing

processingのいいところはコミュニティが発展しているところ。
誰かが作ったexampleを触ってみたい人は[openprocessing](https://www.openprocessing.org/)で探しましょう。
基本的にはprocessingで書かれているので、p5.jsで実行するには書き換えなければならないですが、
ちらほらp5.jsで書かれているものもあります。

検索して・・・

![](https://i.gyazo.com/dde4fa25f68cbc35f5dd43681e3bb810.png)

実行したいものを見つけて・・・

![](https://i.gyazo.com/ebb8421fd774694e374b92f36aecf992.png)

コードも公開されているのでコピペして

![](https://i.gyazo.com/2aa720e4abe92ac6395f7df89cba7fd2.png)

触ってみましょう

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>p5.js practice</title>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/p5.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.5.4/addons/p5.dom.min.js"></script>
  <script src="try2.js"></script>
</body>
</html>
```

```try2.js
//walker object
function Walker() {
  //temp nx, ny value holders
  var nxloc;
  var nyloc;

  //original values
  this.xloc = windowWidth / 2;
  this.yloc = windowHeight / 2;
  //generate walker direction
  this.move = function() {
    //choose integer 1-8 for direction: 1- 0 degrees, 2- 45 degrees, 3- 90 degrees etc.
    var dir = floor(random(1, 9));
    var t = random(0, 800);
    //generate temp nx, ny values based on dir
    switch (dir) {
      case 1:
        nxloc = this.xloc + t;
        break;
      case 2:
        nxloc = this.xloc + t;
        nyloc = this.yloc + t;
        break;
      case 3:
        nyloc = this.yloc + t;
        break;
      case 4:
        nyloc = this.yloc + t;
        nxloc = this.xloc - t;
        break;
      case 5:
        nxloc = this.xloc - t;
        break;
      case 6:
        nxloc = this.xloc - t;
        nyloc = this.yloc - t;
        break;
      case 7:
        nyloc = this.yloc - t;
        break;
      case 8:
        nxloc = this.xloc + t;
        nyloc = this.yloc - t;
    }
    //draw line
    line(this.locx, this.locy, nxloc, nyloc);
    //scaled 3x line
    line(this.locx * 3, this.locy * 3, nxloc * 3, nyloc * 3);
    //ensure walker does not go off of canvas
    if (this.xloc < 0 || this.nxloc < 0 || this.xloc > windowWidth || this.nxloc > windowWidth || this.yloc < 0 || this.nyloc < 0 || this.yloc > windowHeight || this.nyloc > windowHeight) {
      this.xloc = windowWidth / 2;
      this.yloc = windowHeight / 2;
      this.nxloc = windowWidth / 2;
      this.nyloc = windowHeight / 2;
    }
    //re-enter walker with new x,y values
    this.locx = nxloc;
    this.locy = nyloc;
  }

}

function setup() {
  createCanvas(windowWidth, windowHeight);
  //set density for pixels[] manip
  pixelDensity(1);
}

function draw() {

  background(-frameCount % 200, 24, 0, .5);
  fill(random(122, 255));
  //ground
  rect(-10, windowHeight / 1.4, windowWidth + 20, windowHeight / 1.4);
  //little explosions
  for (var g = 0; g < 2; g++) {
    ellipse(random(0, windowWidth), random(0, windowHeight), random(2, 50));
  }
  //text stuff, self explanitory
  textSize(windowWidth / 5);
  var word = "P5.js";
  word = word.toUpperCase();
  textFont("Helvetica");
  //draw rainbow layers of 3d text
  for (var c = 0; c < 8; c++) {
    fill(random(0, 255), 255, 255);
    text(word, windowWidth / 2, windowHeight / 1.4);
    translate(c * .5, c * .5);
  }
  //text-align
  textAlign(CENTER);
  //blacked out layer on top
  fill(0);
  text(word, windowWidth / 2, windowHeight / 1.4);
  //fill for big moon circle behind text
  fill(random(144, 255), random(128, 255), random(200, 255), .07);

  //big moon
  ellipse(random(-6, 6) + windowWidth / 3, random(-6, 6) + windowHeight / 5, random(150, 160));

  //shooting stars shapes
  beginShape();
  vertex(windowWidth / 2, windowHeight / 2);
  noFill();
  for (var b = 0; b < 4; b++) {
    curveVertex(random(0, windowWidth), random(0, windowHeight));
  }
  endShape();
// instantiate walker
  var walker = new Walker();
  var walker2 = new Walker();
  for (var i = 0; i < 4; i++) {

    colorMode(HSB);
    stroke(frameCount % 200, 255, 255);

    fill(frameCount % 200, 255, 255)
    walker.move();
    //translate(-windowWidth/6,-windowHeight/6);
    walker2.move();
    //scale(-cos(PI/.4)*PI^2)
    ellipse(walker.locx, walker2.locy, random(2, 20));

  }
//pixel manip
  loadPixels();
  for (var x = 0; x < width; x++) {
    for (var y = 0; y < height; y++) {
      var index = (x + y * width) * 4;
      if (pixels[index - 4] < pixels[index + 1]) {
        pixels[index - 2] = random(255);
        pixels[index + 4] = random(200, 255);
        pixels[index + 5] = random(255) * -y;
      }

      if (pixels[index] > 240) {
        pixels[index + 1] = random(0, 100);
        pixels[index - 1] = random(0, 100) * 2;

      }
    }

  }
  updatePixels();
  smooth();

}
```

実行！

![](https://i.gyazo.com/afb5609b00644bbb291d6bcc75fb82ef.png)

# 誰かのコードをいじってみる

try2.jsのコードをいじってみましょう。

###文字の部分を変えてみたり・・・

```元コード.js
var word = "P5.js";
```

```元コード.js
var word = "HELLO";
```

![](https://i.gyazo.com/127ccca9c1c2a81d9472d0aab5528138.png)

###月の大きさを２倍に変えてみたり・・・

```元コード.js
  //big moon
  ellipse(random(-6, 6) + windowWidth / 3, random(-6, 6) + windowHeight / 5, random(150, 160));
```

```元コード.js
  //big moon
  ellipse(random(-6, 6) + windowWidth / 3, random(-6, 6) + windowHeight / 5, random(150*2, 160*2));
```

![](https://i.gyazo.com/aa5bbc3bb3a601fec5ef67f00e8b6a7f.png)

誰かのコードを参考に、
好きなものを作っていきましょう。
3D描画や、音、カメラなども使ってるexampleも多いので楽しみましょう:hugging_face: