FC2ブログ

東方迷幻誘

東方迷幻誘のサークルブログであり、総領のプログラミング話置き場的な所

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
東方弾幕風の話題を久しぶりに。

時々ツイッターで弾幕風のシステムとか色々考えている時に出てくる自己回帰(型)関数。ぶっちゃけ細かい名前はどうでもいい・・・というか本当にこの名前で合っているか分からないのですが、東方弾幕風でそんな関数作ってみました~という話

理論としては

1.一度呼び出されると、そのタスクが終了時に同じタスクを自分で呼び出す。

これだけです。非常に単純明快。それ故に実用化(?)する必要があるかどうか悩みましたがとりあえず作ってみました。

なお、この関数は迷走のEX紅魔郷ver2.xxだけに搭載されている試験運用中の関数です

先の杜の奇跡で配布した迷走のEX紅魔郷ver2.xxのソースコードをそのまま持って来たものが追記にあります。

末尾でTSystemタスクを自分で呼んでいます。これで自己回帰成立!

まぁそれだけです。利点としては手前の無限loopと後の無限loopがあって、後の無限loopに行った後に再び手前の無限loopに行きたい場合に使えるのかな?イメージ的には回りくどいGOTOです。

まあそんな話でした。
追記 以下オレンジバー内


task TSystem
{//冒頭追加制御処理
  if(SMPTL_GetForm==1)
  {
    if(SMPTL_GetOptionState("title")!=true)
    {
//        SMPTL_SetForm(0);
    }
    else
    {
      SMPTL_SetCursor(3);
    }
  }
  loop
  {
    if(SMPTL_GetStep=="TITLE")
    {
      break;
    }
    yield;
  }
  loop
  {
    if(SMPTL_GetStep!="TITLE")
    {
      break;
    }
    alternative(SMPTL_GetForm)
    case(1)
    {
      if(GetKeyState(VK_SHOT)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
      alternative(SMPTL_GetCursor)
      case(1)
      {
        SMPTL_SetCursor(3);
      }
      case(3)
      {
        if(GetKeyState(VK_UP)==KEY_PUSH)
        {
          SMPTL_SetCursor(1);
        }
        if(GetKeyState(VK_DOWN)==KEY_PUSH)
        {
          SMPTL_SetCursor(4);
        }
      }
      case(5)
      {
        if(GetKeyState(VK_UP)==KEY_PUSH)
        {
          SMPTL_SetCursor(4);
        }
        if(GetKeyState(VK_DOWN)==KEY_PUSH)
        {
          SMPTL_SetCursor(6);
        }
      }
      case(7)
      {
        if(GetKeyState(VK_UP)==KEY_PUSH)
        {
          SMPTL_SetCursor(6);
        }
      }
      case(8)
      {
        if(GetKeyState(VK_DOWN)==KEY_PUSH)
        {
          SMPTL_SetCursor(2);
        }
      }
    }
    case(11)
    {
      if(GetKeyState(VK_SHOT)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
      if(GetKeyState(VK_UP)==KEY_PUSH)
      {
        SMPTL_SetCursor(3);
      }
      else if(GetKeyState(VK_DOWN)==KEY_PUSH)
      {
        SMPTL_SetCursor(1);
      }
    }
    case(21)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
    }
    case(31)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
    }
    case(41)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
    }
    case(51)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
        SMPTL_SetOptionStatePh(work,"","title",SMPTL_GetOptionState("title"));
        SMPTL_SetOptionStatePh(work,"","debug",SMPTL_GetOptionState("debug"));
        SMPTL_SetOptionStatePh(work,"","omake",SMPTL_GetOptionState("omake"));
        SMPTL_SetOptionStatePh(work,"","count",SMPTL_GetOptionState("count"));
        SMPTL_SetOptionStatePh(work,"","anime",SMPTL_GetOptionState("anime"));
        SMPTL_SetOptionStatePh(work,"","secret",SMPTL_GetOptionState("secret"));
        SMPTL_SetOptionStatePh(work,"","chaos",SMPTL_GetOptionState("chaos"));
      }
      alternative(SMPTL_GetCursor)
      case(1)
      {
        SMPTL_SetCursor(4);
      }
      case(4)
      {
        if(GetKeyState(VK_UP)==KEY_PUSH)
        {
          SMPTL_SetCursor(1);
        }
        else if(GetKeyState(VK_DOWN)==KEY_PUSH)
        {
          SMPTL_SetCursor(7);
        }
        else if(GetKeyState(VK_LEFT)==KEY_PUSH || GetKeyState(VK_RIGHT)==KEY_PUSH)
        {
          alternative(SMPTL_GetOptionStatePh(work,"","count"))
          case(true)
          {
            SMPTL_SetOptionStatePh(work,"","count",false);
          }
          case(false)
          {
            SMPTL_SetOptionStatePh(work,"","count",true);
          }
        }
      }
      case(8)
      {
        if(GetKeyState(VK_SHOT)==KEY_PUSH)
        {
          SMPTL_SetOptionStatePh(work,"","title",true);
          SMPTL_SetOptionStatePh(work,"","debug",false);
          SMPTL_SetOptionStatePh(work,"","omake",false);
          SMPTL_SetOptionStatePh(work,"","count",true);
          SMPTL_SetOptionStatePh(work,"","anime",true);
          SMPTL_SetOptionStatePh(work,"","secret",false);
          SMPTL_SetOptionStatePh(work,"","chaos",false);
        }
        else if(GetKeyState(VK_UP)==KEY_PUSH)
        {
          SMPTL_SetCursor(5);
        }
      }
      case(9)
      {
        if(GetKeyState(VK_SHOT)==KEY_PUSH)
        {
          SMPTL_SettingOption;
          Retry;
        }
        if(GetKeyState(VK_DOWN)==KEY_PUSH)
        {
          SMPTL_SetCursor(3);
        }
      }
    }
    case(61)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
    }
    case(71)
    {
      if(GetKeyState(VK_BOMB)==KEY_PUSH)
      {
        SMPTL_SetWorkData("ANIMATION_COUNT_STEP",0);
      }
    }
    yield;
  }
  TSystem;
}

コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://kusamine.blog105.fc2.com/tb.php/758-4df6d812
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。