Tôi tự hỏi về cách các cơ chế thao tác thời gian trong các trò chơi thường được thiết kế. Tôi đặc biệt quan tâm đến việc đảo ngược thời gian (giống như trong SSX hoặc Prince of Persia mới nhất).
Trò chơi là một game bắn súng 2D từ trên xuống.
Cơ chế tôi đang cố gắng thiết kế / thực hiện có các yêu cầu sau:
1) Hành động của các thực thể ngoài nhân vật người chơi là hoàn toàn xác định.
- Hành động mà một thực thể thực hiện dựa trên các khung được tiến hành kể từ khi bắt đầu cấp và / hoặc vị trí của trình phát trên màn hình
- Các thực thể được sinh ra tại thời điểm thiết lập trong cấp độ.
2) Đảo ngược thời gian hoạt động bằng cách đảo ngược trở lại trong thời gian thực.
- Hành động của người chơi cũng bị đảo ngược, nó phát lại ngược lại những gì người chơi thực hiện. Người chơi không có quyền kiểm soát trong thời gian đảo ngược.
- Không có giới hạn về thời gian đảo ngược, chúng ta có thể đảo ngược tất cả các cách để bắt đầu cấp độ nếu muốn.
Ví dụ:
Khung 0-50: Người chơi di chuyển foward 20 đơn vị trong thời gian này Enemy 1 sinh ra ở khung 20 Enemy 1 di chuyển còn lại 10 đơn vị trong khung 30-40 Người chơi bắn đạn vào khung 45 Bullet đi 5 foward (45-50) và giết Enemy 1 tại khung 50
Đảo ngược điều này sẽ phát lại trong thời gian thực: Người chơi di chuyển lùi 20 đơn vị trong thời gian này Enemy 1 hồi sinh ở khung 50 Bullet xuất hiện lại ở khung 50 Bullet di chuyển lùi 5 và biến mất (50-45) Kẻ địch di chuyển sang trái 10 (40-30) Kẻ địch bị loại bỏ tại khung 20.
Chỉ cần nhìn vào chuyển động tôi đã có một số ý tưởng về cách đạt được điều này, tôi nghĩ rằng có một giao diện thay đổi hành vi khi thời gian đang tiến hoặc đảo ngược. Thay vì làm một cái gì đó như thế này:
void update()
{
movement += new Vector(0,5);
}
Tôi sẽ làm một cái gì đó như thế này:
public interface movement()
{
public void move(Vector v, Entity e);
}
public class advance() implements movement
{
public void move(Vector v, Entity e)
{
e.location += v;
}
}
public class reverse() implements movement
{
public void move(Vector v, Entity e)
{
e.location -= v;
}
}
public void update()
{
moveLogic.move(new vector(5,0));
}
Tuy nhiên tôi nhận ra rằng đây sẽ không phải là hiệu suất tối ưu khôn ngoan và sẽ nhanh chóng trở nên phức tạp đối với các hành động nâng cao hơn (chẳng hạn như chuyển động trơn tru dọc theo các đường cong, v.v.).