0_0_57C

 obake   specification   version 

0.57B で安定化と思ったが、バグフィックスに手間取る。

PK_Set_WTimer 絡みのバグフィックスを継続中。

コンボが一個とか二個とかササヤカな時には気が付かなかったのだが、コンボが 7 とか 8 とか操作に一切の油断もミスも無く順調に進んだ場合、アクティブスワップの性能がフル活用されるとまだバグが残っているのだと気が付かされる。

逆に言うと、のろのろ操作している間はバグに遭遇しないということ。

    if (TAFlag == true){
      AddVspeeD = true; // to Physics Canseller.
        if (a == ev.PickTiID){
            TiDBak    = TiD;
            TiD       = noone;
        }
        else{
            d = ev.PickTiID;
              if (d != noone)
              {
                 ev.PickTiID  = noone;
                 //ev.PickTileF = false;
                   if (instance_exists(d) == true)
                   {
                       //show_message("This");
                       d.TAFlag    = false;
                       d.AddVspeeD = false;
                       //d.TiDBak    = noone;
                       //d.TiD       = d.TiDBak;
                   };
              };
        }; 

0.57B で問題が出るので、さらに厳密に処理をしてみた。どういう状況でバグが発生しているのかいまいち不明瞭。アクティブスワップが多発している状態で、重力、重力キャンセラなど想定されていた全てが同時に機能しているような複雑な状態で発生する。再現性もいまいち不明。

    if (TAFlag == true){
      AddVspeeD = true; // to Physics Canseller.
        if (a == ev.PickTiID){
            TiDBak    = TiD;
            TiD       = noone;
        }
        else
        {
            d = ev.PickTiID;
              if (d != noone)
              {
                 ev.PickTiID  = noone;
                   if (instance_exists(d) == true)
                   {
                       if (d.TAFlag == true)//mv_Action() or PickTileQueA or mv_A()
                       {
                           show_message("This = "+string(d.SwaPID));
                           d.AddVspeeD        = false;
                       }
                       else
                       {
                           show_message("d.TAFlag = false & d.SwaPID = "+string(d.SwaPID));
                       };
                   };
              }
              else
              {
                  show_message("# ev.PickTiID is noone; & id is "+string(a)+" : SwaPID = "+string(SwaPID));
              };
        }; 
    }

そうこうする内にまたバグの再現性があやふやになってきたため、該当する箇所にデバッグメッセージを設けて様子を見ることにした。再現性が明確にならないとバグを発見できない。しかしある程度操作に慣れてしまうといわゆる「想定外の操作」をしないよう、身体が覚えてしまうことがあって、こうなるといくら操作してもバグが出現し無くなってしまう。現在この膠着状態に陥ってしまった。バグがあることを認識しながら、悔しいがその部分はしばらく放置するしか無い。

変更点

スタートアップ処理を変更。

起動された OS のタイプを判定してから画面解像度を得て、スタートアップのウィンドウサイズを変更する処理。

これまで INI を利用せずにグローバル変数とタイマーで起動直後の処理を選択させてきたが、これだと起動処理に時間がかかる環境では正常にスタートアップ処理が終了しない場合があった。これを改め、INI できちんと起動状態を管理するようにした。しかし案外正常に動くロジックを作るのに手間取る。最終的にグローバル変数と連携させた。計測された起動に要した時間も念の為保存しておく。デバッグ用。

追加されたグローバル変数

global.GAMERESTARTFLG = false;

デバッグで多用されるルームの再起動が起こった時、グローバル変数は true 化される。アプリケーションが終了されない限りスタート画面に戻ってもウィンドウサイズ初期化処理には移行しない、そのためのフラグ。

global.GAMERESTARTFLG = false;
var a,b,c,D,E,F,g,H,L;
a = get_timer();// score,live are not useless -> global
b = "InitGUI";     // Section Name
c = "Startup";     // Key Name
D = "DebugRestart";// Section Name
E = "DebugFLAG";   // Key Name
F = "OFF";         // "#Ini READ Error, Event: st_Create_1";// Default value
//g =  "";         // special flag for User-Defined function Restart();
H =  "ON";
L =  true;           

ini_open(IniFileName);
g = ini_read_string(D,E,F);
    if (g == F) // if "OFF"
    {
        ini_write_string(D,E, H);
        ini_write_real(b,c, a);
    }
    else        // if  "ON"
    {
        L = false;
    };
ini_close();

上記処理の後、再起動やゲーム終了に絡むイベントとして SetFlagRestart 関数を実装。

///SetFlagRestart( boolean );
var a,b,c, D;
a = IniFileName;
b = "DebugRestart";
c = "DebugFLAG";

ini_open(a);

    if (argument0 == true)
    {//show_message("SetFlagRestart ON");
        D = "ON";
        ini_write_string(b,c, D);
        global.GAMERESTARTFLG = true;
    
    }
    else// if false
    {//show_message("SetFlagRestart OFF");
        D = "OFF";
        ini_write_string(b,c, D);
    };

ini_close();

値を再度初期化して、次回起動時へ備える。ゲーム終了時、自動的にセーブデータを保存する仕様へいずれ拡張する。




次へ

前へ