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);
    }

のように書き換える

画像の左右切り替え

  • あらかじめスプライトの書く座標をとっておいてから、その座標を使ってmy_sprite_newする
  • 初期化する部分の関数は新たに作っておく
  • 指定する画像を書き換えたい画像にする

スムーズなスクロール


    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