0_0_62

 obake   specification   version 

0.61 をベースにしたマイナーバージョンアップ。

ゲームエンジンとは切り離して、ユーザインターフェースを実装中。デザインは後から、まず機能実装を優先。

コードの整理は 0.61 で行った。0.60C と 0.61 との比較では更新量がかなり多い。object の統廃合も行ったため、コードの完全互換性が無くなっているはず。

バグ

新規お化けの補充後、連鎖判定処理に一部不具合を確認。再現性は不明。本当にバグなのかもわからない。タイミング的に微妙で、ちょうど判定処理があった時に、他タイルが移動中だったとか?それもありえないはずだが、判定処理をもう一度よく見てみるしか無い。

作業中

ユーザインターフェース用の部品 ( objects ) は 0.61 で揃えたので、これらに機能実装。一部を除いて、仕様がしっかりと固まっているものだけを先に完成させた。保留中の機能については仕様が十分に検討されていないため着手できない。.gcolour については、実装が少し面倒なので後回しにしている。

  • .topbar — 実装完了
  • .point — 完了
  • .wincomb — 完了
  • .gtimer — 完了
  • .gmove — 完了
    • .gcolour — ■ 途中まで : BusteredObake AC42D78
    • .gscore — ● 保留
    • .gmission — ● 保留
    • .gfunc — ■ 追加予定:Grid Functionsをそれぞれ何回使ったか

パーツ結構多い。細かくパーツ化することでメンテナンス性を上げる。この辺りは次回の製作でも活用したいので、ノウハウは文章化しておく。

手数をカウントする機能について、トリガーになっているイベントはmv_Action。ここで ev.VanishFlag == true の時、ev.CtMovesN++; とする。

修正

Android YYC Build でコンパイルエラー。エラーメッセージを読むとデータの保存に関するコード部分に違反があった。簡易ビルドではエラーが出ない部分。

原因判明、ini_write_real で文字列を書きこもうとしていた。単純ミス。Android はビルドに時間かかるので失敗すると時間的な損失が痛い。GML だと普段は変数型でエラーはほとんど出ないから油断があった。

該当部分を修正してビルド後、今度はエラー無し。

修正

DR_TileActivation 関数処理をシェーダ処理へ変更。sprite の ”waku” は使わなくなったから消せる?→ 消せません。ゲームボード上にできた空欄を表示する際に利用されている。

if (instance_exists(c) == true)
{
        if (c.TAGUIFlag == false)
        {
           //draw_sprite_ext(e,0, c.x, c.y, 1,1,0,-1, a);
           c.StatS = SsGrey;
        };
}

上記へ変更。Draw call が減った分、新しいコードの方が処理速度的には多少有利になるはず。

c.StatS は 実際の draw 処理の後に 1 == SsNormal へ戻される。

PF_Check_IDandPos の処理に不足があったためコメントアウトされていた部分TAGUIFlag = false;を復帰。

if (a.DownWell = false)
{
    var b = 1;
        with (a)
        {
            x            = xstart;
            y            = ystart;
            depth        = -TY;
            image_xscale = b;
            image_yscale = b;
            TAFlag       = false;
            TAGUIFlag    = false;
        };
};

Draw_CharSTaT ユーザ定義関数

///Draw_CharSTaT();
var a = StatS;

switch (a)
{
    case SsGrey:   DRSH_GReY(); StatS = SsNormal; break;
    case SsMask:   DRSH_LerpC();                  break;
    case SsFun:    break;// SsFun
    case SsSad:    break;// SsSad
    case SsWow:    break;// SsWow
    case SsGod:    break;// SsGod
    default:       DRSH_PassTH();// SsNormal
};
StatS = 0;

中はマダ未定義が多い。Grey 処理の後、StatS を元へ戻す処理が入っている。

Phy_End/QF_3Match ユーザ定義関数

Phy_EndQF_3MatchQF_RepairPressed 関数処理を追加

///Phy_End();
if (MvTargetCT == 0)
{
 if (Phy_NumOfBricks == 0)
 {
  if (ds_list_size(Phy_StandLiST) == 0)
  {
      ds_grid_copy(Aval , MG);
      Phy_NumOfBricks  = noone;
      MvBricksPaiRFlag = false;
      QF_RepairPressed();
  };
 };
};
///QF_3Match();
if (OBKFinalize)
{
    if (OBKSummon == 0)
    {
        OBKFinalize = !OBKFinalize;
            if ds_queue_empty(Phy_CHaiN)
            {
                ds_queue_copy(Phy_CHaiN , OBKQue);
                ds_queue_clear(OBKQue);
            }
            else
            {
                show_message("QF_3Match::Error, #Phy_CHaiN is NOT Empty.");
            };
    };
}
else
{
    if (OBKSummon == 0)
    {
        if ds_queue_empty(Phy_CHaiN)
        {
            if (!FuncButtSwitch)
            {
                FuncButtSwitch = true;
                QF_RepairPressed();
            };
            //QF_RepairPressed();/* この位置で実行してはいけない >> 悪い例として残した >> 0_0_62B 以降修正済み  */
        };
    };
};

QF_RepairPressed(); 関数にも少し手が加えられている。rebirth オブジェクト・インスタンスの最終処理に絡んだもの。

.Rebirth のインスタンス処理

var a, b,c,d, e,f, G,H,Q;

a = DoronBitID;

G = TX;
H = TY;
Q = TiD;

    with(ev)
    {
        DoronBitXY[a] = false;// Clear 1D-Flag Array to false.
        
        b = TDX[G];
        c = TDY[H];
        d = instance_create(b,c, tile);// New "Obake" will be Summoned.
        ds_queue_enqueue(OBKQue, d);
        e = .0;
        f = RDT;
        Init_CreateObake( d, e, c, G, H, f, Q );
        MG[# G , H]   = d;    // Source Grid
        Aval[# G , H] = d;    //  Copy Grid
        PickArrFlg    = true;
        OBKSummon--;// decrement counter
    };

instance_destroy();

新しく補充されたお化けに関する処理にフラグを追加。 ev.PickArrFlg フラグ変数をトリガーとする。

ev.PickArrFlg フラグ変数は 0_0_62 で追加された。このフラグが ture の時、再選択が実行される。

選択を再実行

お化けの補充後、選択を再実行

修正 → QF_IF_PRESSed 関数

    if (c[3] == false)                         /*         F A L S E         */
    {
        if (MvTargetCT == 0) /*            pair tiles are moving            */
        {
            QF_ClearPressed();
                if (FuncButtSwitch == true)/*      I F        T R U E       */
                {
                    if (Phy_Falling = false)/*       Function Buttons       */
                    {
                        d = collision_point(a,b,fb,false,true);
                        PF_Check_VKS( d );
                    };
                };
        };

範囲外でマウスクリックした時の処理を QF_ClearPressed(); へ変更。

ここまでは PickTiID = noone; 処理が無かった。そのため動作の一部がおかしいバグがあったため、これが改善された。

バグ 0_0_62A

基本操作に異常が発生するようになった。0_0_61 までは見なかったバグが頻繁に出るようになったため、0_0_62 で最近作ったバグだと思われる。

QF_3Match の処理に不具合

バグ 0_0_62A の原因として QF_RepairPressed(); 関数を実行するタイミングが最悪だった事、条件の判定が甘かったことなど。

修正版 QF_RepairPressed 関数

///QF_RepairPressed();
var a,b;
a = PickTiID;
b = false;

    if instance_exists(a)
    {
        if (a.DownWell == false)/* FALSE */
        {
            if (a.PiTFlag == false)/* FALSE */
            {
                if (a.TAFlag == false)/* FALSE */
                {
                    b = true;
                }
                else                  /*  T R U E  */
                {
                    if (PickArrFlg == true)/*  TRUE   */
                    {//インスタンスが移動中は再選択動作をさせない、 TiDID で状態を参照
                        if (a.TiDID == noone)/*  noone   */
                        {
                            PickArrFlg = false;
                            b          = true;
                        };
                    };
                    
                };
            };
        };
    };

    if (b == true)
    {
        PF_PickTile(true, a);
        PickArrounds();
    };

修正後はまた安定している。

バグ Grid 0, index out of bounds

compile のエラー警告が出ていることに気がついた。エラーの発生源を探すが、具体的なソースコードの位置を教えてくれないためどこが不具合なのか分からない。

バージョンをさかのぼってみたが、0_0_50 より以前には無く、0_0_51 からエラー警告が出ている。半年以上前にこしらえたバグのようだが、今まで警告に気がついてなかった。

0_0_50 は 3-Match 判定の実装まで、0_0_51 からは 3-Match 判定後の落下処理を実装中のバージョンなので、落下処理に不具合が隠れているっぽい。

レイアウト

Objects List

Game Parts

Screen Layout




次へ

前へ