マイコンArduinoを使って電光掲示板を作る。

マイコン

 

 

を使って電光掲示板を作る。

 

続き

今回はラケットで打ち返すプログラムに変更していきます。

 

今のプログラムでは四方跳ね返るので手前側は素通りする様に変更します。

方法は簡単で

    // ボールの位置 y軸
    if (!y_dir)
      y_pos++;
    else
      y_pos--;
    if (y_pos > 14) {
      y_dir = true;
    }
    if (y_pos < 1) {
      y_dir = false;
    }

太字の部分をコメントアウトするだけ。

 

では打ち返すにはどうすれば良いか

    if (y_pos == 14 && x_pos < racket_size + racket_pos && x_pos >= racket_pos) {
      y_dir = true;
    }

を太字の部分と入れ替えるだけです。

 

ラケットで打ち返すプログラム

// slx_5024
byte address[ ] = {5, 4, 3, 2};      // アドレスは扱いやすい様に配列で持つ
int pos = 0;
int count = 0;
int x_pos = 0;          // ボールの位置 x軸
int y_pos = 0;;         // ボールの位置 ý軸
boolean x_dir = false;  // ボールの進む方向 x軸
boolean y_dir = false;  // ボールの進む方向 ý軸
int speed = 10;
int racket_pos = 12;        // ラケットの位置
int racket_size = 8;        // ラケットのサイズ

void setup() {
  for (int i = 0; i < 11; i++) {
    pinMode(i, OUTPUT);             // 各ピンの設定 全てアウトプット
  }
  pinMode(11, INPUT_PULLUP);      // ピンの設定 インプットプルアップ
  pinMode(12, INPUT_PULLUP);      // ピンの設定 インプットプルアップ

  digitalWrite(0,LOW); // SE     L 自動でRAM切り替わり
  digitalWrite(1,LOW); // A/BB   書き込み用RAM選択 
  digitalWrite(6,LOW); // GREEN  緑データ
  digitalWrite(7,LOW); // CLK    クロック
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(9,LOW); // RED    赤データ
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void loop() {
  for (int i = 0; i < 16; i++) {                        // アドレス0~15
    for (int j = 0; j < sizeof(address); j++)
      if ((i & 0x1 << j) != 0)                          // address[0]~address[3]にビットをセット
        digitalWrite(address[j], HIGH);
      else
        digitalWrite(address[j], LOW);
        
    for (int k = 0;k < 32;k++) {
      if (k == x_pos && i == y_pos)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      else
        digitalWrite(9,LOW); // RED    赤データ               // データのセット

      // ラケットを描く
      if (i == 15) {          // 1番下の16段目
        if (racket_pos <= k && k < racket_size + racket_pos)
        digitalWrite(9,HIGH); // RED    赤データ              // データのセット
      }
      clock(); // クロック
    }
    write_ale_we(); // 書き込み操作 関数にまとめて有る
  }
  count++;
  if (count > speed) {
    count = 0;
    pos++;
    if (pos > 15) {
      pos = 0;
    }

    // ボールの位置 x軸
    if (!x_dir)
      x_pos++;
    else
      x_pos--;
    if (x_pos > 30) {
      x_dir = true;
    }
    if (x_pos < 1) {
      x_dir = false;
    }

    // ボールの位置 y軸
    if (!y_dir)
      y_pos++;
    else
      y_pos--;
   if (y_pos == 14 && x_pos < racket_size + racket_pos && x_pos >= racket_pos) {
      y_dir = true;
    }
    if (y_pos < 1) {
      y_dir = false;
    }

    // ラケットの位置
    if (digitalRead(11) == 0)
      if (racket_pos > 0)
        racket_pos--;         // 左へ移動

    if (digitalRead(12) == 0)
      if (racket_pos < 32 - racket_size)
        racket_pos++;         // 右へ移動
  }
}

void write_ale_we() {
  digitalWrite(10,HIGH); // ALE   アドレスラッチ Hで有効
  digitalWrite(8,HIGH); // WE     書き込み信号 Hで書き込み
  digitalWrite(8,LOW); // WE     書き込み信号 Hで書き込み
  digitalWrite(10,LOW); // ALE   アドレスラッチ Hで有効
}

void clock() {
  digitalWrite(7,HIGH); // クロック
  digitalWrite(7,LOW);  // クロック
}

void clock_n(int n) {
  for (int i = 0;i < n;i++)
    clock();
}

ラケットで打ち返している様子


www.youtube.com

 

次回はゲーム性を持たせるです。

 

では、また。

 

mckeechan.hatenadiary.com