câu chuyện trò chơi lập trình


28

Tôi đã phát triển một công cụ trò chơi trong c / c ++ và DirectX.

Tôi có một công cụ gạch cho các bản đồ, các trình phát hoạt hình / npc hoạt hình, nói chuyện với npc, các menu và thay đổi cấp độ nhưng không có trò chơi, nó chỉ cảm thấy trống rỗng.

Tôi đã nhìn xung quanh và tiếp tục nghe câu trả lời từ thông dụng nhưng tôi muốn biết cách thực hiện một câu chuyện trong trò chơi của mình.

Một số người đã nói rằng một tệp lưu giữ cờ điều khiển mọi hành động / trạng thái có thể có trong trò chơi nhưng điều này nghe có vẻ lố bịch.

Có một chút tham vọng nhưng tôi đang hướng tới việc có được một trò chơi như các trò chơi Pokemon / Final Fantasy cũ hơn.

Có ai biết làm thế nào những trò chơi này hoạt động hoặc lý thuyết được sử dụng?

Tôi đã tìm kiếm một thời gian và thực sự sẽ đánh giá cao bất kỳ người đầu vào nào có.

Câu trả lời:


19

Câu chuyện trong trò chơi của bạn có lẽ phải ở dạng máy tự động trạng thái hữu hạn (hoặc một loại FSA mở rộng). Khi một số sự kiện nhất định xảy ra, bạn nên chuyển sang một trạng thái mới. Bằng cách này, bạn chỉ phải lưu trữ trạng thái hiện tại và bất kỳ thông tin nào là cần thiết để biết nơi cần di chuyển tiếp theo trong FSA (cùng với các chi tiết về người chơi như vị trí, sức khỏe, v.v.).

Ví dụ: nếu chúng tôi hoàn toàn đơn giản hóa các trò chơi Pokemon, huy hiệu phòng tập thể dục sẽ tạo thành nhánh chính của FSA. Bạn bắt đầu ở trạng thái 0 khi bạn không có huy hiệu và khi bạn đánh bại các nhà lãnh đạo phòng tập thể dục, bạn di chuyển qua các tiểu bang, đến trạng thái 1, đến trạng thái 2, v.v. Để các thực thể trò chơi của bạn cập nhật lên trạng thái hiện tại, bạn chỉ cần có được họ nhìn vào tình trạng hiện tại Ví dụ: một NPC bên ngoài phòng tập thể dục thứ 3 sẽ kiểm tra bạn đang ở trạng thái nào, xem bạn đang ở trạng thái tương ứng với việc có 3 huy hiệu và trả lời tương ứng (có lẽ với "Tốt lắm!").

Bạn không cần lưu trữ trạng thái của mọi thứ trên thế giới; Chỉ là trạng thái của câu chuyện. Bản thân các thực thể biết cách phản ứng tùy thuộc vào trạng thái hiện tại.


Cách tiếp cận thú vị và tôi thích nó sẽ phải thử nhưng làm thế nào bạn theo dõi các nhiệm vụ phụ không phụ thuộc vào tiến trình câu chuyện?

Nó thực sự phụ thuộc vào mức độ phức tạp của câu chuyện của bạn. Có thể dễ dàng nhất để có nhiều FSA (một cho mỗi trạm) hoặc bạn có thể cần một số nhánh phức tạp. Bạn cần phải ngồi xuống và vẽ ra câu chuyện của bạn như một lộ trình. Khi bạn hiểu làm thế nào mọi thứ đan xen, hãy nghĩ về cách bạn có thể lưu trữ trạng thái hiện tại (hoặc trạng thái nếu nó có thể ở nhiều trạng thái cùng một lúc). Một số thứ sẽ cần được lưu trữ riêng, chẳng hạn như vị trí của các NPC (nếu bạn cần lưu chúng) và sức khỏe của một số nhân vật, bởi vì những điều này không phụ thuộc vào câu chuyện.

FSA này mà bạn nói về, nơi tôi sẽ tìm thấy một lời giải thích về điều này, tốt nhất là đơn giản hóa và không có các lý thuyết khác đan xen.
Skeith

Bạn có thể tìm hiểu tất cả về các máy trạng thái ở khắp mọi nơi nhưng 99,9% thời gian sẽ không nói về các trò chơi. Một cuốn sách giới thiệu về tính toán sẽ dạy cho bạn về chúng nhưng bạn thực sự không cần nhiều chi tiết. Bạn chỉ cần hiểu khái niệm về trạng thái và di chuyển giữa chúng khi một số sự kiện nhất định xảy ra. Phản ứng của @ pwny thực sự chỉ là nói những điều tương tự theo một cách khác. Đọc về các FSA sẽ là một cách tuyệt vời để tìm hiểu các khái niệm về máy trạng thái. Chỉ cần Google giới thiệu về các máy của nhà nước!
Joseph Mansfield

7

Bạn có thể sử dụng một tập hợp các trạng thái có thể có trong trò chơi của mình. Các NPC và thế giới của bạn sẽ nhận thức được các trạng thái đó và phản ứng / hiển thị tương ứng. Bạn cũng có thể muốn xác định một tập hợp các kích hoạt sẽ được kích hoạt bởi một số hành động / sự kiện.

Ví dụ, đánh bại một đối thủ nhất định sẽ kích hoạt kích hoạt A, sẽ thêm trạng thái S vào thế giới của bạn và ở trạng thái S, nhân vật của bạn sẽ bị điện giật khi bước ra khỏi hang ổ của đối thủ. Hoặc trời đang mưa bên ngoài. Hoặc bạn tìm thấy một loại kẹo hiếm. Bạn sẽ có được điểm.

Với hai bổ sung đơn giản cho trò chơi của bạn, bạn có thể làm cho nó trở nên "sống động" hơn rất nhiều.

Hãy chắc chắn rằng bạn cũng tạo ra một nền tảng phong phú cho thế giới, nhân vật và cốt truyện của bạn và đảm bảo trò chơi phù hợp với nền đó. Lên kế hoạch cho câu chuyện của bạn trước.

Hãy thử Gamedev


điều đó là có thể nhưng tôi chắc chắn rằng các chuyên gia có điều tốt hơn là những gì bạn muốn đòi hỏi hàng trăm ngàn booleans và ints (tôi đã thử nó). Tôi chỉ không xem đó là một cách tiếp cận thực tế cho một trò chơi quy mô lớn. cảm ơn vì đường link

Không nhất thiết, hãy tưởng tượng 5 trạng thái siêu độc lập. Bạn nhận được 32 nhánh có thể cho 5 booleans. Tôi nghĩ đó là hợp lý. Ngoài ra, hệ thống kích hoạt được sử dụng trong rất nhiều trò chơi chuyên nghiệp, đặc biệt là vì sau đó bạn có thể xử lý tập lệnh bằng cách sử dụng hàng loạt trình kích hoạt.
pwny

2

Như sftrabbit đã đề cập, đây là một ứng dụng hoàn hảo cho một máy trạng thái.

Về cơ bản, bạn có một loại cấu trúc cây. Mỗi lá / nút chứa thông tin về trạng thái hiện tại và các quy tắc để chuyển sang trạng thái tiếp theo. Mỗi nút có thể chứa nhiều lối thoát, tùy thuộc vào mức độ phức tạp mà bạn cần luồng âm mưu / phát của bạn.

Một tương tự tốt, rất lỏng lẻo là đây là một cuốn sách Chọn cuộc phiêu lưu của riêng bạn . Mỗi trang chứa một số văn bản mô tả một phần của câu chuyện và các quyết định mà người chơi có thể đưa ra. Mỗi quyết định dẫn đến một trang khác. Một số trang có thể liên kết trở lại các trang đã truy cập trước đó, v.v.

Các trò chơi phiêu lưu dựa trên văn bản cũ như ZorkLeather Goddesses of Phobos và các trò chơi Sierra * Quest khét tiếng ( SpaceQuest với sự tham gia của Roger Wilco, người gác cổng không gian là một trong những sở thích của tôi ) đã sử dụng một phiên bản rất đơn giản của loại hệ thống này. Mỗi phòng trong bản đồ là một trạng thái, với các lối thoát được liên kết với các tiểu bang hoặc phòng khác. Có được một mục đặt cờ trong một đối tượng trạng thái toàn cầu. Mỗi phòng sẽ kiểm tra các cờ đó để xác định các ký tự hoặc vật phẩm có sẵn trong mỗi phòng.

Vì vậy, các trạng thái của bạn có thể được triển khai dưới dạng một lớp hoặc cấu trúc, mỗi trạng thái có các thuộc tính cho:

Danh sách tài sản - danh sách các con trỏ tới đồ họa nền và bất cứ thứ gì khác mà bạn cần để hiển thị phòng / trạng thái / cấp độ.

Điều kiện đầu vào - thành tích phải đạt được để vào cấp

Thoát - liên kết đến mỗi lối ra "tiếp theo" có thể. Bắc, Nam, Đông và Tây là một số ví dụ về điều này, nhưng bạn cũng có thể bao gồm Cửa 1, Dịch chuyển tức thời, v.v. Khi cố gắng thoát khỏi phòng hoặc xác định lối ra / cửa là "mở", trò chơi của bạn có thể kiểm tra trạng thái tiếp theo để xem các điều kiện nhập cảnh của nó đã được đáp ứng chưa, và thay đổi cách lối ra được hiển thị trên màn hình, hoặc chỉ không cho phép người chơi di chuyển theo hướng đó.

Nếu bạn muốn trở nên lạ mắt, bạn có thể bao gồm một phiên bản trạng thái khác với các điều kiện vào khác nhau, điều này sẽ thay đổi cách trình bày căn phòng cho người chơi hoặc các hành động có sẵn trong phòng đó.

Màn hình bắt đầu của bạn, cái chết / trò chơi trên màn hình, v.v ... đều có thể là các trạng thái trong hệ thống, tương tự như cách bạn có thể điều hướng giữa các màn hình menu. Trong thực tế, nếu bạn có một hệ thống menu như vậy, bạn có thể sử dụng nó cho việc này. Thay vì mũi tên lên / xuống và "nhập" để điều hướng một menu, bạn sẽ tìm kiếm các sự kiện cụ thể trong khu vực chơi trò chơi, chẳng hạn như bước lên một bảng dịch chuyển, đi ra từ phía bên phải của màn hình, v.v.

Từ quan điểm của quản trị viên, hãy xem xét liệu bạn có thể hưởng lợi từ việc tạo một công cụ quản trị cho phép bạn tạo máy trạng thái hay không. Thêm phòng vào bản đồ, tạo liên kết giữa chúng, gán tài sản như hình nền, v.v ... Đây có thể là quá mức cần thiết cho lần thử đầu tiên của bạn; quá dễ dàng để bị cuốn hút vào việc xây dựng các công cụ quản trị và thực sự không bao giờ kết thúc trò chơi. Hãy nhớ rằng - bạn không viết phần mềm trung gian, mà là một trò chơi.

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


ví dụ này tưởng tượng một thị trấn. Tôi có một tập tin chứa bố cục gạch cũng như đồ họa và kích thước, danh sách của npc và những thứ chung chung như thế. bằng cách thêm một tệp, một cam thị trấn mới sẽ được thêm vào trò chơi cho phép những người khác đóng góp hoặc đó là kế hoạch nhưng tệp đang trở nên hơi đầy đủ và phức tạp. Nếu tôi hiểu bạn, tôi sẽ đặt các sự kiện có thể diễn ra ở thị trấn nói trên trong tệp này với cờ để theo dõi tiến trình?
Skeith

@Skeith có, đó có vẻ là một cách tiếp cận hợp lý.
3Dave

0

Tôi đã từng sử dụng công cụ trò chơi này được gọi là ĐỘNG LỰC . Chơi xung quanh với điều đó và xem cách nó xử lý các sự kiện, tôi thực sự thích nó. Đây cũng là nguồn mở, vì vậy bạn có thể thấy cách họ triển khai nó ở đây . Đây là một mô tả ngắn gọn.

Mỗi bản đồ có nhiều lớp khác nhau. Các lớp đồ họa, trong đó có thể có một số. Lớp tắc nghẽn. Và sau đó là lớp vùng. Lớp vùng là những gì quan trọng ở đây. *

Mỗi ô có một số để chỉ ra nó thuộc khu vực nào. Mỗi vùng có thể được kích hoạt theo một trong hai cách cơ bản. Khu vực được kích hoạt khi người chơi nhập vào hoặc khu vực đó có cái được gọi là kích hoạt liền kề. Kích hoạt liền kề có nghĩa là khi người chơi đứng liền kề với một trong các ô của khu vực và nhấn một số phím được chỉ định làm khóa kích hoạt, vùng đó sẽ được kích hoạt.

Điều gì xảy ra khi một vùng được kích hoạt là nó gọi một hàm từ một tập lệnh. Vì vậy, bạn cần phải nhúng một số loại ngôn ngữ kịch bản. Verge có ngôn ngữ riêng gọi là VergeC và nó cũng cho phép lua. Bản thân tôi thích sử dụng python.

Khi bạn đã vượt qua rào cản này, bây giờ bạn có sức mạnh to lớn trong kịch bản sự kiện của mình. Bạn có một ngôn ngữ lập trình đầy đủ, trong đó bạn có thể lưu trữ và hành động trên dữ liệu như số liệu thống kê của người chơi, cờ câu chuyện, v.v ...

* Ngoài ra còn có một lớp Thực thể. Các thực thể hoạt động như các khu vực kích hoạt liền kề di động.


nghe có vẻ giống như hệ thống được sử dụng trong sê-ri nhà sản xuất trò chơi rpg. Nhưng điều gì sẽ xảy ra nếu gạch đó có 5 sự kiện khác nhau dựa trên câu chuyện của bạn bao xa?
Skeith

@Skeith Nó không thể. Mỗi ô chỉ có một vùng liên kết với nó. Và mỗi vùng chỉ có một chức năng kịch bản mà nó gọi. Đó không phải là một vấn đề mặc dù. Hãy nhớ rằng, bạn có một ngôn ngữ lập trình đầy đủ ở đây. Thông tin về khoảng cách xuyên suốt câu chuyện bạn sẽ được lưu trữ trong một biến (hoặc một vài). Vì vậy, quyết định những gì cần làm là một vấn đề đơn giản để kiểm tra biến đó trong tập lệnh và thực hiện hành động thích hợp dựa trên giá trị của nó.
Benjamin Lindley

@Skeith: Mặc dù bạn có thể thêm tùy chọn thay đổi vùng thuộc về ô nào.
Benjamin Lindley
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.