MFT2014に展示したHeart & Starバッジの動画です。
星が徐々に消えて、今度はハート型になります。
星型に配置したLEDの一部を消すとハート型になるように
LEDの配置を工夫しています。
消えたり現れたりするところに乱数を使っていますが、
PICのコンパイラXC8の標準関数rand()を使用すると
処理が重くて実用的ではありません。
そこで、自前の乱数関数を作ってみました。
と言っても、昔の8bitマイコンでゲームを作っていたときに
使用していたものと同じです。(当時はアセンブラでした)
unsigned char random(void){
static unsigned char rand = 0;
rand = rand * 13 + 1;
rand = rand << 4 | rand >> 4;
return (rand);
}
簡単なM系列乱数です。
8ビットの場合、√256に近い素数を掛けて1を足すと
最長周期の疑似乱数となります。
ただ、このままだとパターン性があるので、
私は上下4ビットをスワップしました。
徐々に変化するところの処理について質問を受けたので説明します。
実はこんな処理をしています。
for (i = 0; i < 4; i++){
tris_buf |= (random() < rate)? led_patt[pat][cnt] & ledmap[cnt][i]: 0;
}
TRISA = tris_buf ^ 0x3F;
要は、1ドットに対して乱数を発生させて
rateより小さいと点灯、大きいと消灯させます。
rateを小さくしていくとだんだん消え、
大きくしていくとドットが現れていきます。
言われてみると、超簡単な処理なのですが、
なかなか思いつかないものです。
ただ、私はビデオの信号処理などをやっていたので、
ビデオエフェクタのワイプ処理のときに思いつきました。
これを90年代にLSIに入れたりしていました。
星が徐々に消えて、今度はハート型になります。
星型に配置したLEDの一部を消すとハート型になるように
LEDの配置を工夫しています。
消えたり現れたりするところに乱数を使っていますが、
PICのコンパイラXC8の標準関数rand()を使用すると
処理が重くて実用的ではありません。
そこで、自前の乱数関数を作ってみました。
と言っても、昔の8bitマイコンでゲームを作っていたときに
使用していたものと同じです。(当時はアセンブラでした)
unsigned char random(void){
static unsigned char rand = 0;
rand = rand * 13 + 1;
rand = rand << 4 | rand >> 4;
return (rand);
}
簡単なM系列乱数です。
8ビットの場合、√256に近い素数を掛けて1を足すと
最長周期の疑似乱数となります。
ただ、このままだとパターン性があるので、
私は上下4ビットをスワップしました。
徐々に変化するところの処理について質問を受けたので説明します。
実はこんな処理をしています。
for (i = 0; i < 4; i++){
tris_buf |= (random() < rate)? led_patt[pat][cnt] & ledmap[cnt][i]: 0;
}
TRISA = tris_buf ^ 0x3F;
要は、1ドットに対して乱数を発生させて
rateより小さいと点灯、大きいと消灯させます。
rateを小さくしていくとだんだん消え、
大きくしていくとドットが現れていきます。
言われてみると、超簡単な処理なのですが、
なかなか思いつかないものです。
ただ、私はビデオの信号処理などをやっていたので、
ビデオエフェクタのワイプ処理のときに思いつきました。
これを90年代にLSIに入れたりしていました。