Tôi hy vọng những lời huyên thuyên này sẽ làm cho câu hỏi của tôi rõ ràng - tuy nhiên tôi hoàn toàn hiểu nếu họ sẽ không, vì vậy, hãy cho tôi biết nếu đó là trường hợp, và tôi sẽ cố gắng làm cho mình rõ ràng hơn.
Gặp gỡ BoxPong , một trò chơi rất đơn giản mà tôi đã thực hiện để làm quen với việc phát triển trò chơi hướng đối tượng. Kéo hộp để kiểm soát bóng và thu thập những thứ màu vàng.
Làm BoxPong giúp tôi hình thành, trong số những điều khác, một câu hỏi cơ bản: làm thế nào tôi có thể có các đối tượng tương tác với nhau mà không phải "thuộc về" nhau? Nói cách khác, có cách nào để các đối tượng không được phân cấp, mà thay vào đó cùng tồn tại? (Tôi sẽ đi sâu vào chi tiết bên dưới.)
Tôi nghi ngờ vấn đề của các đối tượng cùng tồn tại là một vấn đề phổ biến, vì vậy tôi hy vọng có một cách được thiết lập để giải quyết nó. Tôi không muốn phát minh lại bánh xe vuông, vì vậy tôi đoán câu trả lời lý tưởng mà tôi đang tìm kiếm là "đây là một mẫu thiết kế thường được sử dụng để giải quyết vấn đề của bạn."
Đặc biệt là trong các trò chơi đơn giản như BoxPong, rõ ràng là có hoặc nên có một số đối tượng cùng tồn tại ở cùng cấp độ. Có một cái hộp, có một quả bóng, có một cái sưu tập. Mặc dù vậy, tất cả những gì tôi có thể diễn đạt bằng các ngôn ngữ hướng đối tượng - hoặc có vẻ như vậy - là các mối quan hệ HAS-A nghiêm ngặt . Điều đó được thực hiện thông qua các biến thành viên. Tôi không thể bắt đầu ball
và để nó làm việc của mình, tôi cần nó vĩnh viễn thuộc về một đối tượng khác. Tôi đã thiết lập nó để đối tượng trò chơi chính có một hộp và hộp lần lượt có một quả bóng và có một bộ đếm điểm. Mỗi đối tượng cũng có mộtupdate()
Phương thức tính toán vị trí, hướng, v.v. và tôi đi theo một cách tương tự ở đó: Tôi gọi phương thức cập nhật của đối tượng trò chơi chính, gọi phương thức cập nhật của tất cả các con của nó và chúng lần lượt gọi các phương thức cập nhật của tất cả các con của chúng . Đây là cách duy nhất tôi có thể thấy để tạo ra một trò chơi hướng đối tượng, nhưng tôi cảm thấy đó không phải là cách lý tưởng. Rốt cuộc, tôi sẽ không nghĩ chính xác quả bóng thuộc về chiếc hộp, mà là ở cùng cấp độ và tương tác với nó. Tôi cho rằng điều đó có thể đạt được bằng cách biến tất cả các đối tượng trò chơi thành các biến thành viên của đối tượng trò chơi chính, nhưng tôi không thấy việc giải quyết bất cứ điều gì. Ý tôi là ... bỏ qua sự lộn xộn rõ ràng, làm thế nào để bóng và hộp có thể biết nhau , nghĩa là tương tác?
Ngoài ra còn có vấn đề về các đối tượng cần truyền thông tin lẫn nhau. Tôi có khá nhiều kinh nghiệm viết mã cho SNES, nơi bạn có quyền truy cập vào thực tế toàn bộ RAM mọi lúc. Giả sử bạn đang tạo một kẻ thù tùy chỉnh cho Super Mario World và bạn muốn nó xóa tất cả các đồng tiền của Mario, sau đó chỉ cần lưu trữ số 0 để giải quyết $ 0DBF, không vấn đề gì. Không có giới hạn cho biết kẻ thù không thể truy cập trạng thái của người chơi. Tôi đoán rằng tôi đã bị phá hỏng bởi sự tự do này, bởi vì với C ++ và tương tự tôi thường thấy mình tự hỏi làm thế nào để tạo ra một giá trị có thể truy cập được đối với một số đối tượng khác (hoặc thậm chí toàn cầu).
Sử dụng ví dụ về BoxPong, nếu tôi muốn bóng bật ra khỏi các cạnh của màn hình thì sao? width
và height
là các thuộc tính của Game
lớp,ball
để có quyền truy cập vào chúng. Tôi có thể chuyển các loại giá trị này (thông qua các nhà xây dựng hoặc các phương thức cần thiết), nhưng điều đó chỉ làm tôi khó chịu.
Tôi đoán vấn đề chính của tôi là tôi cần các đối tượng để biết nhau, nhưng cách duy nhất tôi có thể thấy để làm điều đó là hệ thống phân cấp chặt chẽ, xấu xí và không thực tế.
Tôi đã nghe nói về "các lớp bạn bè" trên C ++ và có thể biết chúng hoạt động như thế nào, nhưng nếu chúng là giải pháp cuối cùng, thì tại sao tôi không thấy friend
các từ khóa đổ ra khắp mọi dự án C ++ và làm thế nào khái niệm không tồn tại trong mọi ngôn ngữ OOP? (Điều tương tự cũng xảy ra với các con trỏ hàm, mà tôi mới biết gần đây.)
Cảm ơn trước câu trả lời dưới bất kỳ hình thức nào - và một lần nữa, nếu có một phần không có ý nghĩa với bạn, hãy cho tôi biết.