Arduino編 第12回 Processingを使ってスカッシュゲームを作ってみよう

この回はProcessingを使います。
Processingについては第8回 レーダーを作成して、Processingで検証してみるの記事に書いてますので、そちらを参考にしてください

準備するもの

  1. 可変抵抗器(10kΩ): 1個
  2. ジャンパー線: 3本

ページトップ

ブレッドボードへの接続

(1)ブレッドボードへの接続を行っていきます

frizing画像

ページトップ

プログラムの作成(Processing)

(1) Processing側のプログラムを作成します

Squash_Pr.pde

// Arduinoと通信するためのライブラリを読み込む
import processing.serial.*;

// シリアル通信を行うための変数の定義
Serial port;

// ボールの位置
float px, py;

// ボールの速度
float vx, vy;

// ラケットの現在位置と1ステップ前の位置
float rx, rx1;

void setup () {
    // 400x400ドットの画面を作成
    size(400, 400);

    // 通信ポートと速度の設定
    port = new Serial(this, "COM3", 9600);

    // ボールの初期位置と初期速度
    px = 100;
    py = 200;

    // ラケットの初期位置
    rx = width/2;
    rx1 = rx;

    // 返信要求を送る
    port.write('a');
}

void draw(){
    // 画面を黒で塗りつぶして更新
    background(0);

    // 線なし
    noStroke();

    // 塗りつぶしの色を白に
    fill(255);

    // ボールが動ける白い範囲を描く
    rect(20, 20, width-40, height-20);

    // 塗りつぶしの色を青に
    fill(0, 0, 255);

    // ラケットの描画
    rect(rx, height-20, 40, 20);

    // 塗りつぶしの色を灰色に
    fill(127);

    // ボールの描画
    ellipse(px, py, 10, 10);

    // 文字の表示
    if (vx == 0 && vy == 0){ 
      textSize(24);
      text("To start double-click", 80, 100);
    }
    // 左の壁にぶつかったら横方向の速度を反転
    if (px < 25) vx = -vx;

    // 右の壁にぶつかったとき
    if (px > width-25) vx = -vx;

    // 上の壁にぶつかったら縦方向の速度を反転
    if (py < 25) vy = -vy;

    // ラケットとの衝突判定
    if (py > height-25) {
      if (px > rx && px < rx+40)
        // ラケットの移動速度によりボールの速さを変える
        vy = -(abs(rx1-rx)*0.5+2);
    }

    // ラケットよりボールが下に行った場合
    if (py > height) {
      // 文字の表示
      text("Game Over", width/2, height/2);
      vy = 0.1;
      }

    // ボールがラケットの下に行ってから約3秒経過したか
    if (py > height+9) {
      // 初期値に戻す
      px = 100;
      py = 200;
      vx = 2;
      vy = 2;
      rx = width/2;
      rx1 = rx;
    }

    // ボールの位置の更新
    px += vx;
    py += vy;

    // 1つ前のラケットの位置を保存
    rx1 = rx;
}

void serialEvent(Serial p) {
    // 文字列の読み込み
    String ms = p.readStringUntil('\n');

    // 改行コードの削除とint型への変換
    rx = int(trim(ms));

    // 可変抵抗器の角度によりラケットの位置を決める
    rx = map(rx, 0, 1023, 20, 340);

    // 返信要求を送る
    port.write('a');
}

void mousePressed() {
    // 画面の更新速度を30fps
    frameRate(30);
 
   // 文字の大きさを24pt
    textSize(24);

    // 表示位置を中心
    textAlign(CENTER);
    vx = 2;
    vy = 2;
    port.bufferUntil('\n');

    // 返信要求を送る
    port.write('a');
}

ページトップ

プログラムの作成(Arduino)

(1) Arduino側のプログラムを作成します

Squash_Ar.ino

void setup() {
  // 通信速度を9600bpsに
  Serial.begin(9600);
}
void loop() {
  // データが送られてきたか?
  if (Serial.available() > 0) { 

    // 値を読み込む
    int c = Serial.read();

    // アナログ値を読み込む
    int v = analogRead(0);

   // 文字列として送る
    Serial.println(v);
  }
}

ページトップ

マイコンボードへの書き込み

(1) 作成したプログラム(Squash_Ar.ino)をコンパイルします

コンパイル

(2) マイコンボードへ書き込みます

マイコンボードへの書き込み

ページトップ

実行する

(1) Processingを起動して、作成したファイル (Squash_Pr.pde)を開きます

Processing起動

(2) 再生ボタンをクリックして実行します

プログラムの実行

(3) ダブルクリックすると始まります

可変抵抗器のつまみを回すとラケット(上図青い部分)が動きます

ゲームの説明

ページトップ