Làm thế nào để tránh đối tượng thần GameManager?


51

Tôi chỉ đọc một câu trả lời cho một câu hỏi về cấu trúc mã trò chơi . Nó làm tôi tự hỏi về GameManagertầng lớp có mặt khắp nơi , và nó thường trở thành một vấn đề trong môi trường sản xuất như thế nào. Hãy để tôi mô tả điều này.

Đầu tiên, có nguyên mẫu. Không ai quan tâm đến việc viết mã tuyệt vời, chúng tôi chỉ cố gắng để có một cái gì đó chạy để xem nếu trò chơi thêm vào.

Sau đó, có đèn xanh, và trong nỗ lực dọn dẹp mọi thứ, ai đó đã viết a GameManager. Có lẽ để giữ một bó GameStates, có thể để lưu trữ một vài GameObjects, không có gì lớn, thực sự. Một người quản lý dễ thương, nhỏ bé.

Trong vương quốc yên bình của tiền sản xuất, trò chơi đang hình thành độc đáo. Các lập trình viên có những đêm ngủ thích hợp và nhiều ý tưởng để kiến ​​trúc mọi thứ với Mẫu thiết kế tuyệt vời.

Sau đó, sản xuất bắt đầu và tất nhiên, sớm có thời gian khủng hoảng. Chế độ ăn uống cân bằng đã mất từ ​​lâu, trình theo dõi lỗi đang rạn nứt với các vấn đề, mọi người bị căng thẳng và trò chơi phải được phát hành ngày hôm qua.

Tại thời điểm đó, thông thường, GameManagerlà một mớ hỗn độn thực sự lớn (để giữ lịch sự).

Lý do cho điều đó là đơn giản. Sau khi tất cả, khi viết một trò chơi, cũng ... tất cả các mã nguồn là thực sự đây để quản lý các trò chơi . Thật dễ dàng chỉ cần thêm tính năng bổ sung nhỏ này hoặc sửa lỗi GameManager, trong đó mọi thứ khác đã được lưu trữ bằng mọi cách. Khi thời gian trở thành một vấn đề, không có cách nào để viết một lớp riêng biệt, hoặc tách người quản lý khổng lồ này thành người quản lý phụ.

Tất nhiên đây là một mô hình chống cổ điển: đối tượng thần . Đó là một điều xấu, một nỗi đau để hợp nhất, một nỗi đau để duy trì, một nỗi đau để hiểu, một nỗi đau để biến đổi.

Bạn sẽ đề nghị gì để ngăn chặn điều này xảy ra?

BIÊN TẬP

Tôi biết thật hấp dẫn khi đổ lỗi cho việc đặt tên. Tất nhiên tạo ra một GameManagerlớp học không phải là một ý tưởng tuyệt vời. Nhưng điều tương tự có thể xảy ra với sự sạch sẽ GameApplicationhoặc GameStateMachinehoặc GameSystemcuối cùng trở thành mục yêu thích băng keo vào cuối dự án. Bất kể việc đặt tên, bạn có lớp đó ở đâu đó trong mã trò chơi của bạn, bây giờ nó chỉ là một phôi thai: bạn chỉ không biết nó sẽ trở thành quái vật gì. Vì vậy, tôi không mong đợi câu trả lời "đổ lỗi cho việc đặt tên". Tôi muốn một cách để ngăn chặn điều này xảy ra, một kho lưu trữ mã hóa và / hoặc một quy trình mà một nhóm có thể làm theo khi biết rằng điều này sẽ xảy ra tại một số điểm trong sản xuất. Thật tệ khi vứt đi, một tháng lỗi và các tính năng vào phút cuối, chỉ vì tất cả chúng hiện đang ở trong một trình quản lý lớn không thể nhầm lẫn.


Cho dù nó được gọi là GameManager hay ControllerOfTheGame, hoặc bất cứ điều gì bạn muốn gọi nó, tôi có nghĩa là tránh một lớp chịu trách nhiệm kiểm soát logic cho toàn bộ trò chơi. Bạn biết bạn đang làm điều đó khi bạn làm nó bất kể bạn dự định gọi nó là gì. Tôi nghĩ rằng trò chơi cuối cùng của tôi, tôi đã có một trình điều khiển cấp độ bắt đầu chỉ để giữ trạng thái của cấp độ để lưu, nhưng nếu tôi đã dừng lại và nghĩ về nó, rõ ràng đối tượng này có nghĩa là xử lý chi tiết hơn mức cần thiết.
brandon

@brandon Hãy để tôi nói lại câu hỏi của tôi cho bạn: làm thế nào để bạn kiểm soát logic của toàn bộ trò chơi mà không để lộ bản thân trước những vấn đề GameManagermà tôi đã mô tả ở trên?
Laurent Couvidou

Phụ thuộc vào logic. Những thứ rõ ràng như người chơi, kẻ thù, cấu trúc, v.v ... rõ ràng có logic riêng của nó được đưa vào các lớp tương ứng của chúng. Những gì bạn dường như được hỏi nhiều nhất là xử lý trạng thái của trò chơi. Thông thường sẽ có một lớp theo dõi trạng thái của toàn bộ trò chơi, nhưng theo kinh nghiệm của tôi, đó là một trong những điều cuối cùng bạn cần lo lắng khi tạo mẫu và mục đích của nó phải rất rõ ràng. Về cơ bản, bạn có thể thực hiện một số kế hoạch ban đầu trước khi tạo mẫu hoặc bắt đầu từ đầu khi bạn bắt đầu sản xuất để tránh sử dụng các lớp rác chỉ để thử nghiệm.
brandon

Thật thú vị, XNA tạo ra thảm họa tiềm năng này cho bạn. Theo mặc định, một lớp Game được tạo để quản lý mọi thứ. Nó chứa các phương thức cập nhật chính, vẽ, khởi tạo và tải. Tôi thực sự đang trong quá trình chuyển sang một dự án mới vì trò chơi (không quá phức tạp) của tôi trở nên quá khó để quản lý với mọi thứ được nhồi nhét vào lớp đó. Hơn nữa, các hướng dẫn của Microsoft dường như khuyến khích nó.
Fibericon

Câu trả lời:


23

Sau đó, có đèn xanh và trong nỗ lực dọn dẹp mọi thứ, ai đó đã viết một Trình quản lý trò chơi. Có lẽ để chứa một loạt GameStates, có thể để lưu trữ một vài GameObject, thực sự không có gì lớn. Một người quản lý dễ thương, nhỏ bé.

Bạn biết đấy, khi tôi đọc nó, tôi có một chút báo động trong đầu. Một đối tượng có tên "GameManager" sẽ không bao giờ trở nên dễ thương, hoặc nhỏ bé. Và ai đó đã làm điều này để làm sạch mã? Nó trông như thế nào trước đây? OK, đùa qua một bên: tên của một lớp nên là một dấu hiệu rõ ràng về những gì lớp đó làm, và đây phải là một điều (hay còn gọi là nguyên tắc trách nhiệm duy nhất ).

Ngoài ra, bạn vẫn có thể kết thúc với một đối tượng như GameManager, nhưng rõ ràng, nó tồn tại ở mức rất cao và nó phải liên quan đến các nhiệm vụ cấp cao. Duy trì một danh mục các đối tượng trò chơi? Có lẽ. Tạo điều kiện giao tiếp giữa các đối tượng trò chơi? Chắc chắn rồi. Tính va chạm giữa các vật? Không! Đây cũng là lý do tại sao Trình quản lý tên được tán thành - nó quá rộng và cho phép lạm dụng nhiều dưới biểu ngữ đó.

Một nguyên tắc nhanh chóng về quy mô lớp học: nếu bạn đang chạy vào hàng trăm dòng mã cho mỗi lớp, một cái gì đó đang bắt đầu sai. Không quá hăng hái, bất cứ điều gì hơn, nói, 300 LỘC là một mùi mã đối với tôi, và nếu bạn đang đi hơn 1000, tiếng chuông cảnh báo sẽ được tắt. Bằng cách tin rằng bằng cách nào đó, 1000 dòng mã đơn giản hơn để hiểu hơn 4 lớp có cấu trúc tốt gồm 250 lớp, bạn đang tự lừa dối bản thân mình.

Khi thời gian trở thành một vấn đề, không có cách nào để viết một lớp riêng biệt, hoặc tách người quản lý khổng lồ này thành người quản lý phụ.

Tôi nghĩ rằng đây chỉ là trường hợp vì vấn đề được phép truyền bá đến mức mọi thứ là một mớ hỗn độn. Việc thực hành tái cấu trúc thực sự là những gì bạn đang tìm kiếm - bạn cần liên tục cải tiến thiết kế mã theo từng bước nhỏ .

Bạn sẽ đề nghị gì để ngăn chặn điều này xảy ra?

Vấn đề không phải là vấn đề công nghệ, vì vậy bạn không nên tìm cách khắc phục công nghệ cho nó. Vấn đề là ở chỗ: nhóm của bạn có xu hướng tạo ra các đoạn mã nguyên khối và niềm tin rằng bằng cách nào đó có lợi trong trung hạn / dài hạn để làm việc như thế này. Có vẻ như nhóm nghiên cứu đang thiếu một người dẫn đầu về kiến ​​trúc mạnh mẽ, người sẽ điều khiển kiến ​​trúc của trò chơi (hoặc ít nhất, người này quá bận rộn để thực hiện nhiệm vụ này). Về cơ bản, lối thoát duy nhất là để các thành viên trong nhóm nhận ra rằng suy nghĩ này là sai. Nó không ai ủng hộ. Chất lượng của sản phẩm sẽ xấu đi, và nhóm sẽ chỉ dành nhiều đêm hơn để sửa chữa mọi thứ.

Tin tốt là những lợi ích trước mắt, hữu hình của việc viết mã sạch là rất lớn, mà hầu như tất cả các nhà phát triển đều nhận ra lợi ích của họ rất nhanh. Thuyết phục nhóm làm việc theo cách này trong một thời gian, kết quả sẽ làm phần còn lại.

Điều khó khăn là việc phát triển cảm giác về những gì cấu thành mã xấu (và tài năng để nhanh chóng đưa ra một thiết kế tốt hơn) là một trong những kỹ năng khó hơn để học trong quá trình phát triển. Gợi ý của tôi xoay quanh hy vọng rằng bạn có một người đủ cao cấp trong đội có thể làm điều này - việc thuyết phục mọi người theo cách đó sẽ dễ dàng hơn nhiều.

Chỉnh sửa - Thông tin thêm một chút:

Nói chung, tôi không nghĩ vấn đề của bạn chỉ giới hạn ở việc phát triển trò chơi. Về cốt lõi, đó là một vấn đề về công nghệ phần mềm, do đó tôi nhận xét theo hướng đó. Điều có thể khác là bản chất của ngành phát triển trò chơi, cho dù kết quả và thời hạn định hướng của nó nhiều hơn các loại phát triển khác, tôi không chắc chắn.

Cụ thể cho phát triển trò chơi, câu trả lời được chấp nhận cho câu hỏi này trên StackOverflow liên quan đến các mẹo "đặc biệt là kiến ​​trúc trò chơi", cho biết:

Thực hiện theo các nguyên tắc vững chắc của thiết kế hướng đối tượng ....

Đây là cơ bản chính xác những gì tôi đang nói. Khi tôi bị áp lực, tôi cũng thấy mình viết những đoạn mã lớn, nhưng tôi đã khoan nó vào đầu rằng đó là nợ kỹ thuật. Những gì có xu hướng hoạt động tốt đối với tôi, là dành nửa đầu (hoặc ba phần tư) trong ngày để tạo ra một lượng lớn mã chất lượng trung bình, sau đó ngồi lại và suy nghĩ về nó một lúc; làm một chút thiết kế trong đầu tôi, hoặc trên giấy / bảng trắng, về cách cải thiện mã một chút. Thông thường, tôi nhận thấy mã lặp đi lặp lại và có thể thực sự giảm tổng số dòng mã bằng cách phá vỡ mọi thứ, trong khi cải thiện khả năng đọc. Thời gian đầu tư này tự trả tiền rất nhanh, việc gọi đó là "đầu tư" nghe có vẻ ngớ ngẩn - khá thường xuyên tôi sẽ nhận các lỗi có thể lãng phí nửa ngày của tôi (một tuần sau), nếu tôi cho phép tiếp tục.

  • Sửa chữa mọi thứ trong cùng một ngày bạn mã hóa chúng.
  • Bạn sẽ vui mừng bạn đã làm trong vòng vài giờ.

Đến để thực sự tin những điều trên là khó khăn; Tôi đã quản lý để làm điều đó cho công việc của riêng tôi chỉ vì tôi đã trải nghiệm, nhiều lần, các hiệu ứng. Mặc dù vậy, tôi vẫn khó có thể biện minh cho việc sửa mã khi tôi có thể phát hành thêm ... Vì vậy, tôi chắc chắn hiểu bạn đến từ đâu. Thật không may, lời khuyên này có lẽ quá chung chung, và không dễ thực hiện. Tôi tin tưởng mạnh mẽ vào nó, tuy nhiên! :)

Để trả lời ví dụ cụ thể của bạn:

Clean Code của chú Bob thực hiện một công việc tuyệt vời để tóm tắt mã chất lượng tốt là như thế nào. Tôi đồng ý với hầu hết tất cả các nội dung của nó. Vì vậy, khi tôi nghĩ về ví dụ của bạn về lớp người quản lý 30 000 LỘC, tôi thực sự không thể đồng ý với phần "lý do chính đáng". Tôi không muốn gây khó chịu, nhưng nghĩ rằng cách đó sẽ dẫn đến vấn đề. Không có lý do chính đáng để có nhiều mã trong một tệp - đó là gần 1000 trang văn bản! Bất kỳ lợi ích nào của địa phương (tốc độ thực hiện hoặc thiết kế "đơn giản") sẽ ngay lập tức bị vô hiệu hóa bởi các nhà phát triển bị sa lầy hoàn toàn khi cố gắng điều hướng sự quái dị đó, và thậm chí trước cả khi chúng ta thảo luận về việc hợp nhất, v.v.

Nếu bạn không bị thuyết phục, đề nghị tốt nhất của tôi sẽ là lấy một bản sao của cuốn sách trên và xem qua nó. Áp dụng kiểu suy nghĩ đó để dẫn đến mọi người tự nguyện tạo mã sạch, tự giải thích, được cấu trúc độc đáo.


Đây không phải là một lỗ hổng tôi đã thấy một lần. Tôi đã thấy điều này trong một số đội, cho một số dự án. Tôi đã thấy nhiều người tài năng, có cấu trúc đấu tranh với điều này. Khi chịu áp lực, 300 dòng giới hạn mã không phải là thứ mà nhà sản xuất của bạn quan tâm. Cũng không phải người chơi btw. Chắc chắn điều này là tốt đẹp và ngọt ngào, nhưng ma quỷ là trong các chi tiết. Trường hợp xấu nhất GameManagermà tôi từng thấy cho đến nay là khoảng 30.000 dòng mã, và tôi khá chắc chắn rằng hầu hết nó ở đây vì một lý do rất chính đáng. Điều này là tất nhiên, nhưng những điều đó xảy ra trong thế giới thực. Tôi đang yêu cầu một cách để hạn chế vấn đề này GameManager.
Laurent Couvidou

@lorancou - Tôi đã thêm khá nhiều thông tin bổ sung vào bài viết, nó hơi quá cho một bình luận, hy vọng nó sẽ cho bạn thêm một chút ý tưởng, ngay cả khi tôi không thể chỉ cho bạn bất kỳ kiến ​​trúc cụ thể nào ví dụ.
Daniel B

À, tôi không đọc cuốn sách đó nên chắc chắn đó là một gợi ý hay. Ồ, và tôi không có nghĩa là có một lý do chính đáng để thêm mã trong một lớp hàng ngàn dòng. Tôi có nghĩa là tất cả các mã trong loại đối tượng thần đó làm điều gì đó hữu ích. Tôi có lẽ đã viết rằng một chút quá nhanh;)
Laurent Couvidou

@lorancou Hehe, thật tốt ... theo cách đó là sự điên rồ :)
Daniel B

"Việc thực hành tái cấu trúc thực sự là những gì bạn đang tìm kiếm - bạn cần liên tục cải tiến thiết kế mã theo từng bước nhỏ.". Tôi nghĩ rằng bạn đã có một điểm rất mạnh ở đó. Sự lộn xộn thu hút sự lộn xộn, đó là lý do thực sự đằng sau điều này, vì vậy sự lộn xộn phải được đấu tranh lâu dài. Tôi sẽ chấp nhận câu trả lời này, nhưng điều đó không có nghĩa là không có giá trị trong những người khác!
Laurent Couvidou

7

Đây không thực sự là một vấn đề với lập trình trò chơi, nhưng với lập trình nói chung.

tất cả các mã nguồn thực sự ở đây để quản lý trò chơi.

Đây là lý do tại sao bạn nên nhăn mặt với bất kỳ lập trình viên hướng đối tượng nào sẽ đề xuất các lớp có "Trình quản lý" trong tên. Công bằng mà nói, tôi nghĩ rằng hầu như không thể tránh các đối tượng "semigod" trong trò chơi, nhưng chúng tôi chỉ gọi chúng là "hệ thống".

Bất kỳ phần mềm nào có xu hướng bị bẩn khi thời hạn gần đến. Đó là một phần của công việc. Và không có gì sai với " lập trình loại ống ", đặc biệt là khi bạn phải giao sản phẩm của mình trong vài giờ. Bạn không thể thoát khỏi vấn đề này hoàn toàn, bạn chỉ có thể giảm bớt nó.

Mặc dù rõ ràng, nếu bạn muốn đưa mọi thứ vào GameManager, điều đó có nghĩa là bạn không có cơ sở mã rất lành mạnh. Có thể có hai vấn đề:

  • Mã của bạn quá phức tạp. Quá nhiều mẫu, tối ưu hóa sớm, không ai hiểu được dòng chảy nữa. Cố gắng sử dụng nhiều TDD hơn khi phát triển nếu bạn có thể, vì đó là một giải pháp rất tốt để chống lại sự phức tạp.

  • Mã của bạn không có cấu trúc tốt. Bạn (ab) đang sử dụng biến toàn cục, các lớp không được ghép lỏng lẻo, không có giao diện nào, không có hệ thống sự kiện, v.v.

Nếu mã có vẻ ổn, bạn sẽ phải nhớ, đối với mỗi dự án, "điều gì đã sai" và tránh nó vào lần tới.

Cuối cùng, nó cũng có thể là một vấn đề quản lý nhóm: đã có đủ thời gian chưa? Mọi người có biết về kiến ​​trúc mà bạn đang đi không? Ai đã cho phép một cam kết với một lớp có chữ "Manager" trong đó?


Không có gì sai với lập trình băng keo, tôi cung cấp cho bạn điều đó. Nhưng tôi khá chắc chắn - Các lớp quản lý có ở khắp nơi trong các công cụ trò chơi, ít nhất là tôi đã thấy chúng rất nhiều. Chúng hữu ích miễn là chúng không phát triển quá lớn ... Có gì sai với a SceneManagerhoặc a NetworkManager? Tôi không thấy lý do tại sao chúng ta nên ngăn chặn chúng hoặc cách thay thế -Quản lý bởi -System giúp. Tôi đang tìm kiếm các đề xuất cho một kiến ​​trúc thay thế cho những gì thường đi vào một GameManagerthứ gì đó ít mã hóa hơn.
Laurent Couvidou

Có gì sai với Trình quản lý cảnh? Chà, sự khác biệt giữa Cảnh và Trình quản lý cảnh là gì? Mạng và Quản lý mạng? Ở khía cạnh khác: Tôi không nghĩ đây là vấn đề kiến ​​trúc, nhưng nếu bạn có thể đưa ra một ví dụ cụ thể về một cái gì đó trong GameManager và không có ở đó, việc đề xuất giải pháp sẽ dễ dàng hơn.
Raveline

OK, vì vậy hãy quên điều -Quản lý. Giả sử bạn có một lớp xử lý các trạng thái trò chơi của bạn, hãy gọi nó GameStatesCollection. Ban đầu, bạn sẽ chỉ có một vài trạng thái trò chơi và cách chuyển đổi giữa chúng. Sau đó, có các màn hình tải đến và làm phức tạp tất cả điều này. Sau đó, một số lập trình viên phải xử lý một lỗi khi người dùng đẩy đĩa trong khi bạn chuyển từ Level_A sang Level_B, và cách duy nhất để khắc phục nó mà không mất nửa ngày để tái cấu trúc GameStatesCollection. Boom, một đối tượng thần.
Laurent Couvidou

5

Vì vậy, mang đến một giải pháp khả thi từ thế giới Enterprise-y: bạn đã kiểm tra sự đảo ngược của tiêm kiểm soát / phụ thuộc chưa?

Về cơ bản, bạn có được khung này là một thùng chứa cho mọi thứ khác trong trò chơi của bạn. Nó, và chỉ có nó, biết cách kết nối mọi thứ lại với nhau và mối quan hệ giữa các đối tượng của bạn. Không có đối tượng nào của bạn khởi tạo bất cứ thứ gì bên trong các hàm tạo của riêng chúng. Thay vì tạo ra những gì họ cần, họ yêu cầu những gì họ cần từ khung IoC; khi tạo ra, khung IoC "biết" đối tượng nào là cần thiết để thỏa mãn sự phụ thuộc và lấp đầy nó. FTW khớp nối lỏng lẻo.

Khi lớp EnemyTreasure của bạn yêu cầu bộ chứa cho một đối tượng GameLevel, khung công tác sẽ biết trường hợp nào sẽ cung cấp cho nó. Làm sao nó biết? Có lẽ nó đã khởi tạo nó sớm hơn, có thể nó hỏi một số GameLevelFactory gần đó. Vấn đề là, EnemyTreasure không biết ví dụ GameLevel đến từ đâu. Nó chỉ biết rằng sự phụ thuộc của nó bây giờ đã được thỏa mãn và nó có thể tiếp tục với cuộc sống của nó.

Ồ, tôi thấy lớp PlayerSprite của bạn triển khai IUpdatizable. Thật tuyệt vời, bởi vì khung công tác tự động đăng ký mọi đối tượng IUpdatizable vào Timer, nơi có vòng lặp trò chơi chính. Mỗi Timer :: tick () tự động gọi tất cả các phương thức IUpdatedable :: update (). Dễ thôi phải không?

Trên thực tế, bạn không cần khung bighugeohmygod này để làm điều này cho bạn: bạn có thể tự mình thực hiện các phần quan trọng của nó. Vấn đề là nếu bạn thấy mình đang tạo các đối tượng loại -Quản lý thì rất có thể, bạn không phân phối trách nhiệm của mình giữa các lớp một cách chính xác hoặc thiếu một số lớp ở đâu đó.


Thật thú vị, lần đầu tiên tôi nghe về IoC. Điều này có thể quá bighugeohmygod cho lập trình trò chơi, nhưng tôi sẽ kiểm tra xem!
Laurent Couvidou

IoC, không phải chúng ta chỉ sử dụng để gọi nó là lẽ thường sao?
brice

Có một nửa cơ hội, một kỹ sư sẽ tạo ra một khuôn khổ từ bất cứ điều gì. (= Bên cạnh đó, tôi không ủng hộ việc sử dụng khung, tôi ủng hộ mô hình kiến ​​trúc.
drhayes

3

Trong quá khứ, tôi thường kết thúc với một lớp thần nếu tôi làm như sau:

  • ngồi xuống trình soạn thảo trò chơi / IDE / notepad trước khi tôi viết sơ đồ lớp (hoặc chỉ là bản phác thảo của các đối tượng chính)
  • Bắt đầu với một ý tưởng rất mơ hồ về trò chơi và ngay lập tức mã hóa nó, sau đó bắt đầu lặp lại những ý tưởng mới khi chúng đến
  • tạo một tệp lớp có tên là GameManager khi tôi không tạo một trò chơi dựa trên trạng thái như chiến lược theo lượt trong đó GameManager thực sự là một đối tượng miền
  • không quan tâm đến tổ chức mã sớm

Điều này có thể gây tranh cãi, nếu tôi cười, nhưng tôi không thể nghĩ đến một lần ngay cả khi tạo mẫu rằng bạn không nên viết sơ đồ lớp rất cơ bản trước khi viết nguyên mẫu có thể chơi được. Tôi có xu hướng thử nghiệm các ý tưởng công nghệ trước khi lập kế hoạch, nhưng đó là về nó. Vì vậy, nếu tôi muốn tạo cổng thông tin, tôi sẽ viết mã rất cơ bản để làm cho các cổng hoạt động, sau đó nói ok thời gian tuyệt vời cho một số kế hoạch nhỏ sau đó tôi có thể làm việc trên nguyên mẫu có thể chơi được.


1

Tôi biết câu hỏi này đã cũ, nhưng tôi nghĩ tôi đã thêm 2 xu của mình.

Khi thiết kế trò chơi, tôi gần như luôn có một đối tượng Trò chơi. Tuy nhiên, nó ở mức rất cao và không thực sự "làm bất cứ điều gì".

Ví dụ, nó báo cho lớp Graphics về Render, nhưng không liên quan gì đến quá trình kết xuất. Nó có thể yêu cầu LevelManager tải một cấp độ mới, nhưng không liên quan gì đến quá trình tải.

Nói tóm lại, tôi sử dụng một đối tượng bán thần để phối hợp việc sử dụng các lớp khác.


2
Điều này không giống thần chút nào - cái này được gọi là trừu tượng. :)
Vaughan Hilts
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.