意図した画像が表示されない
まず、ファイル名の変更ミスが考えられます。また、既に同じ番号の画像がResフォルダ内にあった場合、
ドラッグ&ドロップの際、被らない番号に変更されます。
意図した番号から変わっていないか、確認してみましょう。
なお、使用する画像はimg0から順番に存在していない場合、
欠番の分、表示される画像がずれます。
この場合はダミーの画像を置くなどして欠番を埋めると良いでしょう。
・GameCanvasの機能:今週使う変数、メソッド
・gc.DrawImage(GcImage,int x,int y);
座標x,yにGcImageの画像を表示します。
画像は「GcImage.」にresフォルダの画像ファイル名を足して指定します。
(例:GcImage.BallYellow)
プログラムの編集を始める前に毎回する準備作業の手順を、別ページに移しました。 「課題の進め方」 ※今回は第4回なので、フォルダはk04に改名してください。 サンプルの起動を確認し、スクリプトが編集できる状態になったら、 続きを読み進めてください。
5行目(クラスに入った直後)に変数の宣言を書く
const int BALL_NUM = 30;
int[] ball_x = new int [BALL_NUM];
int[] ball_y = new int [BALL_NUM];
int[] ball_col = new int [BALL_NUM];
int[] ball_speed = new int [BALL_NUM];
GcImage[] ball_img = new GcImage [BALL_NUM];
int ball_w = 24;
int ball_h = 24;
InitGame()に初期化処理を書く
gc.SetResolution(640, 480);
for(int i =0 ; i < BALL_NUM ; i ++ )
{
resetBall(i);
}
UpdateGame()に更新処理を書く
for(int i =0 ; i < BALL_NUM ; i ++ )
{
ball_y[i] = ball_y[i] + ball_speed[i];
if(ball_y[i]> 480){
resetBall(i);
}
}
DrawGame()の中に描画処理を書く
gc.ClearScreen();
for(int i =0 ; i < BALL_NUM ; i ++ ){
gc.DrawImage(ball_img[i],ball_x[i],ball_y[i]);
}
DrawGame()の後、クラスを閉じる括弧の前にメソッドを追加
void resetBall(int id){
ball_x[id] = gc.Random(0,616);
ball_y[id] = -gc.Random(24,480);
ball_speed[id] = gc.Random(3,6);
ball_col[id] = gc.Random(1,3);
if(ball_col[id]==1){
ball_img[id] = GcImage.BallYellow;
}
else if(ball_col[id]==2){
ball_img[id] = GcImage.BallRed;
}
else {
ball_img[id] = GcImage.BallBlue;
}
}
キャラクターの画像を用意しましょう。
(Characterフォルダの中の画像をすべてresフォルダに追加しましょう)
※Character_LとCharacter_Rは古いgameCanavs用です。画像の一部を表示する機能は無くなりました。
int player_x = 304;
int player_y = 448;
int player_speed = 3;
int player_w = 32;
int player_h = 32;
GcImage player_img = GcImage.GR0;
if(gc.GetPointerFrameCount(0) > 0 ){
if(gc.GetPointerX(0) > 320) {
player_x += player_speed;
player_img = GcImage.GR0;
}
else {
player_x -= player_speed;
player_img = GcImage.GL0;
}
}
gc.DrawImage(player_img,player_x,player_y);
などを適宜追加します。
(変数は下記を追加しましょう)
int score = 0;
int time = 1800;
(UpdateGame内に下記の処理を追加しましょう)
timeを1減らす。
if(ボールとキャラクターが接触していたら){
if(timeが0以上なら){
scoreをcolの値だけ足す
}
ボールの座標等をリセット(resetBallを呼ぶ)
}
※接触判定はballの移動処理のあたり(for文で繰り返されるところ)に追加しましょう
。
※判定には前回つかったあたり判定のメソッドを使いましょう。
※gc.CheckHitRect(ボールの座標、幅、高さ、プレイヤーの座標、幅、高さ)
(draw内に下記の処理を追加しましょう)
gc.SetColor(0,0,0);
if(timeが0以上なら){
gc.DrawString("time:"+time,0,0);
}
else {
gc.DrawString("finished!!",0,0);
}
gc.DrawString("score:"+score,0,24);
※第1回の連打カウンターとほぼ同内容です。
などを適宜追加します。
//comboの機能を入れるついでに、プレイヤーの色が、
//取ったボールの色に変わるようにしてみましょう。
//変数を追加
int player_dir = 1;
int player_col = 4;
int combo = 0;
//ボールを取った時のスコア加算のあと、下記の処理を追加しましょう。
if(player_col == ball_col[i]) {
combo++;
score+= combo;
}
else {
combo = 0;
}
player_col = ball_col[i];
//スコア表示の後にコンボ数も表示してあげましょう。
gc.DrawString("combo:"+combo,0,48);
//以上で、同じ色を連続して取るとコンボボーナスが加算されるようになります。
//次に、アニメーション処理を改変します。
//画面右半分を押したときの処理に1行追加
player_dir = 1;
//画面左半分を押したときの処理に1行追加
player_dir = -1;
//キャラクター表示部分を下記に変えてみましょう。
if(timeが0以上の時){
drawCharacter(player_x,player_y, player_col, player_dir, (time%60>=15)?2:1);
}
else {
drawCharacter(player_x,player_y, player_col, player_dir, 3);
}
//drawが終わった後に下記メソッドを追加
void drawCharacter(int x,int y,int col,int dir,int anim){
GcImage[] images = new []{
GcImage.YR0, GcImage.YR1, GcImage.YR2, GcImage.YR3,
GcImage.RR0, GcImage.RR1, GcImage.RR2, GcImage.RR3,
GcImage.BR0, GcImage.BR1, GcImage.BR2, GcImage.BR3,
GcImage.GR0, GcImage.GR1, GcImage.GR2, GcImage.GR3,
GcImage.YL0, GcImage.YL1, GcImage.YL2, GcImage.YL3,
GcImage.RL0, GcImage.RL1, GcImage.RL2, GcImage.RL3,
GcImage.BL0, GcImage.BL1, GcImage.BL2, GcImage.BL3,
GcImage.GL0, GcImage.GL1, GcImage.GL2, GcImage.GL3,
};
int img_num = 0;
//colやanimやdirでimg_numの値を変える
img_num = (col-1) * 4 + anim;
if(dir == -1) img_num += 16;
gc.DrawImage( images[img_num], x ,y );
}
また、timeが0以上の時しかボールを表示しないようにすると、
ゲームの終了が分かりやすくなります。
(他にも分かりやすくする手段はありますが)
8bitまたは32bitの透過情報付きpngを用意してみてください。
gameCanvasの不具合化もしれません。
青いボールの代わりに、青い空の画像の一部を表示してあげましょう。
if(ball_col[i]==3){
gc.DrawClipImage(0,ball_x[i],ball_y[i],0,0,24,24);
}
else {
gc.DrawImage(ball_col[i],ball_x[i],ball_y[i]);
}
キャラクターの代わりにボールを表示してあげましょう。
課題2では。
gc.DrawClipImage(0,player_x,player_y,0,0,32,32);
課題4では。
if(player_col>=3){
gc.DrawClipImage(0,player_x,player_y,0,0,32,32);
}
else {
gc.DrawImage(player_col,player_x,player_y);
}
赤いボールや空も出ない場合は、空のgameCanvasを展開しなおしましょう。