だんだんと、ブロック崩しっぽくなってきました。今回は、ブロックを表示させます。
ブロックの配置を、いろいろと変えたり、難しい位置にするには、どこにブロックを配置するかを決めなければなりません。そこで、今回は配列を使います。
配列とは、引き出しや学校のげた箱のように、同じ大きさの箱が並んだものだと思ってください。
例えば、
C言語などと、配列の宣言方法が異なりますが、上のように宣言をすると、縦3行×横5列の配列が用意されます。
また、宣言と配列の初期化を一緒に行うことができます。
宣言と初期化を同時に行う
int [ ][ ] a={ {1,1,1,1,1},
{2,2,2,2,2},
{3,3,3,3,3};
ブロックの配置を、図のようにしたいと思います。
そこで、ブロックがある場所を1、ブロックがない場所を0として、配列を初期化します。
図の赤で書いた数字で、配列blkを初期化します。
ブロックの表示は、for文を2つ重ねます。
1つ目のfor文で、行を指定して、2つ目のfor文で列を指定します。
ブロックの表示
//ブロックを描く
stroke(255,255,255);/*線を白く*/
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if( blk[i][j] != 0 ){
line(j*blkw,(i+1)*blksp,(j+1)*blkw,(i+1)*blksp);
}
}
}
ボールの最初の位置を、(200,350)に変更します。
ブロックを表示する
//ウインドウの大きさ
int yoko=400,tate=600;
//ボールの半径を5
int r=5;
//ボールの座標
float x=200,y=350;
//移動方向の初期値
float dx=2,dy=2;
//ラケットの半分の長さ
float rtw=25;
float rtx,rty=550;
//ブロック(block)の幅
int blkw=40;
//上下の間隔
int blksp=30;
//ブロックの配置用配列
int[][] blk={
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,0,1,0,1,0,1,0,1,0},
{0,1,0,1,0,1,0,1,0,1},
{1,1,0,0,1,1,0,0,1,1},
{0,0,1,1,0,0,1,1,0,0},
{1,1,1,1,1,1,1,1,1,1},
{1,1,1,1,1,1,1,1,1,1}};
void setup()
{
size(yoko,tate);
//カラーモードの設定
//RGBの各色を256まで使えるようにする
colorMode(RGB,255);
//背景色を黒にする
smooth();
frameRate(120);
}
void draw()
{
int i,j;
background(0,0,0);
fill(248,252,13);/*黄色で塗りつぶす*/
stroke(248,252,13);/*線も黄色で*/
ellipse(x,y,2*r,2*r);/*ボールを描く*/
fill(255,255,255);
rtx = mouseX;
//ラケットを描く
stroke(255,255,255);/*線を白く*/
line(rtx - rtw,rty,rtx + rtw,rty);/*ラケットを描く*/
//ブロックを描く
stroke(255,255,255);/*線を白く*/
for(i=0;i<10;i++){
for(j=0;j<10;j++){
if( blk[i][j] != 0 ){
line(j*blkw,(i+1)*blksp,(j+1)*blkw,(i+1)*blksp);
}
}
}
//壁あたり判定
if( x+dx+r > yoko)//右の壁の判断
dx = -dx;
if( x+dx-r < 0)//左の壁の判断
dx = -dx;
if( y+dy+r > tate)//下の壁の判断
dy=-dy;
if( y+dy-r < 0)//上の壁の判断
dy=-dy;
//ラケットの上面あたり判定
if( y+r >= rty && y+r <= rty+dy && x>=rtx - rtw && x<=rtx+ rtw){
dy = -dy;
}
x +=dx;
y +=dy;
}
どうでしょうか、ブロックが表示されましたね。
疑問
でも、ブロックにボールがあたっても跳ね返りません。すり抜けていきます?!?!
答え
それは、ボールがブロックにあたったかの判定と、あたった場合の処理を書いていないからです。(毎度おなじみ)
ポイント
とりあえず、ここで使った2次元配列をよく覚えておいてください。
次回は、ブロックのあたり判定と処理を行います。