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用
12 Comments
Leave a Reply











YUE果然是高手………
何時有得下載來玩A_A
YUE很強啊…
我e+才知道…原來int可以這樣用-_-”
只看得明很少-_-”
我學了一陣子C++就是不識Array怎樣用-_-”
現在才明白讀取記錄的原理是
可以把按過的鍵由頭run一次
很整齊的呀=]
睇到眼花= =
>>ck.r
還有一段時間
>>O
int用法? 你是指 i++ i–?
>>onebig
這是最簡單和最有效率的方法
不過問題是 亂數一定要記起來..
或是可以被預測得到
只要有一個frame不同步都會得到一些奇怪結果
我一直以為int是用做計數用…無想到可以用作做games-_-”
(有人話正games最好用C#,YUE同意嗎?)
遊戲本來就是數學的世界
(C# 個人未研究過 不過用DirectX做引擎的話過是用C++比較方便)
請教一下…LunaInput::GetKeyData內的 “::”是什麼意思…
c++在書上對它略有簡解,但我不明白…請YUE大教一教我
(今日6:30先轉3號,不用上學lu ^^)
[東方緋想天的replay用C++開了,跟YUE的有點不同...DDDD@@@@@@@@@@@@@@@@ <~~囧]
那是因為目前我的replay還未進行 壓縮和加密
這麼快做這個步驟會 令我開發慢起來..
因為壓縮和加密後就看不到入面內容的意思
(加上每個Programmer 的 Style都不一樣
Replay不同是正常的)
另外 LunaInput :: GetKeyData 是指
外部Class “LunaInput” 內的 Function “GetKeyData”
這很難解釋 (
原來是這樣…多謝指教,另外 “::”是指Class嗎…
“::” 理解到了…只是,為什麼文字縮小了那麼多- -