第6回:得点を表示しよう! (文字の表示、乱数) 2006年度ゲームプログラミング ゲームプログラミング 第6回:得点を表示しよう! (文字の表示、乱数)
文字の表示 メソッドdrawStringを使います。 gc.drawString(文字列, x, y); 2006年度ゲームプログラミング 文字の表示 メソッドdrawStringを使います。 gc.drawString(文字列, x, y); 文字列:表示したい文字を“ ”で囲います。 画面左上に「A」という文字を表示させる gc.drawString(“A”,0,0);
GAME OVERと表示 ゲームがストップしている状態→gameState==1の時 2006年度ゲームプログラミング GAME OVERと表示 ゲームがストップしている状態→gameState==1の時 paintメソッドの中で、gameStateが1の時のみGAME OVERと表示する if(gameState==1){ GAMEOVERと表示 }
バーに当たった回数を数える 回数の保存には、変数を使う。int point; 初期値は0 point = 0; 2006年度ゲームプログラミング バーに当たった回数を数える 回数の保存には、変数を使う。int point; 初期値は0 point = 0; 画面下でバーで跳ね返した時に、数を加算 if (バーに当たったら){ 跳ね返りの処理 point++; // p=p+1; pを1増やす }
数字の表示 メソッドdrawStringを使います。 2006年度ゲームプログラミング 数字の表示 メソッドdrawStringを使います。 文字列の指定で「文字列+変数」という形にすると、文字列に続いて変数の値が表示されます。(変数部分は“ ”ではくくりません) gc.drawString(“score:”+point, 0,0); →pointが0の時はscore:0と表示 →pointが10の時はscore:10と表示
乱数を使おう メソッドrand(int min,int max)を呼ぶと、 最小値min~最大値maxのうち、無作為な値が返る。 2006年度ゲームプログラミング 乱数を使おう メソッドrand(int min,int max)を呼ぶと、 最小値min~最大値maxのうち、無作為な値が返る。 何の値が返ってくるかは、実行してみるまで不明。実行するたびに値が変わる (だから乱数と呼ぶ)
乱反射させよう 乱反射→進む方向をランダム(無作為)に 跳ね返り処理の時に進む方向、つまり dx,dyの値をランダムに指定。 2006年度ゲームプログラミング 乱反射させよう 乱反射→進む方向をランダム(無作為)に 跳ね返り処理の時に進む方向、つまり dx,dyの値をランダムに指定。 (例:上壁の処理) dx = gc.rand(1,2); →dx が1か2に dy = gc.rand(-1,1); →dy が-1か 0 か 1に dx も dy も0にすると停まってしまうので注意
スコアをランダムで増やそう point=point+1;ではなく、増える値を乱数で指定 →point=point+乱数 範囲は1~10; 2006年度ゲームプログラミング スコアをランダムで増やそう point=point+1;ではなく、増える値を乱数で指定 →point=point+乱数 範囲は1~10; → gc.rand(1,10);
複数の的を表示しよう 配列変数を使用。(変数の集まり) 配列の宣言 int a[]=new int[3]; →a[0],a[1],a[2]の 2006年度ゲームプログラミング 複数の的を表示しよう 配列変数を使用。(変数の集まり) 配列の宣言 int a[]=new int[3]; →a[0],a[1],a[2]の 3個の変数が使えるようになる。 ※ a[3]は使えないので注意
複数の的の宣言 宣言 static final int BLOCK_NUM = 3; //定数化しておくと数を増減しやすい 2006年度ゲームプログラミング 複数の的の宣言 宣言 static final int BLOCK_NUM = 3; //定数化しておくと数を増減しやすい int block_x[]=new int[BLOCK_NUM]; int block_y[]=new int[BLOCK_NUM]; int blockflag[]=new int[BLOCK_NUM]; //座標(x,y)と有無を示す変数を //BLOCK_NUMの数だけ用意する
For文で配列を効率的に使う for文を使って繰り返し for(int i=0;i<繰り返す回数;i++){ 繰り返す内容。 } 2006年度ゲームプログラミング For文で配列を効率的に使う for文を使って繰り返し for(int i=0;i<繰り返す回数;i++){ 繰り返す内容。 } 指定した回数繰り返され、かつ、 1回繰り返すごとにiが1づつ大きくなる →配列を[i]で指定することで、全ての的に同じ処理を行うことが可能
複数の的の初期化 for文を使って繰り返し for(int i=0;i<3;i++){ 2006年度ゲームプログラミング 複数の的の初期化 for文を使って繰り返し for(int i=0;i<3;i++){ blockflag[i]=1;//開始時は的がある block_x[i]= i *20 + 20; //x座標を20づつずらす。 block_y[i]= 30;//高さは同じ } ※座標が全く同じだと的が重なって複数にならないので注意(乱数を使っても良い)
複数の的を表示 for文を使って繰り返し for(int i=0;i<3;i++){ if(blockflag[i]==1){ 2006年度ゲームプログラミング 複数の的を表示 for文を使って繰り返し for(int i=0;i<3;i++){ if(blockflag[i]==1){ i番目の的を書く; } } →(block_x[i],block_y[i])に描画
複数の的のあたり判定(1) for文を使って繰り返し for(int i=0;i<3;i++){ if(i番目の的が存在していて、かつ 2006年度ゲームプログラミング 複数の的のあたり判定(1) for文を使って繰り返し for(int i=0;i<3;i++){ if(i番目の的が存在していて、かつ i番目の的とボールが接触していたら){ blockflag[i]=0;//的を消す point++;//得点を入れる } }
複数の的のあたり判定(2) ボールと(30,50)にある的が接触する条件 →的(30,50)とx,y座標の差が12以内 2006年度ゲームプログラミング 複数の的のあたり判定(2) ボールと(30,50)にある的が接触する条件 →的(30,50)とx,y座標の差が12以内 x - 30 >= -12 && x - 30 <= 12 && y - 50 >= -12 && y - 50 <= 12 ボールとi番目の的が接触する条件 →(x,y)と(block_x[i],block_y[i])を比べる x-block_x[i] >= -12 && x-block_x[i] <= 12 && y-block_y[i] >= -12 && y-block_y[i] >= 12