前へ 上へ 次へ


Processing入門12


二次元配列の応用(電光掲示板)

前に考えた次の絵をそのまま下に動かすことを考えてみる

fig29.jpg

以下のプログラムをコピーして、とにかく実行してみよう。

 int[][] s=new int[25][25];
 int[][] s2=new int[25][25];
 int[] x = {8,9,10,11,12,13,14,15,15,15,15,15,14,13,12,11};
 int[] y = {8,9,10,11,12,13,14,15,14,13,12,11,15,15,15,15};
 int edge,n;
   
 void setup(){
  size(126,126);
  frameRate(20);
  edge=5;
  n=16;
  for(int i=0; i<25; ++i){
    for(int j=0;j<25;++j){
      s[i][j] = 0;
   }}
  for(int i=0; i<n; ++i){ 
    s[x[i]][y[i]] = 1;
   }
  }
    
 void draw(){
   for(int i=0; i<25; ++i){
     s2[i][0] = s[i][24];
     for(int j=1;j<25;++j){
       s2[i][j] = s[i][j-1];
    }}
   for(int i=0; i<25; ++i){
     for(int j=0;j<25;++j){
       s[i][j] = s2[i][j];
    }}
   
   stroke(0);
   fill(255);
   for(int i=0; i<25; ++i){
     for(int j=0;j<25;++j){
       if(s[i][j] == 0){
         fill(255);}
       else{
         fill(0,0,255);}
       rect(i*edge,j*edge,edge,edge);
    }}
 }

setup()の中身までは、前のプログラムとほとんど同じ。draw()の後半(stroke()以降)も前のプログラムとほとんど同じで、配列sの中身を入れる部分と配列sに応じて白か青のマスを書く部分とにわけただけなので、わかると思う。

違いは、まずsと同じ大きさのs2という配列を作ったことと、以下の部分とにある

   for(int i=0; i<25; ++i){
     s2[i][0] = s[i][24];
     for(int j=1;j<25;++j){
       s2[i][j] = s[i][j-1];
    }}
   for(int i=0; i<25; ++i){
     for(int j=0;j<25;++j){
       s[i][j] = s2[i][j];
    }}

この前半

   for(int i=0; i<25; ++i){
     s2[i][0] = s[i][24];
     for(int j=1;j<25;++j){
       s2[i][j] = s[i][j-1];
    }}

では、各列について、まず24行目の中身すべてをそのままs2の0行目にコピーする。次にsの1行目をs2の2行目、sの2行目をs2の3行目という具合に、sの中身を1行ずつずらしながらs2にコピーする。これが終わると、s2の中身はsをそっくり1行分下にずらしたものになっている。次に

   for(int i=0; i<25; ++i){
     for(int j=0;j<25;++j){
       s[i][j] = s2[i][j];
    }}

で、s2の中身をそのままsに再コピーすると、sの中身は元のsをそのまま1行分下にずらしたものになっている。ちなみに、一番下の行は一番上に移っている。

これによって、drawが実行されるたびに、全体が一行ずれることになる。

このプログラムでは、絵はどんなパターンでもかまわない。パターンは最初にxとyに入れてあるので、ここを書き換えるだけで、どんなパターンでも同様に動かせる。

練習問題

電光掲示板っぽく、細長い画面で適当な言葉や絵が横に動いていくように、書きかえよ。


前へ 上へ 次へ