Làm thế nào tôi có thể thực hiện kịch bản thông minh, trong trò chơi của tôi?


18

Tôi đang phát triển một công cụ trò chơi. Nó được coi là một thực thể / thành phần dựa trên một. Để phát triển trò chơi của mình, tôi nghĩ rằng nên sử dụng một số ngôn ngữ kịch bản để thực sự tạo ra các thực thể.

Ví dụ, nếu tôi muốn thêm một loại quái vật gây hấn cho người chơi, nó sẽ là một thực thể có nhiều thành phần; các thành phần đó sẽ thay đổi theo loại quái vật, vì vậy nếu tôi có một trăm loại quái vật khác nhau, trong trò chơi của mình, tôi sẽ không phải tạo một phương thức mới cho từng loại trong mã trò chơi của mình.

Tôi có nên sử dụng ngôn ngữ kịch bản để mô tả thực thể này, về mặt các thành phần hoặc có thứ gì khác sẽ hoạt động tốt hơn không? Tổng quát hơn, tôi nên sử dụng kịch bản như thế nào trong trò chơi của mình?


Đối với chỉ mô tả thực thể, bạn chỉ có thể sử dụng xml hoặc một cái gì đó tương tự, không cần kịch bản. Để tạo kịch bản, tôi sẽ sử dụng C #, nhưng chỉ khi công cụ của bạn ở trong .NET ...
Kikaimaru

@Kikaimaru C # Không phải là ngôn ngữ kịch bản. Sử dụng lua sẽ là một ý tưởng tốt hơn hoặc một số ngôn ngữ khác có thể được nhúng trong công cụ của bạn.
JDSweetBeat

@DJMethaneMan "C # không phải là ngôn ngữ kịch bản" không có nghĩa gì cả javascript thay vì xml và C # :)
Kikaimaru

Câu trả lời:


17

Trò chơi của tôi sử dụng khung thành phần thực thể và sử dụng tập lệnh để xác định thực thể (điều này không trực tiếp xác định hành vi, cuối cùng tôi sẽ nói thêm về điều đó). Các tập lệnh xác định các thành phần thực tế sẽ được sử dụng để tạo từng thực thể. Nó sử dụng một ngôn ngữ kịch bản đơn giản mà tôi tạo ra. Đây là phiên bản đơn giản hóa của một trong các tập lệnh của tôi:

ENTITY:"Goblin"
{
    description="It's currently their age."
    commonname="goblin"
    pluralCommonName="goblins"
    childname="gob'in"
    pluralChildName="gob'ins"
    active=Nocturnal
    tags=Mobile
    baseAttributes="OrganicMobileCreature"

    [Model]{
            meshname="Goblin"
            texturename="GoblinTexture"
    }

    [Motion]{
            maxvelocity=0.01:0.015
            locomotion=Walk,Swim
    }

    [Skills]{
            ALL=0.01:0.05,Mine=8.3:8.8,PlaceCube=8.3:8.8
    }

    [Inventory]{
            maxItems=2
            Allow=ALL
            Disallow=NONE
    }
}

Phần lớn trong số đó là tự mô tả, nhưng đây là một số điểm nổi bật:

  • Phần đầu tiên mô tả thông tin chung cho thực thể. Điều đó bao gồm một mô tả và hiển thị tên cho các khía cạnh khác nhau của thực thể.
  • Các baseAttributestài liệu tham khảo một thẻ khác tập tin kịch bản xác định các thành phần phổ biến mà tôi không muốn phải xác định lại nhiều lần. Nó chứa các thành phần như position, liferequirementsvà như vậy. Nếu bất kỳ thành phần nào được xác định lại ở đây, thành phần này sẽ ghi đè lên thành phần chung.
  • Mỗi [NAME] { }bộ định nghĩa một thành phần mới sẽ được thêm vào các thực thể này.
  • Mô tả này không chỉ dành cho một thực thể duy nhất , nó dành cho tất cả các yêu tinh được tạo. Bạn sẽ thấy rằng một số giá trị có phạm vi (nghĩa là 0.01:0.015), khi một yêu tinh mới được tạo, nó sẽ được tạo với một thành phần có giá trị ngẫu nhiên trong phạm vi đó. Vì vậy, mỗi con yêu tinh sẽ có các kỹ năng hơi khác nhau và tốc độ hơi khác nhau. Thiết lập này xác định rằng tất cả các yêu tinh sẽ bắt đầu với các kỹ năng thực sự tốt trong việc đặt khối và khai thác, điều này thực sự chỉ dành cho mục đích thử nghiệm của riêng tôi. Nhưng như tôi chắc chắn bạn có thể đoán, rất dễ dàng để thay đổi các giá trị thành bất cứ điều gì tôi muốn.

Toàn bộ điều này liên quan đến việc tạo một trình phân tích cú pháp tùy chỉnh, một số loại cấu trúc để giữ các định nghĩa thực thể (tôi gọi tôi là Lexicon!) Và một nhà máy để lấy các định nghĩa thực thể đó và tạo ra các thực thể mới. Đối với tôi hệ thống này vẫn đang ở giai đoạn đầu, nhưng nó thực sự rất tốt. Đây là một hệ thống khá mạnh để xác định nhanh các thực thể và cho phép bạn tạo bất kỳ thực thể nào bạn muốn bằng cách sử dụng các thành phần bạn đã tạo. Nếu bạn không thoải mái khi tạo trình phân tích cú pháp của riêng mình, tôi nghĩ XML sẽ hoạt động tốt. Tôi đã chuyển đổi từ một trình phân tích cú pháp đệ quy đẩy lùi mà tôi đã viết cho một ngôn ngữ lập trình nhỏ.

Như bạn có thể thấy điều này xác định thực thể. Tôi đã đề cập rằng nó không trực tiếp xác định hành vi. Tuy nhiên, nó có thể dễ dàng định nghĩa những thứ như kẻ thù đáng ghét và cách phản ứng mạnh mẽ với kẻ thù đã nói. Điều này sẽ đơn giản như xác định bất kỳ thành phần nào bạn sử dụng để kiểm soát hành vi đó. Các thực thể của tôi cũng có một thành phần thông minh (không hiển thị) xác định những thứ như:

  • Cách họ tìm đường (chuyển động tầm nhìn đơn giản, A * đơn giản, A * dự đoán, v.v.)
  • Làm thế nào họ hung hăng / phòng thủ. Các thực thể có thể có các khu vực nhà sẽ được bảo vệ, nhưng có thể không hung hăng bên ngoài các khu vực đó.
  • Nhận thức về công nghệ (mở cửa, sử dụng các tiện ích, tránh bẫy, v.v.)
  • Và hơn thế nữa...

Tuy nhiên, hệ thống của bạn được xác định, hệ thống của bạn sẽ điều khiển dữ liệu trong thành phần đó, điều này sẽ ảnh hưởng đến hành vi của các quyền lợi của bạn.


Cám ơn vì đã chia sẻ. Tôi thực sự nghĩ rằng tôi sẽ cố gắng làm điều đó bằng định dạng XML. Tôi đã suy nghĩ rất nhiều về điều đó (nhờ vào AbstractChaos btw) và nó sẽ đáp ứng nhu cầu của tôi (ít nhất là cho các mô tả thực thể).
nathan

1
@nathan Tôi đồng ý bạn nên dùng XML. Lý do cho bài đăng của tôi là nhiều dữ liệu cần bao gồm trong XML của bạn và cách sử dụng nó. Định dạng của dữ liệu có thể là bất cứ điều gì bạn thích. Dữ liệu bạn chọn đưa vào và cách bạn triển khai sử dụng dữ liệu quan trọng hơn nhiều.
MichaelHouse

@ Byte56 Tôi biết bài đăng này đã cũ, nhưng làm thế nào bạn có thể xử lý các mối quan hệ cha mẹ con? Giả sử chúng ta có cây Skill và bạn cần 10 điểm trong kỹ năng A [0] để bật A [1] và 10 điểm trong đó để bật A [2], v.v. Tôi có nên lồng chúng, hoặc làm phẳng chúng và khóa trên a ID cha mẹ? Rõ ràng là chúng tương đương về mặt logic, nhưng tôi hy vọng bạn có một cái nhìn sâu sắc trong thế giới thực.
Superopescheese

@Superopescheese if player.hasPoints(10) then i++ end skillTree[i]sẽ là một mã giả. Tôi không biết làm thế nào câu hỏi đó có liên quan đến bài viết, tuy nhiên.
JDSweetBeat

4

Nếu tất cả những gì bạn thực sự cần là một cách xác định các thành phần của Monster thì XML sẽ hoạt động tốt cả C # và java có triển khai nhanh như vậy.

Xml của bạn có thể là

<?xml version="1.0" encoding="UTF-8"?>
<mobs>
  <mob>
    <personality>Aggressive</personality>
    <intelligence>20</intelligence>
  </mob>
</mobs>

Sau đó, lớp Mob của bạn có thể trông như thế. (Java)

public class Mob {
  private IPersonality personality;
  private Integer intelligence

  //**  Getters & Setters **//
}

Trong đó IPersonality là một giao diện.

Sau đó, bạn có thể tải xml của mình và phân tích từng giá trị thông qua một nhà máy.

ví dụ: Phân tích giá trị tính cách thành tính cách đơn giản:

public IPersonality getPersonality(String personalityName) {
  if(personalityName.equals("Aggressive")) {
    return new AggressivePersonality();
  }
  else if(personalityName.equals("Passive")) {
    return new PassivePersonality();
  }
  else {
     //Maybe allow for no personality (We all know monster like that ;) )
     return null; 
  }
}

Sau đó, bạn có thể thiết lập một mob như vậy

Mob mob = new Mob();
mob.setPersonality(getPersonality(xmlValue));
mobList.add(mob);

Điều quan trọng là công cụ của bạn biết định dạng của xml và có một nhà máy cho tất cả những gì nó cần.

Một lợi thế của xml là bạn có thể xác định lược đồ của riêng mình để đảm bảo định dạng luôn chính xác xem tại đây .

Hi vọng điêu nay co ich


Thật ra tôi cần tìm cách dễ dàng tạo ra thực thể mới trong quá trình phát triển trò chơi. Là xml sẽ đủ linh hoạt? Tôi sẽ cần phải thêm kịch bản cho logic trò chơi nội bộ.
nathan

Nếu bạn đọc lớp Mob là Thực thể thì bạn đang tạo Enitity (Mob) mới bằng cách sử dụng XML với các thành phần khác nhau (IPersonality, Intelligence [ví dụ về dữ liệu cho mob đó]). Và thật không may, tôi không thể trả lời nếu nó sẽ đủ linh hoạt vì tôi không biết bạn muốn nó làm gì hơn ngoài những gì bạn đã chỉ định, Tuy nhiên XML là một định dạng trong đó các ràng buộc duy nhất là cách bạn diễn giải từng phần. Cập nhật cho bạn Câu hỏi với một ví dụ chi tiết và tôi sẽ hiển thị một xml có thể xử lý việc đó. Logic trò chơi nội bộ âm thanh như nó nên được nội bộ?
Tóm tắt Sự

0

Python là tốt tôi nghĩ. Thường thì LUA cũng là một lựa chọn tốt nếu bạn muốn thêm khả năng tạo kịch bản cho các chương trình của mình.

Bạn có thể sử dụng XML để mô tả hành vi của quái vật của mình, điều này sẽ liên quan đến một số mã hóa trong mã trò chơi thực tế vì bạn sẽ chỉ lưu "tên" hoặc một số thuộc tính theo hành vi (tốc độ, loại vũ khí mà quái vật sử dụng, v.v.) của hành vi sử dụng trong mã trò chơi của bạn.

Nếu bạn sử dụng Scriptengine (ví dụ LUA), bạn có thể chuyển mã này ra khỏi chương trình được biên dịch sẵn sang các tập lệnh được tải trong thời gian chạy. Để làm điều này, bạn phải đưa API của "quái vật" của mình ra scriptengine. Điều đó cho phép bạn gọi các phương thức của mã trò chơi quái vật từ bên ngoài.


API của quái vật của tôi? Ý tôi là, tôi sẽ phải có khả năng tạo các thành phần mới từ tập lệnh (instanciation). Có thể không?
nathan

Afaik điều này nên có thể. Bạn cũng có thể sử dụng một cách tiếp cận hỗn hợp của bộ lưu trữ ngoài (như được đề cập bởi trừu tượng hoặc byte56) và ngôn ngữ kịch bản (LUA, Python ...). Ưu điểm chính của ví dụ LUA là bạn có thể thay đổi mã của mình khi chạy và nó có sẵn ngay lập tức trong trò chơi / công cụ đang chạy của bạn
Aron_dc

Hồ nghiêm túc? Đó thực sự là một lợi thế lớn. Ngoài ra tôi có mặc dù LUA (hoặc ngôn ngữ kịch bản khác) cho "dòng thời gian trò chơi". Ý tôi là, để tạo ra một số cảnh bối cảnh mà người chơi phải bị chặn, sprite này phải di chuyển đến đây, ánh sáng ở đây và ở đó ... Vì vậy, có lẽ tôi cũng có thể sử dụng ngôn ngữ kịch bản để tải thực thể? Ngoài ra, tôi sẽ đăng một câu hỏi khác để trình bày cách hiện tại của tôi để quản lý thực thể / thành phần qua cái mà tôi gọi là "người quản lý" để xem liệu tôi có làm tốt không.
nathan
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.