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:
- Người chơi bắt đầu kéo một mảnh
- 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 đó
- Người chơi cho đi một mảnh
- UI chộp mảnh vào lưới (để nó ở vị trí logic hợp lệ)
- 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 đó:
- 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?
- 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ý?
- 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?
- 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.