Làm thế nào để thực hiện du hành thời gian vào một trò chơi?


10

Tôi đã tự hỏi làm thế nào để thực hiện du hành thời gian vào một trò chơi. Không có gì siêu phức tạp, chỉ là đảo ngược thời gian như những gì trong Braid, nơi người dùng có thể tua lại / tua nhanh thời gian trong 30 giây hoặc bất cứ điều gì.

Tôi đã tìm kiếm trên web rất nhiều, nhưng kết quả của tôi thường được đề cập đến bằng cách sử dụng thời gian như "đó là 3:00" hoặc hẹn giờ, v.v.

Điều duy nhất tôi có thể nghĩ đến là sử dụng 2 mảng, một cho vị trí x của người chơi và một cho vị trí y của người chơi, sau đó lặp qua các mảng đó và đặt nhân vật ở vị trí đó khi họ tua lại / tua nhanh thời gian. Có thể làm việc đó? Nếu nó hoạt động, mảng sẽ lớn đến mức nào và tôi có nên lưu trữ x và y của người chơi không? Nếu nó không hoạt động, tôi có thể thử cái gì khác?

Cảm ơn trước!


11
Bạn không đọc tin tức ( ust.hk/eng/news/press_20110719-893.html )? Họ đã chỉ ra rằng du hành thời gian là không thể. Do đó, không thể viết mã.

Bạn cần phải nghĩ một ngữ nghĩa có thể cho du hành thời gian, chỉ sau đó bạn mới có thể bắt đầu nghĩ về việc thực hiện.
Paŭlo Ebermann


2
Tìm hiểu cho mình một số toán vector . Nếu bạn đang đề xuất hai mảng riêng biệt cho thấy bạn chưa bao giờ làm việc với chúng. Tôi coi chúng là quan trọng đối với một lập trình viên trò chơi để biết vì họ có thể đơn giản hóa mọi thứ đến mức nào.
doppelgreener

5
import universal.back2future.FluxCapacitor;
jhocking

Câu trả lời:


6

Ý tưởng mảng là cách nó được thực hiện trong Braid. Khi những thứ duy nhất tác động lên nhân vật là trọng lực, đầu vào bàn phím / joypad và các nhân vật khác, bạn chỉ cần lưu trữ vị trí và vận tốc ở mỗi bước để biết mọi thứ quan trọng về nhân vật đó. Nếu bạn lưu trữ 10 ảnh chụp nhanh mỗi giây mỗi ký tự thì nó vẫn dưới 50 nghìn cho một phút trong lịch sử của một nhân vật - có thể dễ dàng quản lý trên hầu hết các hệ thống và bạn cũng có thể tìm ra những cách hiệu quả hơn thế.


Đây là ca khúc đúng. Ví dụ lưu trữ các lệnh hoạt động: nhấn phím với dấu thời gian. Bạn có thể ngoại suy hầu hết các hành vi khác nếu hệ thống mang tính quyết định. Trình theo dõi 10 khung hình / giây là tốt cho hệ thống tua lại, thậm chí ít có thể được chấp nhận, miễn là các lệnh thực tế được giữ lại, thực tế là trạng thái hoặc trạng thái của các đối tượng.
karmington

4

Đọc lên Mẫu lệnh . Nó cung cấp cho các hành động hoàn tác (và để thực hiện lại chúng sau này.) Điều đó sẽ xử lý nhiều hơn chỉ là vị trí của một con tàu, nhưng tất cả các hành động mà người chơi thực hiện.

Nhưng tôi nghĩ rằng ý tưởng mảng của bạn là âm thanh là tốt.


Có lẽ không phải là một ý tưởng tuyệt vời - bên cạnh việc sử dụng nhiều bộ nhớ hơn (mỗi khi bạn thêm vận tốc của một thực thể vào vị trí của nó, bạn cần lưu trữ nó dưới dạng "hành động") , nó đòi hỏi khá nhiều toán học điểm cố định, vì nếu bạn sử dụng dấu phẩy động -point cho vị trí / tốc độ của bạn, (x+v)-vcó thể không bằng x.
BlueRaja - Daniel Pflughoeft

1
@BlueRaja - Đừng xem cách tiếp cận đó sẽ tốn nhiều bộ nhớ. Ở tốc độ 100 FPS và lưu trữ trong 10 giây cuối cùng, bạn cần lưu trữ 1000 n-tupels lệnh, trong đó n tối đa là 5 hoặc hơn. Hoặc, thậm chí tốt hơn, bạn chỉ lưu trữ vị trí tuyệt đối trong mỗi khung hình đó và đối với tua lại, bạn chỉ cần tạo hiệu ứng cho nhân vật lùi dọc theo con đường đó. Điều đó cũng sẽ loại bỏ bất kỳ vấn đề dấu phẩy động nào có thể và đưa bạn trở lại chính xác nơi bạn bắt đầu.
Hackworth

3

Thay vì có hai mảng riêng biệt, có lẽ bạn nên có một lớp mô tả vị trí của người chơi (có lẽ đã có lớp Point trong Java ... gần đây tôi là một anh chàng C #) và sử dụng một mảng duy nhất để giữ các vị trí trong quá khứ.

Bạn cần thiết lập "bộ đệm vòng", nghĩa là khi bạn đến cuối mảng, bạn khoanh tròn trở lại đầu mảng, ghi đè các mục cũ nhất. Nếu bạn du hành ngược thời gian, điều ngược lại là đúng (khi bạn bắt đầu, bắt đầu vòng tròn đến cuối).

Nếu bạn muốn giữ dữ liệu trong quá khứ 30 giây, bạn cần biết tốc độ khung hình của mình nếu bạn muốn phân bổ trước dung lượng và sử dụng một mảng có kích thước cố định. Nếu bạn kết xuất trò chơi ở tốc độ 10 khung hình / giây, thời gian 30 giây, đó là 300 yếu tố.


2

GDCVault có một bài giảng của Jon Blow (người tạo ra Braid ) trên trang web của họ có tên là The Practice of Rewind in Braid với giá 3,95 đô la. Tôi cá là đây có thông tin bạn muốn;)

EDIT: Có lẽ sẽ không có trong Java nhưng các ý tưởng nên nắm giữ.


Bạn có biết nếu họ bán bản phiên âm quá, hoặc chỉ âm thanh?
o0 '.

Tôi không thể tìm thấy bất cứ điều gì thông qua một tìm kiếm nhanh chóng của trang web. Có lẽ bạn có thể sử dụng một số phần mềm sao chép ?
NoobsAreP People2

1

Giống như Erik J đã nói , lưu trữ các vị trí trong quá khứ của người chơi dưới dạng tập hợp các đối tượng điểm trong bộ đệm vòng nghe có vẻ hợp lý.

Tuy nhiên, tôi sẽ đề nghị sử dụng một hàng đợi để thực hiện bộ đệm. Cập nhật rẻ hơn nhiều so với một mảng và bạn không cần phải biết trước tốc độ khung hình của mình:

update():
   time_queue.push(player.positions)
   if current_time() - start_time > n:
       queue.pop()

Điều này chưa xem xét tốc độ khung hình khác nhau hoặc điều gì sẽ xảy ra nếu bạn thực sự thực hiện bất kỳ chuyến du hành thời gian nào, vì vậy tôi khuyên bạn nên lưu trữ dấu thời gian với mỗi mục và thay vào đó hãy kiểm tra xem:

update():
    time_queue.push({
        'pos': player.positions,
        'time': current_time()
    })
    first_entry = queue.peek()
    while current_time() - first_entry['time'] > n:
       queue.pop()
       first_entry = queue.peek()

Hi vọng điêu nay co ich!


1

Có một mẫu thiết kế tên là Memento , tôi nghĩ đó là điểm khởi đầu cho một trò chơi như Braid

Mẫu memento là một mẫu thiết kế phần mềm cung cấp khả năng khôi phục> một đối tượng về trạng thái trước đó (hoàn tác thông qua rollback).

Mẫu memento được sử dụng bởi hai đối tượng: người khởi tạo và người chăm sóc. Người khởi tạo là một số đối tượng có trạng thái bên trong. Người chăm sóc sẽ làm một cái gì đó cho người khởi tạo, nhưng muốn có thể hoàn tác thay đổi. Người chăm sóc đầu tiên yêu cầu người khởi tạo cho một đối tượng lưu niệm. Sau đó, nó thực hiện bất kỳ hoạt động nào (hoặc chuỗi hoạt động) mà nó sẽ làm. Để quay trở lại trạng thái trước các hoạt động, nó trả về đối tượng memento cho người khởi tạo. Bản thân đối tượng memento là một đối tượng mờ đục (một đối tượng mà người chăm sóc không thể, hoặc không nên thay đổi). Khi sử dụng mẫu này, cần thận trọng nếu người khởi tạo có thể thay đổi các đối tượng hoặc tài nguyên khác - mẫu memento hoạt động trên một đối tượng.

http://en.wikipedia.org/wiki/Memento_potype

Thông tin quảng cáo tại đây: http://dofactory.com/Potypes/PotypeMemento.aspx


2
Tôi không thấy làm thế nào điều này sẽ giúp. Có vẻ như đó là một "rollback tức thì", trong khi OP yêu cầu một thứ gì đó trơn tru như của Braid. Có lẽ tôi đã đọc sai một cái gì đó?
o0 '.

Đây là mô hình không ngụ ý trên một rollback duy nhất, ví dụ, bạn có thể tạo một "dòng thời gian" của các hành động. Đây là một bài đăng trên blog của Brazillian về cách sử dụng mẫu này: abrindoojogo.com.br/padroes-de-projeto-memento Đây là một ví dụ được tạo trong Flash: abrindoojogo.com.br/files/fasteroids.swf Move: Arbow | Bắn: Không gian | Hành động tua lại: Backspace
Marcelo Assis

1

Có một trò chơi được phát hành cho XBox360 liên quan đến thao túng thời gian. Điều đó thật tầm thường, vì vậy tôi không thể nhớ được tiêu đề vào lúc này. Dù sao, trong một cuộc phỏng vấn với một nhà phát triển cho nó, họ đã phác thảo cách họ quản lý thao tác thời gian:

Mỗi khung hình X (với các giá trị X thấp hơn dẫn đến thao tác chi tiết hơn), bạn chụp ảnh "nhanh" của thế giới trò chơi tại thời điểm đó và liên kết nó với thời gian trong trò chơi.

Trong khi chơi thông qua trò chơi một cách bình thường, chuyển tiếp theo thời gian, mọi phản ứng đầu vào đều góp phần tạo ra ảnh chụp nhanh vào một lúc nào đó trong tương lai.

Thế giới trò chơi sau đó lặp lại giữa ảnh chụp nhanh ở thời điểm hiện tại và các khung hình chụp X trong tương lai.

Sau đó, khi bạn muốn đảo ngược thời gian, chỉ cần đặt hướng thời gian là ngược, để nó lặp lại giữa các khung hình X hiện tại và quá khứ (trong khi vô hiệu hóa khả năng tạo ảnh chụp nhanh trong tương lai).


+1 cho điểm về độ chi tiết của ảnh chụp nhanh.
Omar Kooheji

0

Bạn chỉ có thể coi thời gian ảo của trò chơi là một chiều không gian giống như không gian khác. Vì vậy, những gì du hành thời gian từ bên ngoài là một chuyển động n + 1 chiều đơn giản trong vũ trụ ảo của trò chơi.

Giả sử một số tương tác người dùng và một số hệ thống vật lý xác định hành vi của vũ trụ của bạn khi không có đầu vào của người dùng, tất cả những gì bạn cần ghi lại là hiệu ứng của các tương tác người dùng (ví dụ: thay đổi vectơ tốc độ / gia tốc n + 1) , như vật lý của bạn nên có thể đảo ngược thời gian.

Bằng cách này, bạn cần ít bộ nhớ hơn để tính toán trạng thái của vũ trụ trò chơi tại bất kỳ tọa độ thời gian nhất định nào.


Như tôi đã đề cập trong một nhận xét khác, vật lý trong trò chơi điện tử thường không thể đảo ngược thời gian, bởi vì khi sử dụng các số (x+v)-vcó dấu phẩy động, có thể không bằngx
BlueRaja - Danny Pflughoeft

0

Giả sử một thực thể có vị trí vận tốc, xoay, x và y. Đây là, với gia tốc, trạng thái chuyển động cơ bản, giá trị, bất cứ điều gì bạn gọi nó. Bạn có thể lưu dữ liệu theo hai cách:
1. Lưu vị trí xoay, x và y
2. Lưu xoay, x vận tốc và y vận tốc

Nếu bạn có vận tốc cố định, bạn cũng chỉ có thể lưu xoay hoặc chỉ lưu một vận tốc cho cả hai trục.

Lưu xoay vòng là cần thiết trong các trò chơi, trừ khi thực thể của bạn có một vòng quay tĩnh, điều mà nó không có trong hầu hết các trường hợp.

Điều đó nói rằng, sử dụng một danh sách các đối tượng cho nhiều giá trị là cần thiết. Nếu bạn có một hệ thống hẹn giờ đẹp, ví dụ, gọi các phương thức cập nhật 20 lần trong một giây và do đó độc lập với khung hình / giây, bạn có thể tạo một mảng gồm 20 * 30 đối tượng để lưu trữ các giá trị chuyển động bạn cần trong 30 giây qua . Không nên sử dụng một mảng đơn giản, vì bạn sẽ phải di chuyển mọi phần tử một chỉ mục còn lại mỗi cuộc gọi cập nhật.

Dựa trên điều này, bạn có thể đi qua danh sách hoặc bất cứ điều gì để quay trở lại. Nếu bạn thực sự muốn đạt được hiệu ứng "thực tế", hãy sử dụng kỹ thuật này cho tất cả các đối tượng chuyển động. Nhưng đây là thiết kế trò chơi liên quan.

Nếu bạn phá hủy đồ vật, hãy nhớ gộp chúng lại, để đảm bảo rằng bạn không làm căng thẳng người bạn gọn gàng của mình, ông Garbage;)

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.