Tôi muốn làm một trò chơi có thể sửa đổi. Điều này ảnh hưởng đến sự lựa chọn ngôn ngữ lập trình của tôi như thế nào? [đóng cửa]


26

Tôi đã bắt đầu thực hiện một số trò chơi nhỏ trong Java và tôi đang xem xét việc học C # cho một dự án lớn hơn. Tôi rất muốn tạo ra một trò chơi có thể sửa đổi, nhưng ai đó nói với tôi rằng tôi cần phải gắn bó với Java nếu tôi muốn trò chơi có thể sửa đổi được, mặc dù tôi không hiểu tại sao.

Vì vậy, những đặc điểm ngôn ngữ lập trình làm cho một ngôn ngữ phù hợp hơn với các trò chơi có thể sửa đổi?


3
Nếu bạn muốn tạo một trò chơi có thể sửa đổi , Vật lý có thể là một thư viện rất hữu ích để biết. (Nó không liên quan gì đến vật lý, đừng để cái tên đánh lừa bạn. :))
Paul Manta

10
"Nhưng ai đó đã nói với tôi rằng tôi cần phải gắn bó với Java nếu tôi muốn trò chơi có thể sửa đổi được" Nhân tiện, đây là BS.
Ray Dey

Câu trả lời:


18

Nó phụ thuộc vào cách bạn muốn thiết kế hệ thống mod của bạn. Tôi sẽ khám phá hai trong số họ.

SDK

Nhiều khả năng bạn sẽ yêu cầu các modder của bạn sử dụng cùng ngôn ngữ với bạn và tải lên các mod thông qua sự phản chiếu (hoặc tương tự, tùy thuộc vào ngôn ngữ bạn chọn). Điều này rõ ràng sẽ giới hạn bạn với các ngôn ngữ có thể thực hiện ràng buộc muộn - và có rất nhiều ngôn ngữ có thể làm điều này (thậm chí C có thể thực hiện ràng buộc muộn với một số LoadLibrarymánh khóe thông minh ). Bạn thậm chí có thể thực hiện một số mod-meta, trong đó một mod có thể lưu trữ các mod khác (ví dụ: mod theo kịch bản).

Vấn đề đầu tiên với phương pháp này là ẩn trạng thái nội bộ. Lấy C # làm ví dụ một người kiểm duyệt có thể chỉ cần sử dụng sự phản chiếu để truy cập các thành viên tư nhân, C cũng có thể làm điều này (mặc dù cần nhiều nỗ lực hơn).

Vấn đề thứ hai là lưu trữ. Mọi người không thực sự thích mã nước ngoài chạy trên hệ thống của họ mà không có hộp cát tại chỗ. Trong trường hợp xấu nhất, bạn có thể viết một mod thiết lập seedbox; nếu điều này được cài đặt tại một ISP, nó có thể gây tổn hại nghiêm trọng đến uy tín của họ.

Viết kịch bản

Các modder sẽ sử dụng một ngôn ngữ như Lua để tạo mod. Bạn sẽ yêu cầu một ngôn ngữ có thể gọi mã gốc (để giao tiếp với Lua); hoặc bạn sẽ phải viết ngôn ngữ kịch bản của riêng bạn bằng ngôn ngữ bạn chọn.

Vấn đề đầu tiên ở đây là hầu hết các ngôn ngữ kịch bản được diễn giải, có thể không được chấp nhận đối với các hệ thống thời gian thực (mặc dù, xem LuaJIT); chẳng hạn như các trò chơi.

Trớ trêu thay vấn đề thứ hai vẫn tồn tại ở đây; Lấy Lua làm ví dụ, tôi đã rất thất vọng vì có các chức năng 'loại bỏ' trong thư viện lõi / mặc định - làm cho nó hoàn toàn vô dụng như một môi trường hộp cát (không có nhiều nỗ lực, may mắn và bảo trì), thật khó để miêu tả sự tức giận của tôi về điều này, nhưng tôi thực sự hy vọng họ đã uống một số loại cocktail mạnh khi chúng bao gồm các tính năng chống . Rõ ràng bạn có thể dễ dàng tránh điều này nếu bạn cuộn ngôn ngữ của mình (xem: UnrealScript).

Cuối cùng, chi phí tương tác với một công cụ viết kịch bản có thể bị cấm - một lần nữa lấy Lua làm ví dụ, kết hợp với C #: C # có chi phí đáng kể khi gọi các hàm gốc (thông qua P / Invoke) và Lua là một API khá 'trò chuyện'. Điều này có thể dẫn đến các vấn đề nếu cách bạn thiết kế 'SDK tập lệnh' đòi hỏi nhiều cuộc trò chuyện giữa ngôn ngữ chính và ngôn ngữ kịch bản của bạn (lưu ý rằng C không thực sự có vấn đề này). Một lần nữa, bạn có thể tránh điều này bằng cách viết ngôn ngữ kịch bản lệnh của riêng bạn (và trong trường hợp C # biên dịch nó thành MSIL) và thực hiện nó theo cách nhanh nhất trong môi trường [ảo] của bạn.

Vì về cơ bản, tập lệnh chạy trên một hệ thống hoàn toàn khác với mã chính của bạn, bạn có thể kiểm soát hoàn toàn quyền truy cập vào trạng thái nội bộ (trừ khi chúng thực hiện một số nội dung ưa thích với các hàm shell được đề cập trước đó).

Phần kết luận

Tôi đã xoay xở một chút ngoài chủ đề, tuy nhiên, điều cơ bản bạn có thể thu được từ bức tường văn bản đó là bạn sẽ có thể tạo ra một trò chơi có thể sửa đổi bằng bất kỳ ngôn ngữ nào (tôi muốn nói rằng bạn có thể ) - nhưng bằng một số ngôn ngữ có thể dẫn đến nhiều công việc hơn Tôi có một chút hậu môn về an ninh? Vâng, bạn cũng nên như vậy khi nói đến mã người dùng.


Trong kịch bản đầu tiên bạn mô tả, bạn đang nói về người dùng thực sự lập trình thư viện động của riêng mình và cắm nó vào trò chơi? Tôi đã thấy điều này được sử dụng trước đây trong các thư viện (ví dụ: thư viện âm thanh để thêm codec mới, v.v.) nhưng, có thể vì tôi chưa bao giờ nhìn quá nhiều vào việc sửa đổi, tôi chưa bao giờ gặp trường hợp như thế này đối với một trò chơi. Tôi tò mò về điều này (vì người dùng dường như rất khó để biết cách làm điều này và tôi thường thấy các mod là có thể truy cập được), vậy bạn có biết ví dụ nào không? Hầu hết thời gian tôi thấy các công cụ chuyên dụng, chẳng hạn như các biên tập viên thế giới với một chút kịch bản đang được sử dụng.
David Gouveia

1
@DavidGouveia Tôi tin rằng ít nhất một phiên bản Paradox động cơ được sử dụng cho Europa Universalis (và các trò chơi tương đương trong các khoảng thời gian khác nhau) đã hỗ trợ một hình thức vá nhị phân (mặc dù có thể bằng cách modder vá nguồn và biên dịch lại một trong những các DLL trò chơi thay vì có hỗ trợ SDK thích hợp) ngoài mod được sử dụng phổ biến hơn bằng cách thay đổi cài đặt tệp dữ liệu.
Dan Neely

2
@DavidGouveia xem: Công cụ nguồn; hoặc thậm chí các plugin Winamp. Tôi nghĩ Quake thậm chí hoạt động như thế này. Tôi đã thu hút được rằng bạn sử dụng C #; vì vậy bạn có thể muốn xem xét MEF (Khung mở rộng được quản lý): hiển thị một giao diện, tải nó lên thông qua sự phản chiếu và bob của chú bạn.
Jonathan Dickinson

@JonathanDickinson Ồ, tôi không biết rằng Công cụ nguồn chạy theo mô hình này. Luôn tưởng tượng một bộ công cụ như bộ Xây dựng cuộn của Người cao tuổi. Cảm ơn thông tin (Tôi đã có ý tưởng về cách thức hoạt động của nó, chỉ nghĩ rằng nó có thể quá phức tạp đối với người kiểm duyệt chung sử dụng). Và tôi thực sự đã cười vào "phần chú của bạn" . :-)
David Gouveia

1
Re Lua: Những kẻ này có Lua hộp cát phù hợp để sử dụng trong phần mềm wiki (và đủ ổn định để Wikipedia tiếng Anh sử dụng nó). Tôi chắc chắn rằng bạn có thể điều chỉnh nó theo nhu cầu của mình, nhưng một số phần của tiện ích mở rộng là GPL, vì vậy hãy kiểm tra với luật sư của bạn.
Kevin

16

Tôi muốn nói rằng ngôn ngữ không phải là yếu tố quyết định ở đây, nó thực sự chính là cách bạn linh hoạt và điều khiển dữ liệu để tạo ra trò chơi xác định nó.

Mỗi trò chơi chạy trên một tập hợp dữ liệu (ví dụ: mọi thứ từ cấp độ, lưới, cấu hình, vật phẩm). Sự khác biệt giữa một trò chơi bình thường và một trò chơi có thể sửa đổi là sau này cung cấp các công cụ cho phép người dùng sửa đổi dữ liệu hiện có (hoặc thêm dữ liệu của riêng mình). Dù bạn chọn ngôn ngữ nào, chỉ cần thử làm cho trò chơi của bạn được điều khiển dữ liệu nhất có thể và tránh mã hóa bất kỳ nội dung trò chơi nào. Hầu như bất kỳ ngôn ngữ nào bạn có thể chọn đều có thể đọc dữ liệu từ đĩa, đó là hầu hết những gì bạn cần.

Cũng cách đó một nửa nếu bạn chỉ tạo các công cụ cho mục đích sử dụng cá nhân của riêng bạn (ví dụ: trình chỉnh sửa cấp độ của riêng bạn) và sau đó hoàn thiện chúng và chia sẻ chúng với người dùng của bạn. Trình chỉnh sửa cấp độ Super Meat Boy khá nhiều, một bản cải tiến của công cụ được sử dụng trong quá trình phát triển trò chơi.

Và tùy thuộc vào loại trò chơi, bạn có thể muốn cho phép người dùng kịch bản một số hành vi của trò chơi. Trong trường hợp bạn nên xem xét kết hợp một ngôn ngữ kịch bản vào trò chơi của bạn từ sớm (là của riêng bạn hoặc một ngôn ngữ hiện có như Lua hoặc Python là những lựa chọn phổ biến). Điều này cũng thuộc thể loại thiết kế dựa trên dữ liệu. Nếu bạn quyết định sử dụng ngôn ngữ kịch bản lệnh hiện có, có thể đáng để kiểm tra xem ngôn ngữ lập trình bạn chọn có ràng buộc với ngôn ngữ kịch bản lệnh đó hay không (thường ở dạng thư viện bên thứ 3).


5

Ngôn ngữ bạn chọn không thực sự xác định mức độ có thể sửa đổi của trò chơi, cách bạn sử dụng ngôn ngữ quan trọng hơn.

Nếu hầu hết các trò chơi của bạn được điều khiển dữ liệu (đó là dữ liệu trò chơi được xác định trong một tệp được đọc từ mã của bạn), trò chơi có thể rất có thể sửa đổi. Điều này có thể được thực hiện bằng khá nhiều ngôn ngữ. Sử dụng ngôn ngữ kịch bản cũng giúp việc sửa đổi trò chơi dễ dàng hơn.

Tuy nhiên, điều đó không tự động có nghĩa là không sử dụng những thứ đó khiến cho việc sửa đổi trò chơi là không thể. Ví dụ, Minecraft hoàn toàn không phải là một trò chơi có thể sửa đổi, tuy nhiên có những trình dịch ngược khá tốt có sẵn cho Java và một cộng đồng rất lớn cho Minecraft, vì vậy rất nhiều công cụ đã được tạo ra để có thể sửa đổi Minecraft (nhiều bộ nạp khác nhau, Bukkit). Với những công cụ đó, có thể mod Minecraft (tuy nhiên, có lẽ chúng là bất hợp pháp về mặt kỹ thuật ở một số quốc gia).

Lời khuyên tốt nhất tôi có thể cung cấp cho bạn, là sử dụng các công cụ bạn muốn sử dụng modder; Nếu bạn xác định NPC từ một tệp, nó có thể được sửa đổi, nếu bạn đặc biệt trong mã thì có lẽ không thể.


1

Java hoàn toàn phù hợp để viết một trò chơi có thể sửa đổi.

Phải nói rằng, cách tốt nhất để tạo ra một trò chơi có thể sửa đổi thường là sử dụng một ngôn ngữ động có thể được nhúng trong ứng dụng rộng hơn và được sử dụng để viết kịch bản. Bạn thường muốn có một ngôn ngữ động vì vấn đề là có thể tương tác với mã khi chạy, mà không phải trải qua toàn bộ chu trình biên dịch / xây dựng / kiểm tra.

Một số lựa chọn ngôn ngữ động để xem xét:

  • Groovy - một ngôn ngữ giống như Java động tuyệt vời có thể được nhúng trong các chương trình Java lớn hơn.
  • Clojure - một Lisp mạnh mẽ, năng động cho JVM. Có thể khó để một số modder có thể hiểu được, nhưng là một ngôn ngữ đặc biệt mạnh mẽ và có thể được nhúng rất dễ dàng. Không thấy nó được sử dụng để mod trò chơi nhưng không có lý do tại sao không.
  • Lua - một ngôn ngữ kịch bản trò chơi rất phổ biến. Tôi tin rằng có các phiên bản cho JVM mà bạn có thể sử dụng từ bên trong Java (mặc dù tôi đã không tự mình thử các phiên bản này)
  • JavaScript - có sẵn trên JVM thông qua Rhino . Một lựa chọn khá chắc chắn cho kịch bản trò chơi vì nhiều người biết một số JavaScript, cộng với mô hình đối tượng nguyên mẫu rất phù hợp với các mod trò chơi.

-2

Có một cách dễ dàng hơn để làm điều này trong java mặc dù nó hơi cẩu thả. Tất cả những gì bạn phải làm là lấy các tệp java chấm trong một thư mục và sau đó đặt tệp bó này với thư mục, đặt tên là Chạy:

javac /src/.java Java / src /

Lưu ý: Bạn có thể thêm bao nhiêu lớp bạn muốn. Lưu ý: Trong dòng cuối cùng, đảm bảo KHÔNG đặt bất kỳ tiện ích mở rộng nào còn gọi là .java, .exe, .bat, ect.

Điều đó về cơ bản sẽ chỉ biên dịch lại mã mỗi khi trò chơi chạy, vì vậy nếu nguồn trò chơi thay đổi, nó sẽ biên dịch nó và sau đó chạy trò chơi mới được biên dịch ... Đáng buồn là bạn không thể thêm mod của người khác vào trò chơi.


Jacob Tôi không nghĩ bạn đã hiểu câu hỏi, xin vui lòng đọc qua các câu trả lời và xem nếu điều đó giúp bạn hiểu những gì đang được thảo luận ở đây.
vikki
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.