Kayıtlar ve tekrarlar
Maçları sunucunuzda kaydedin, kayıtları diske yazın ve geri okuyun.
Bir kayıt, bir maçı tam olarak tekrar oynatmak için gereken her şeyi içeren kompakt bir ikili dosyadır (.ball2drep): stadyum, her girdi ve komut ile oynatmayı doğrulayan kontrol noktaları.
Bir maçı kaydedin
import { writeFile } from 'node:fs/promises';
room.onGameStart = () => room.startRecording();
room.onGameStop = async () => {
const blob = room.stopRecording();
if (!blob) return;
const bytes = Buffer.from(await blob.arrayBuffer());
await writeFile(`recordings/${Date.now()}.ball2drep`, bytes);
};startRecording() ve stopRecording() eşzamanlıdır. stopRecording() dosyayı doğrudan döndürür.
Odanın sonlandırdığı kayıtlar
Bazı olaylar sizin yerinize bir kaydı sonlandırır. Oda daha sonra kaydı onRecordingComplete'a iletir ve lastRecording içinde tutar:
| Neden | Ne zaman |
|---|---|
Recording limit reached | Bir saatlik oyun, 30 MB veya komut sınırı |
Stadium changed | Yeni bir stadyum yüklenmeden önce |
Room closed | Oda kapandığında, close() dahil |
Kayıt yaptığınız her durumda onRecordingComplete'i işleyin, böylece oda kapandığında sürmekte olan maçı kaybetmezsiniz:
room.onRecordingComplete = async (blob, reason) => {
await writeFile(
`recordings/${Date.now()}-auto.ball2drep`,
Buffer.from(await blob.arrayBuffer()),
);
};Bir kaydı okuyun
readReplay(), bir dosyayı oda olmadan çözer ve doğrular:
import { readFile } from 'node:fs/promises';
import { readReplay } from 'ball2d/node';
const replay = await readReplay(
new Blob([await readFile('final.ball2drep')]),
);
const seconds = (replay.end - replay.initial.tick) / 60;
console.log(
`${seconds.toFixed(0)} s, ${replay.commands.length} commands`,
);Çözülen Replay, stadyum kaynağını, başlangıç durumunu, komutları ve kadro değişikliklerini tutar.
Bir kayıt yalnızca onu oluşturan motor derlemesi tarafından okunabilir. Eski dosyaları daha sonra okumanız gerekiyorsa kayıt yaptığınız SDK sürümünü saklayın.