Làm cách nào để mã hóa Time Stop hoặc Bullet Time trong trò chơi?


11

Tôi đang phát triển một nền tảng RPG một người chơi trong XNA 4.0. Tôi muốn thêm một khả năng khiến thời gian "dừng lại" hoặc chậm lại và chỉ có nhân vật người chơi di chuyển ở tốc độ ban đầu (tương tự như phép thuật Dừng thời gian từ loạt Cổng hói). Tôi không tìm kiếm một triển khai chính xác, thay vào đó là một số ý tưởng chung và các mẫu thiết kế.

EDIT: Cảm ơn tất cả cho đầu vào tuyệt vời. Tôi đã đưa ra giải pháp sau đây

    public void Update(GameTime gameTime)
        {

            GameTime newGameTime = new GameTime(gameTime.TotalGameTime,
 new TimeSpan(gameTime.ElapsedGameTime.Ticks / DESIRED_TIME_MODIFIER));
            gameTime = newGameTime;

hoặc một cái gì đó dọc theo những dòng này. Bằng cách này, tôi có thể đặt thời gian khác cho thành phần người chơi và khác với phần còn lại. Nó chắc chắn không đủ phổ biến để làm việc cho một trò chơi trong đó thời gian cong vênh như thế này sẽ là một yếu tố trung tâm, nhưng tôi hy vọng nó sẽ hoạt động trong trường hợp này. Tôi không thích thực tế là nó tạo ra vòng lặp Cập nhật chính, nhưng chắc chắn đó là cách dễ nhất để thực hiện nó. Tôi đoán đó là điều cần thiết giống như t shipode đã đề xuất, vì vậy tôi sẽ cho anh ta đánh dấu màu xanh lá cây :)

Câu trả lời:


8

Đây có thể là một giải pháp tồi, nhưng không nhất thiết phải như vậy. Nếu bạn đang sử dụng thời gian delta, bạn có thể thay đổi điều đó để thay đổi tốc độ của một số thứ nhất định.

Ví dụ:

player.update(dt)
dt = dt * .5 --half speed
enemy.update(dt)

Điều này, tất nhiên, chỉ hoạt động nếu bạn có thể biết khi nào bạn đang cập nhật kẻ thù chứ không phải thứ gì khác. Bạn cũng có thể cung cấp cho mọi thứ một giá trị tốc độ và làm một cái gì đó như:

x = x + xspeed * dt * speed

Phần đầu tiên có ý nghĩa hoàn hảo, phần thứ hai không rõ ràng
AturSams

2
Chỉ cần cung cấp cho mỗi đối tượng di chuyển một biến tốc độ mà bạn có thể thay đổi và khi bạn có một phép biến đổi (ví dụ x), nhân độ lớn với biến tốc độ.
t shipode

Làm cho ý nghĩa bây giờ. :)
AturSams

Ý tưởng thứ hai nghe có vẻ ... tắt. Chỉ cần điều chỉnh chuyển động theo yếu tố "tốc độ" có thể hoạt động đối với các vật thể điều khiển vật lý, nhưng AI sẽ có thể phản ứng ở tốc độ bình thường, chỉ với chuyển động của chúng bị chậm / suy yếu.

Bạn có nghĩa là AI sẽ có thể phản ứng ở tốc độ bình thường? AI sẽ có mã nào mà không thể áp dụng biến tốc độ?
t shipode

3

Sử dụng thời gian delta (mili giây trôi qua kể từ khung cuối cùng) có thể không đủ để làm chậm kẻ thù. Những thứ như tỷ lệ tấn công có thể được thực hiện dựa trên thời gian tấn công cuối cùng. Mặc dù nó sẽ làm chậm chuyển động nếu dựa trên thời gian, nó sẽ bỏ qua tốc độ tấn công chậm, bỏ bùa và các hiệu ứng khác (Tái tạo sức khỏe, thời gian hiệu ứng chính tả) .. và như vậy

Nếu bạn muốn làm chậm một nhóm lớn các yếu tố trò chơi trong một trò chơi người chơi, bạn có thể tạo đồng hồ nội bộ thứ hai cho mỗi sinh vật, đồng hồ bắt đầu vào thời điểm hiện tại khi sinh vật xuất hiện. Khi một câu thần chú chậm được truyền, mỗi khung hình, đồng hồ sẽ tăng thêm x% thời gian thực sự trôi qua. Tất cả hành vi của quái vật sau đó được xác định bởi đồng hồ bên trong của nó. Nếu nhiều quái vật khác nhau có khả năng chống chậm, chúng có thể sử dụng đồng hồ của riêng mình, về cơ bản, đó là một số nguyên không đòi hỏi nhiều không gian hoặc tính toán.

Khi hiệu ứng chậm dừng lại, đồng hồ vẫn đang được sử dụng và được tăng thêm 100% thời gian thực sự trôi qua.

Điều này cũng có thể làm việc cho các phép thuật vội vàng.

@Sidar: Tôi thấy hai sự lựa chọn,

  1. Đồng hồ nội bộ trên mỗi sinh vật. Để tìm hiểu xem sinh vật đã sẵn sàng tấn công lần nữa chưa: lưu lại lần cuối mỗi lần tấn công được sử dụng + thời gian nạp lại và kiểm tra xem đồng hồ bên trong đã qua thời gian đó chưa.

  2. Một bộ đếm thời gian cho mỗi lần tấn công: Bạn biết cuộc tấn công cần bao lâu để sạc lại và bạn chỉ cần đặt bộ hẹn giờ và trừ đi thời gian đã trôi qua * (1-chậm xuống%) mỗi lượt.

Cá nhân tôi thích tránh trừ nhiều bộ định thời riêng lẻ và người dùng một đồng hồ nội bộ để tiết kiệm thời gian xử lý và độ phức tạp.

Nó thực sự tùy thuộc vào sở thích (Nó không ảnh hưởng nhiều đến hiệu suất).


Sự cần thiết cho đồng hồ nội bộ là không cần thiết. Nó chỉ đơn giản là đi đến một số nhân mà bạn có thể (trong một ngày nào đó) liên kết với đối tượng của mình để tăng hoặc giảm sản phẩm của dt (thời gian delta) Bạn có thể quản lý các đối tượng theo nhóm hoặc bất kỳ phương tiện nào. Tôi nghĩ rằng cách của bạn có thể là một chút quá mức. Nhưng nếu nó hoạt động ... thì nó hoạt động.
Sidar

@Sidar Nếu bạn tránh điều này, có lẽ bạn sẽ cần một đồng hồ cho mỗi cuộc tấn công chỉ để nạp lại thời gian tấn công, thời lượng chính tả và những thứ như vậy. Ít nhất theo cách này, bạn chỉ cần cập nhật một đồng hồ và chỉ cần giữ thời gian 'kích hoạt lần cuối' để thiết lập lại các thuộc tính.
AturSams

Tuy nhiên, câu hỏi của anh liên quan đến việc làm chậm môi trường ngoại trừ người chơi. Đối với tôi nghe có vẻ như hình thức đơn giản nhất là chỉ nhân số dt với số thấp hơn 1. Trong khi giữ nó như dành cho người chơi.
Sidar

Chà, làm chậm môi trường bao gồm làm chậm tốc độ tấn công cũng như các khả năng khác của chúng (vì nó là rpg), có thể có nhiều khả năng mob khác nhau dựa vào thời gian nạp lại. Chữa lành, buff, debuff, phép thuật, v.v. Chưa kể thời gian kích hoạt.
AturSams

2

Bạn có thể bắt đầu với một giải pháp đơn giản là giải pháp được tiếp xúc bởi tesselode hoặc Mr Beast. Nhưng nếu bạn bắt đầu pha trộn những thứ phức tạp, tức là thời gian đạn trong khi một câu thần chú chậm lại được sử dụng, bạn sẽ bị mắc kẹt.

Tôi đề nghị bạn thực hiện một hệ thống phân cấp đồng hồ :

.
├── Main clock
│   └── UI clock
│   └── 3D clock
│       ├── GFX clock
│       └── Gameplay clock
│           └── Slowdown spell clock 01
│           └── Slowdown spell clock 02

Mọi thứ trong trò chơi của bạn nên sử dụng thời gian delta từ một trong các đồng hồ: hiệu ứng đồ họa chạy trên đồng hồ GFX, AI & hoạt hình chạy trên đồng hồ Gameplay, các sinh vật bị ảnh hưởng bởi phép thuật chậm chạy trên đồng hồ chính tả Làm chậm tạm thời, v.v. ảnh hưởng đến các phần khác nhau trong hệ thống phân cấp của bạn: một phép thuật làm chậm tạo ra và ảnh hưởng đến đồng hồ tùy chỉnh, trong khi thời gian đạn sẽ ảnh hưởng đến toàn bộ phân cấp đồng hồ 3D.


Cảm ơn, đây là một cái nhìn sâu sắc quan trọng. Tuy nhiên, tôi nghĩ rằng tôi sẽ tiếp tục suy nghĩ đơn giản, vì nó không có ý nghĩa trong trường hợp cụ thể của tôi rằng nhiều hiệu ứng làm chậm sẽ xảy ra cùng một lúc.
David Miler

1

Bạn chỉ cần hai đồng hồ khác nhau thay vì một, một cho thời gian phù hợp với lối chơi và một thời gian "thật".

currentGameTime = 0;
gameSpeed = 1.0f;
[...]
currentApplicationTime = GetTime():
timeDelta = (currentApplicationTime - lastApplicationTime)*gameSpeed;
currentGameTime += timeDelta;
lastApplicationTime = currentApplicationTime;

Sau đó, bạn có thể chỉ cần thay đổi trò chơi Tốc độ để tăng tốc (> 1) hoặc làm chậm thời gian (<1). Để người chơi di chuyển ở tốc độ khác nhau, chỉ cần kiểm tra xem thời gian có chậm lại hay không.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.