0_0_59A

 obake   specification   version 

0_0_59 をベースとしたデバッグ版。

QF_Dororon 関数のソート処理で間違いがあった。以下は修正版。

///QF_Dororon();
if (DoronFlg){
if (!Phy_Falling){
if (!MvBricksPaiRFlag){
if (TryCombTimer == 0){
/* =================================================================== */
var a,b, c,d,e,f,g,h, m,n, o,p, Q,R, z;
a    = (AW-1);// 7-1
b    = (AH-1);// 7-1
f    =      0;// Counting Number of New Objects for compairing with "CtCaptuN".
n[b] =      0;// Array to stock the IDs.
Q    =      a;
R    =  false;

    for (var i=a; i>=0; i--){/*  columns   */
    for (var k=b; k>=0; k--){/*   rows     */
    
      c = MG[# k , i];
        if (c == noone)
        {
            m = (k + (((i << 2)+(i << 1)) + i));// calculate on (columns + rows) == (k + (AW * i));
                if ( DoronBitXY[m] == false )
                {
                    R = true;
                    d = TDX[k];// rows
                    e = TDY[i];// columns
                    f++;       // add +1, when instance will be create.
                    g = OG[# k , Q];// 6 > 5 > 4 > 3 .. 0
                    h = g.TiD;
                    z = instance_create(d,e, rebirth);
                        with (z)
                        {
                            depth        = GameDepth;
                            alarm[0]     = (room_speed >> 1);
                            vspeed       = 0;
                            TX           = k;
                            TY           = i;
                            TiD          = h;// color -> 1,2,4,8,16,32,64 (POW2)
                            sprite_index = Set_Animation_Stocker(TiD);
                            DoronBitID   = m;
                        };
                    DoronBitXY[m] = z;
                        with(g) /* Create additional OBAKE vanising effects */
                        {
                            o               = instance_create(x,y, OGQues);
                            o.ObakeRegister = g;/*  Visible Flag will be turn on by this ID.  */
                            o.TX            = TX;
                            o.TY            = TY;
                            n[k]            = o;
                            visible = false;
                        };
                    DoronLoop[k]++;
                };
        };
    };/*   End  Rows  Loops  */
        if (R == true) {Q--; R = !R;};
    };/* End  Columns  Loops */

for (var i=b; i>=0; i--)/*  Loop  Start  on  each  Rows   */
{
    p = DoronLoop[i];/*     Get position on Column        */
        if (p > 0)
        {
            with(n[i])
            {
                ObakeGoDownF = true;
            };
        };
    DoronLoop[i] = 0;/* Finalize */
};

/* Debug Message */
if (f != CtCaptuN){show_message("Error#QF_Dororon : mismatching data...CtCaptuN : "+string(f)+" , "+string(CtCaptuN));};

/* finalize */
FuncButtSwitch = false;
DoronFlg       = false;
CtCaptuN       = 0;
/* =================================================================== */
   };
  };
 };
};

この関数名は覚えやすいためキーワードとして気に入った。

その他バグ

現在致命的なのは、新しいお化けがゲームボードに補充された際、3-Match がその時点で成立しても、これを判定できていない点。

解決法として、新しく召喚されるお化けが何体なのかをカウント、召喚後カウントは減、やがてカウンターがゼロになる、この時に 3-Match 判定処理を実行。

召喚数をカウントするための変数が必要になる。

変数追加

ev.OBKSummon 変数追加。

QF_Dororon 関数へ処理を追加。

OBKSummon++;// the counter increments on each new summoned “Obake”.

召喚されたお化けが全部で何体になったのか、カウントする変数。新しく追加される毎にインクリメント。この変数の値は rebirth. インスタンスが消えるタイミングでデクリメントされる。

最終的に 0 となったら、3-Match 判定を実行する。

新しく 3-Match 判定処理を作る必要性?

いまさらだが、ゲームボード上の全てのインスタンスを対象とした総当り式の 3-Match 判定処理を作ってなかったかもしれない。

これまではスワップしたタイルだけを対象にした処理とか、重力で落下したオブジェクトを対象にした処理、つまり総当りではなく専用処理としてなるべくループが少なくなるよう作っていた。その方が手間かかるけれど検索にかかるコストが低いため。

総当り方式も一応すでに実装があるのだが、これはヒント機能。最終的な目的が違うため、この処理をそのまま適用ってわけにはいかない様子だ。

検討した結果、追加された変数など

ev.OBKQue = ds_queue_create(); データ構造として Que の追加。

ev.OBKFinalize = false; ブーリアン

QF_3Match 関数の追加。

以上を追加作成した。

///QF_3Match();
if (OBKFinalize)
{
    if (OBKSummon == 0)
    {
        //show_message("OBKSummon == 0");
        //TS_CK_Solver(true);
        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.");
            };
    };
};

QF_3Match はフラグをチェックし、キューをコピーするだけ。3-Match の判定処理は次ステップの初回、重力処理が終了した後に実行されるユーザ定義関数「 QF_ComboChallenge 」で実行される。タイミング制御が重要なので、新しく判定用の関数を作るとデバッグが複雑になってしまう、これを避けたかった。

新規作成された「お化け」を重力効果が終わったインスタンスとみなし、OBKQue で管理されている ID 群を Phy_CHaiN へコピーする。

データ構造 Phy_CHaiN が空でない場合、Check_TypeOne 関数から QF_ComboChallenge(); が機能する仕組み。関数の再利用が効率的。

Check_TypeOne

    if (Aflag == true) /*         C h e c k   D r a g           */
    {
       QF_ComboChallenge();
       QF_Movement();
       
           if (TouchDisable == false) /*   TouchDisable ->> Important :: Skip 1 step   */
           {
                if (PickTileF == true) /*     T R U E    */
                {
                    if (YoYo_MouseCheckButtonPressed(0 , mb_left))
                    {
                         QF_IF_PRESSed();
                    }
                    else if (YoYo_MouseCheckButton(0 , mb_left))
                    {
                         QF_IF_PRESSing();
                    };
                }
                else              /*         F A L S E         */
                {
                    if (keyboard_check(ord("S")) == true)
                    {
                         GE_SaveGrid_EX(string(global.Hit_R_Count));
                    }
                    else if (keyboard_check(ord("L")) == true)
                    {
                         GE_LoadGrid_EX();
                    };
                    
                    if (YoYo_MouseCheckButtonPressed(0 , mb_left))
                    {
                         QF_INI_PRESSed();
                    };
                };
           };
           
       TouchDisable = false;/*       Important :: Skip 1 step        */
       QF_Dororon();
       QF_3Match();
    }

オブジェクト rebirth. で新しく作成したオブジェクト・インスタンスの ID を OBKQue へ渡す処理を追加。

///the time coming..
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
        
        OBKSummon--;// decrement counter
    };
    
instance_destroy();

追加および変更点は以上。

循環処理が上手く働き過ぎというか、単発コンボながら延々と作ることができる。上手い下手に関係なくある程度のコンボなら適当につなげていくだけでも達成する。さすがに8コンボとかは計画的に動かないと無理。

ゲームボードの回転機能もテスト中。




次へ

前へ