Tách vật lý và logic trò chơi khỏi mã UI


12

Tôi đang làm việc trên một trò chơi giải đố dựa trên khối đơn giản.

Chơi trò chơi bao gồm khá nhiều khối di chuyển xung quanh trong khu vực trò chơi, vì vậy đó là một mô phỏng vật lý tầm thường. Tuy nhiên, việc triển khai của tôi là theo ý kiến ​​của tôi khác xa với lý tưởng và tôi tự hỏi liệu bạn có thể cho tôi bất kỳ gợi ý nào về cách làm điều đó tốt hơn không.

Tôi đã chia mã thành hai khu vực: Logic trò chơi và Giao diện người dùng, như tôi đã làm với rất nhiều trò chơi giải đố:

  • Logic trò chơi chịu trách nhiệm cho các quy tắc chung của trò chơi (ví dụ: hệ thống quy tắc chính thức trong cờ vua)
  • Giao diện người dùng hiển thị khu vực trò chơi và quân cờ (ví dụ: bàn cờ và quân cờ) và chịu trách nhiệm cho hoạt hình (ví dụ: chuyển động hoạt hình của quân cờ)

Logic trò chơi biểu thị trạng thái trò chơi dưới dạng lưới logic, trong đó mỗi đơn vị là một chiều rộng / chiều cao của một ô trên lưới. Vì vậy, đối với lưới có chiều rộng 6, bạn có thể di chuyển một khối có chiều rộng 2 bốn lần cho đến khi nó va chạm với đường biên.

Giao diện người dùng lấy lưới này và vẽ nó bằng cách chuyển đổi kích thước logic thành kích thước pixel (nghĩa là nhân nó với một hằng số). Tuy nhiên, do trò chơi hầu như không có logic trò chơi nào, lớp logic trò chơi của tôi [1] không có nhiều việc phải làm ngoại trừ phát hiện va chạm. Đây là cách nó hoạt động:

  1. Người chơi bắt đầu kéo một mảnh
  2. UI yêu cầu logic trò chơi cho khu vực di chuyển hợp pháp của quân cờ đó và cho phép người chơi kéo nó trong khu vực đó
  3. Người chơi cho đi một mảnh
  4. UI chộp mảnh vào lưới (để nó ở vị trí logic hợp lệ)
  5. Giao diện người dùng cho logic trò chơi vị trí logic mới (thông qua các phương thức trình biến đổi, điều mà tôi muốn tránh)

Tôi không hoàn toàn hài lòng với điều đó:

  • Tôi đang viết các bài kiểm tra đơn vị cho lớp logic trò chơi của mình, nhưng không phải là UI và hóa ra tất cả các mã khó khăn đều có trong UI: Ngăn chặn tác phẩm va chạm với người khác hoặc ranh giới và đưa nó vào lưới.
  • Tôi không thích việc UI nói với logic trò chơi về trạng thái mới, tôi muốn nó gọi một movePieceLeft()phương thức hoặc một cái gì đó tương tự, như trong các trò chơi khác của tôi, nhưng tôi đã không đi xa với cách tiếp cận đó, bởi vì logic trò chơi không biết gì về việc kéo và chụp có thể có trong UI.

Tôi nghĩ rằng điều tốt nhất để làm là thoát khỏi lớp logic trò chơi của tôi và thay vào đó thực hiện một lớp vật lý. Tôi đã có một vài câu hỏi liên quan đến điều đó:

  1. Là một lớp vật lý như vậy phổ biến, hoặc nó là điển hình hơn để có lớp logic trò chơi làm điều này?
  2. Liệu snapping vào lưới và mảnh kéo mã thuộc về giao diện người dùng hoặc lớp vật lý?
  3. Một lớp vật lý như vậy thường hoạt động với kích thước pixel hoặc với một loại đơn vị logic nào đó, như lớp logic trò chơi của tôi?
  4. Tôi đã từng thấy phát hiện va chạm dựa trên sự kiện trong cơ sở mã của trò chơi, nghĩa là người chơi sẽ chỉ cần kéo mảnh, giao diện người dùng sẽ hiển thị một cách ngoan ngoãn và thông báo cho hệ thống vật lý và hệ thống vật lý sẽ gọi phương thức onCollision () trên mảnh một khi một vụ va chạm được phát hiện. Những gì phổ biến hơn? Cách tiếp cận này hoặc yêu cầu khu vực di chuyển hợp pháp đầu tiên?

Lớp [1] có lẽ không phải là từ thích hợp cho những gì tôi muốn nói, nhưng hệ thống con nghe có vẻ quá mức và lớp bị nhầm lẫn, bởi vì mỗi lớp có thể bao gồm một vài lớp.


Có câu trả lời của tôi giúp đỡ, cần thêm thông tin?
Will Marcouiller

Xin vui lòng, upvote và chấp nhận câu trả lời nếu điều này đã giúp hoặc nói về các vấn đề của bạn khi thực hiện một kiến ​​trúc như vậy hoặc một cái gì đó, nhưng hãy thông báo cho chúng tôi về tình huống của bạn để chúng tôi có thể hỗ trợ tốt hơn. =)
Will Marcouiller

Câu trả lời:


3

Tôi sẽ cố gắng trả lời câu hỏi này vì tôi có thể hiểu những gì bạn đang hỏi, mặc dù tôi không có nhiều kinh nghiệm phát triển trò chơi vì tôi vẫn chỉ học.

Như tôi thấy, bạn phải tách mã GUI khỏi các đối tượng logic và miền trò chơi của mình, nghĩa là các mảnh ghép. Đây thực sự là ba lớp riêng biệt - và vâng, layerlà một thuật ngữ thích hợp theo ý kiến ​​của tôi. Nó thường được sử dụng để giải thích các khái niệm phân tách từng cấp đối tượng của một hệ thống thành các hệ thống con độc lập với nhau.

Liên quan đến lập trình hướng đối tượng, mỗi đối tượng sẽ là một lớp. Vì vậy, mỗi phần của câu đố của bạn sẽ bao gồm một lớp cho chính nó, và do đó, bảng trò chơi. Bảng trò chơi nên chứa X mảnh ghép tùy thuộc vào kích thước và khả năng di chuyển của nó mà bạn muốn đưa cho người chơi.

Vì vậy, đây là suy nghĩ của tôi về chủ đề này - tôi hy vọng rằng nó sẽ giúp:

  1. Lớp GUI: Lớp này chỉ chứa các phương thức để hiển thị các phần trên bảng trò chơi để cho phép sự tương tác giữa chính trò chơi và người chơi;
  2. Lớp Trình điều khiển trò chơi: Chịu trách nhiệm về đầu vào của người chơi. Đó là lớp nên bảo một mảnh di chuyển theo các hướng khác nhau, và hỏi hội đồng quản trị trò chơi xem liệu sẽ có va chạm khi di chuyển hay không;
  3. Lớp nghiệp vụ: Lớp này sẽ chứa tất cả các lớp nghiệp vụ của bạn, nghĩa là các phần của trò chơi của bạn và đối tượng bảng trò chơi có chứa các mảnh ghép.

Trong kiến ​​trúc này, bạn sẽ có lớp GUI hiển thị cho người chơi trạng thái trò chơi, vị trí của từng mảnh ghép. Lớp GUI sau đó sẽ chịu trách nhiệm nhận các đầu vào của người chơi và chuyển nó đến một lớp Trình điều khiển trò chơi cơ bản, sau đó sẽ chịu trách nhiệm phát hiện va chạm. Nếu không có, thì mảnh có thể được yêu cầu di chuyển vào hướng đầu vào đó. Để làm như vậy, bạn chỉ cần gọi phần này là MoveLeft,MoveRight, vv phương pháp để làm cho mảnh di chuyển. Bạn cũng có thể cho hội đồng quản trị trò chơi biết phần nào bạn muốn di chuyển, và sau đó nó tự ra lệnh cho chuyển động của quân cờ và sau đó chuyển sang hướng yêu cầu. Kiến trúc này giúp dễ dàng kiểm tra từng đoạn mã thành các lớp khác nhau và sau đó cho phép bạn thử nghiệm đơn vị, thử nghiệm tích hợp và thử nghiệm chức năng.

Tôi biết điều này có vẻ hơi khó hiểu khi nhìn thấy, và cảm ơn chúa nếu không! Nếu bạn cần thêm thông tin chi tiết và trợ giúp, xin vui lòng hỏi, tôi sẽ vui lòng giúp đỡ tốt nhất có thể mặc dù tôi là người mới bắt đầu phát triển trò chơi.

Cảm ơn vì đã đọc! =)


2
Nghe có vẻ rất giống với Model View Controller.
tenpn

Thành thật mà nói, bất kỳ mô tả nào về giao diện trừu tượng hóa từ triển khai cơ bản sẽ có vẻ giống như Model View Controller. Nhưng đó là vì thuật ngữ và kỹ thuật được sử dụng là như nhau (trừu tượng hóa khỏi các chi tiết triển khai và tách giao diện người dùng khỏi thực hiện). Nhưng nó giả định một môi trường rất đơn giản. Có nhiều lớp ở đây, và có các bộ điều khiển trong mỗi lớp. Tách chế độ xem khỏi mô hình không đủ ở đây, bạn cũng cần tách điều khiển tương tác người dùng khỏi điều khiển trò chơi.
MrCranky

Tôi tự hỏi có gì phức tạp ở đây, vì chúng ta đang chuyển những mảnh ghép lên một bảng trò chơi được phân định. Các điều khiển được lấy từ GUI, thực tế là một cách tốt và chuyển ra một lớp trừu tượng, đó là bộ điều khiển trò chơi. Bộ điều khiển trò chơi kiểm tra các va chạm khi di chuyển, sau đó báo cho quân cờ di chuyển nếu không phát hiện va chạm. Mảnh ghép sau đó di chuyển chính xác về hướng được yêu cầu và hiển thị vị trí mới của nó thông qua Positionchức năng getter thuộc tính của nó , do đó bộ điều khiển trò chơi hiện yêu cầu GUI hiển thị mảnh di chuyển này đến vị trí mới đó.
Will Marcouiller

heh, tôi đã viết blog về "MVC" trong phát triển game vài tháng trước. Vâng, đó là một khái niệm cổng tốt cho những người không quen với phát triển trò chơi: codecube.net/2010/08/xna-for-the-everyday-developer
Joel Martinez

1
Xin lỗi vì đã chấp nhận muộn, tôi đã không may bị phân tâm khỏi dự án trong một thời gian. Tôi thực sự thích cách tiếp cận bộ điều khiển, tôi sẽ áp dụng nó!
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.