2017 ソフトウェア設計及び演習用の班Wiki
17::gr04::木津谷航大::ballモジュールのanime.cへの備忘録
どうしてballモジュールをベースに作ったか
- 制作する時間が切迫していて、他のお手本ソースで同じドローイングエリアになかなか2つ以上のスプライトを表示できなかったから
- ballモジュールは同じドローイングエリアに大量のスプライトを表示できたので、これをベースにして制作することにした。
- 一つのモジュールさえできれば、他のモジュールを表示させるのは数分でできるようになった
スプライトを表示するCファイルにとりあえず書く関数
- mySprite *s_○○_new(myAnimeArea *area);
- main文から与えるareaに対してスプライトを作成
- mySprite *○○ = my_sprite_new(area, bg_pic, 20, (GSourceFunc)s_bg_init, (GSourceFunc)s_bg_move);
- bg_picには画像のソースを指定(static gchar *〇〇_pic = "image/〇〇.png"みたいな感じ)
- 第4引数はスプライトを初期化する関数を指定
- 第5引数はスプライトを動かす関数を指定
- return 〇〇で〇〇を返す
- void s_〇〇_init(mySprite *sprite);
- 表示したいスプライトの初期座標を指定する *一度だけ呼ばれる
sprite->x = 0; sprite->y = 0; sprite->dx = -2;
のように初期化しておくと、最初にmain文で呼んだ時にx=0,y=0,dx=-2の状態で呼ばれる
- void s_〇〇_move(mySprite *sprite);
- この関数で動きを定義する
- この関数はループする関数
myAnimeArea *area = sprite->anime_area; gint x = sprite->x; gint y = sprite->y; gint dx = sprite->dx, dy = sprite->dy; gint width = sprite->width; gint height = sprite->height;
でとりあえずスプライトの値をとっておいて、xやy座標にいろいろ足したり引いたりして最終的に、
- sprite->x = x; で値を戻すと、そのx座標にスプライトが表示される
- 座標は特に指定しない限りは左上がゼロ
- これだけかければ、main文からs_〇〇_new(area)を呼ぶことで画面に表示できる(はず)
スプライトの動かし方とか
- 動きはs_〇〇_move中で定義する
- 例えば、dx = -2;のように書き、sprite->x = x + dx;などと書くとs_〇〇_move関数が一回実行されるたびにxの座標が-2ずつ減る
anime.cのGList構造
- デフォルトのanime.cだとスプライトの表示順がちょっと不便
- anime.c中のmy_sprites_draw(myAnimeArea *area)中のGList構造を書き換える
- GList構造のスプライトで、一番最後のスプライトで初期化して、スプライトを一つ描画したらその前のスプライトを指定する
GList *sprites = area->sprites; sprites = g_list_last(sprites); gpointer sprite; while(sprites!=NULL) { sprite = sprites->data; my_sprite_draw((mySprite *) sprites->data); sprites = g_list_previous(sprites); }
のように書き換える
スムーズなスクロール
switch(scroll_flag){ case 0: bg_dx = -1; bg_accel = bg_accel + -1; if(bg_accel < -10) bg_accel = -10; break; case 1: bg_dx = 0; if(bg_accel < 0) bg_accel++; else if(bg_accel > 0) bg_accel--; else{ bg_accel = 0; break; } break; case 2: bg_dx = 0; if(bg_accel < 0) bg_accel++; else if(bg_accel > 0) bg_accel--; else{ bg_accel = 0; break; } break; default: break; } }else dx=0; dx = bg_accel + bg_dx;
- scroll_flagでスクロースしている向きを判定する
- スクロールするフラグが立っていない時は、加速度を減少させて、ゼロにする(bg_accel)
- スクロールさせるフラグが立っている時、まず初期移動量bg_dxに定数を代入し、関数が一回実行されるたびに加速度bg_accelの値を増やす
- 最後にbg_dxとbg_accelを足した値を移動量にする
最終更新日:2017/08/04 02:26:43