<<どうして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だとスプライトの表示順がちょっと不便 *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を足した値を移動量にする