Replay 功能 程式Code

September 20, 2008 in Magical Broom Shooting!, Programming

上班時完成的REPLAY功能

要等到回家才可以測試  先暫時放在這裡

基本上除了我之外 沒有人會理解到這堆程式的原理 (最少要花點時間理解啦)  

讀取玩家INPUT:

Sint32 InputRecord[7]; 

if (Replay_Mode==0)//Init Array    

for (int i=0;i<7;i++) InputRecord[i]=0;
bool ButtonPressed[7];
for (int i=0;i<7;i++)
ButtonPressed[i]=false; //INIT ARRAY      

                    

if (start){ //Read Keyboard Input

 if ( LunaInput::GetKeyData( DIK_Z ) ) ButtonPressed[K_SHOOT]=true;
 if ( LunaInput::GetKeyData( DIK_X ) ) ButtonPressed[K_BOMB]=true;
 if ( LunaInput::GetKeyData( DIK_LSHIFT) ) ButtonPressed[K_SLOW]=true;
 if ( LunaInput::GetKeyData( DIK_UP ) ) ButtonPressed[K_UP]=true;
 if ( LunaInput::GetKeyData( DIK_DOWN ) ) ButtonPressed[K_DOWN]=true;
 if ( LunaInput::GetKeyData( DIK_LEFT ) ) ButtonPressed[K_LEFT]=true;
 if ( LunaInput::GetKeyData( DIK_RIGHT ) ) ButtonPressed[K_RIGHT]=true

}

//….coding skipped…

       for (int i=0;i<7;i++)
       Replay_Memory[frame][i]=InputRecord[i];

//end of reading input

Replay 檔案製作:

 if (Replay_SaveStep>0){  //用8個frame完成檔案 writing (USING IO)
    switch(Replay_SaveStep){
        case 4:{
       
             char Strings[33] ;
             sprintf(Strings, “%d%d%d-[START]\n”,Current_Stage,gamemode,mp->atype);
             outFile << Strings;
 
             for (int i=0;i<frame;i++){
                      for (int j=0;j<7;j++){
                               sprintf(Strings, “%d”,Replay_Memory[i][j]);
                               outFile << Strings;
                      }
                    sprintf(Strings, “-%dF\n”,i);
                    outFile << Strings;
              }
         
             sprintf(Strings, “@@@@-[REPLAY ENDED]-@@@@”);
             outFile << Strings;
        } break;
        case 2:{
                outFile.close();
                char Strings[33] ;
                sprintf(Strings, “replay/dat_%d.rpy”,rmenu->Selected);
                CopyFileX(“replay/dat_temp.rpy”,Strings);  
        } break;
        case 1:{
                rmenu->SelectMode=0;
  
                pause=1;
                mp->life=9;
                rmenu->HiddenLife=1;
        } break;    
    }
   
    Replay_SaveStep–;
 } 

REPLAY 檔案播放:

       for (int i=0;i<7;i++)
       if ( Replay_Memory[frame][i]==1 ) ButtonPressed[i]=true;
       

       for (int i=0;i<7;i++){
             if ( Replay_Memory[frame][i]>=2 || Replay_Memory[frame][i]<0) {
             sprintf(System_Message, “Replay File Ended” );
             Message_Time=575;     
             pause=1;
             Replay_Finished=1;
             }
       }

//CONTINUE AT LINE 424

 

REPLAY 檔案 SAVE / LOAD 選單 :

void Replay_Menu(void){
     char Strings[32];
     int offsety=200;
     Sint32 alphap=(rmenu->Delay-50)*5;
     if (alphap>255) alphap=255;
     if (alphap<0)   alphap=0;
     int alpha=alphap;
     if (rmenu->Delay<100) rmenu->Delay++;
     if (rmenu->Delay<0)  alphap=255;
     for (int FileID=0;FileID<20;FileID++){
      alpha=alphap;
      if (rmenu->Selected!=FileID) alpha=(int)(alpha/4);
      ef (rmenu->Delay<0 && (rmenu->Delay*-1)%2==0) alpha=32;
      if (FileID<10) sprintf(Strings, “No.0%d”,FileID);
      else  sprintf(Strings, “No.%d”,FileID);
      LunaFontSprite::DrawString( lFontSpr[5],Strings, 270, offsety+=25, PRIMITIVE_Z_CENTER,        COLOR_ALPHA(alpha) );
     }
     if (rmenu->Delay==-1){
         if (Replay_Mode==0) {Replay_SaveStep=8; Replay_Finished=1;}
     }
}

 

產生出來的REPLAY 檔案 樣本

132-[REPLAY FILE HEADER]  //前面的數字代表 Stage / 模式 / 自機TYPE
43943090         //分數
GEMA-YUE        //玩家名稱
2008/9/20       //replay 日期
09:32               //replay 時間
59.42343FPS    //平均fps
0000000-0F    //這位置開始紀錄玩家input
0000100-1F    //次序是
0000100-2F    //上 | 下 | 左 | 右 |shoot | bomb | slow 
1000100-3F    // F 是 frame數  (不必要)
1000100-4F
0000100-5F
0000100-6F
0000100-7F
0000100-8F
0000100-9F
0000100-10F
0000100-11F
0000100-12F
0100100-13F
0100100-14F
0100100-15F
0000100-16F
0000100-17F
0000100-18F
0001100-19F
0001100-20F
0001100-21F
0001100-22F
0001100-23F
//..中途省略…

0000000-3989F
0000000-3990F
0000000-3991F
0000101-3992F
0000100-3993F
0000100-3994F
0000000-3995F
@@@@-[REPLAY ENDED]-@@@@ // REPLAY結束 DETECT用

Replay 功能 程式Code

12 Comments

    1. ck.R says:

      YUE果然是高手………
      何時有得下載來玩A_A

    2. O says:

      YUE很強啊…
      我e+才知道…原來int可以這樣用-_-”
      只看得明很少-_-”

    3. O says:

      我學了一陣子C++就是不識Array怎樣用-_-”

    4. onebig says:

      現在才明白讀取記錄的原理是
      可以把按過的鍵由頭run一次
      很整齊的呀=]

    5. bbbaaa says:

      睇到眼花= =

    6. gema_yue gema_yue says:

      >>ck.r

      還有一段時間 :(

      >>O

      int用法? 你是指 i++ i–?

      >>onebig

      這是最簡單和最有效率的方法
      不過問題是 亂數一定要記起來..
      或是可以被預測得到
      只要有一個frame不同步都會得到一些奇怪結果

    7. O says:

      我一直以為int是用做計數用…無想到可以用作做games-_-”

      (有人話正games最好用C#,YUE同意嗎?)

    8. gema_yue says:

      遊戲本來就是數學的世界 :)
      (C# 個人未研究過 不過用DirectX做引擎的話過是用C++比較方便)

    9. O says:

      請教一下…LunaInput::GetKeyData內的 “::”是什麼意思…
      c++在書上對它略有簡解,但我不明白…請YUE大教一教我
      (今日6:30先轉3號,不用上學lu ^^)

      [東方緋想天的replay用C++開了,跟YUE的有點不同...DDDD@@@@@@@@@@@@@@@@ <~~囧]

    10. geme_yue says:

      那是因為目前我的replay還未進行 壓縮和加密
      這麼快做這個步驟會 令我開發慢起來..
      因為壓縮和加密後就看不到入面內容的意思
      (加上每個Programmer 的 Style都不一樣
      Replay不同是正常的)

      另外 LunaInput :: GetKeyData 是指
      外部Class “LunaInput” 內的 Function “GetKeyData”
      這很難解釋 (

    11. O says:

      原來是這樣…多謝指教,另外 “::”是指Class嗎…

    12. O says:

      “::” 理解到了…只是,為什麼文字縮小了那麼多- -

Leave a Reply

Replay 功能 程式Code

0 Trackbacks