0_0_52

 obake   specification   version 

落下処理の実装中

object instance の variables に

  • DownWell = false;
  • AddVspeeD = true;

といった判定用フラグを追加、しかしまだシッカリと仕様が固まっていないため使い方があいまい

実装にまつわる問題点

タイルのスワップを高速に連続して行うことが可能だが、その仕様のせいでスワップ実行中のタイルが落下処理に入ってしまう場合がある。この時の処理をどうするかで悩む。

一応実装完了。動作テストをしてみる。安定性が評価できれば _53 へ進む?

日を改めて動作検証、とりあえず色々動作を改善させてみたが大きな修正は終わった感アリ。

既存の関数である

  • PF_Check_IDandPos();

の動作をチェックした上で、関数に変更は加えなかったが参考にして別の処理を関数化した。

新しい仕様として、落下処理中にスワップが実行されている場合は色の一致があってもスワップ操作自体をキャンセルする扱いとなる。 また落下処理中にスワップが含まれている場合は

  • PickTiID

をチェックして、これに一致するものがあるかを Phy_Control() 関数の末尾でチェックしている。

Phy_Start = false;
    if (n == true){
        var j            = PickTiID;
        Phy_Falling      = true;
        MvBricksPaiRFlag = true;
            if (instance_exists(j)==true){
                if (j.DownWell == true){
                    PickTiID  = noone;
                    PickTileF = false;
                    Clear_PickedAround();
                };
            };
    };

DownWell が true の場合は落下処理中ということなので、スワップは無効。そして選択も無効となる。

  • PickTileF = false;
  • Clear_PickedAround();

この二つのステートメントも実行することで、操作自体をキャンセル扱いにできている。

この直後は

  • QF_IF_PRESSed();

へ処理が移行するため、タッチ操作に遅延が生じない。

追加された変数

  • Phy_Start = false;
  • Phy_Falling = false;

  • Phy_StandLiST = ds_list_create();//ID

  • Phy_StandCT = ds_list_create();//Count Number

  • Phy_StartTimer = ds_list_create();//Timer

  • Phy_FaLLiST = ds_list_create();//ID

  • Phy_FallCT = ds_list_create();//Count Number

  • Phy_EndTimer = ds_list_create();//Timer

リストをそれぞれ追加、timeline_moment にバグがあったため少々ややこしい

リストはそれぞれタイミングで二つに大別される

タイルが消えてすぐに落ちるのではなく、すこしディレイを設けて、その後落下を始める

追加された関数

  • ( QF_ComboChallenge(); )
    • Phy_Stoping();が呼び出される
  • ( Phy_Control(); )
    • Init_TimeLinePhy();
    • ADD_TimeLinePhy( moment );
    • Phy_SToppinG();

落下中オブジェクトを一定時間経過後に落下させたり停止させる関数処理

バグ

GM:Studio の Built-In Functions である timeline_moment_add_script が致命的なバグを抱えている。 リソースに追加して使う分にはあまり問題なさそうだが、GML から動的にリソースとして作成して、随時 moment を追加しようとすると、 Win+YYCではクラッシュ、HTML5では問題無さそうなどコンパイラによっては致命的なバグとなる。

回避策としては自力で Timleline相当の機能をGMLで実装してしまうこと。ds_list などを使えば十分自分で作れる。

動作チェック

前述した timeline_moment_add_script のバグが怖いため、_52 を安定的と評価して良いか微妙だが、ここらでブランチして _52 をベースに各エクスポートした動作を観察するためのビルドを行う。

  • HTML5

  • Android

  • win + YYC

この三つがターゲットである。

一応動作は安定的、しかし落下中スワップに横移動途中処理が入った場合に不具合あり。

バグ修正後 → 仕様を変更

_52B としてマイナーチェンジ。仕様自体を変えた。

  • mv_A();
  • mv_Exits_B(id, depth);

この二つを大幅に変更。主な変更はスワップ中に落下が始まったら操作をその時点でキャンセル扱いとする。

従来はキャンセル扱いになってもスワップ動作は通常通り実行されていたが、この仕様を辞めて、スワップを即時中止する。そして即時中止した時点でXY座標位置も xstart , ystart に戻す。そしてキャンセル扱いとなったことをユーザに報告するためのアイコンとして、中止になった事を示すアイコンをスワップペアの中間に表示する。このアイコンはエフェクトなので時間が経つと消える。

そして ev.SwapColorQue にキューが入っているので、ここから該当IDを消すためのロジックを mv_Exits_B() に追加。

var a,b,c;
    with(argument0){
        x            = xstart;
        y            = ystart;
        depth        = argument1;
        b            = TiDBak;
            if (AddVspeeD==false){
                TiD          = b;
                TiDBak       = noone;
                TiDID        = 0;
                b            = TiD;
                TAFlag       = false;
            };
        sprite_index = Set_Animation_Normal(b);
        image_angle  = 0;
        c            = SwaPID;
        SwaPID       = noone;
        //TAFlag       = false;
        TAGUIFlag    = false;
            if (c.SwaPID != noone){
                a = instance_create(CenX, CenY, vanish);
                a.sprite_index = canceled;
                a.depth        = GameDepth;
            };
    };
var d,e, f, g;
d = ds_queue_size(ev.SwapColorQue);
e = ds_queue_create();
g = false;
    repeat(d){
        f = ds_queue_dequeue(ev.SwapColorQue);
            if (f==argument0){
                    if (g == false){
                        break;
                    };
            }
            else{
                ds_queue_enqueue(e, f);
                g = true;
            };
    };

    if (g==true){
        ds_queue_copy(ev.SwapColorQue , e);
    };

従来よりちょっと複雑な処理になった



次へ

前へ