Bạn có thể quan tâm đến bản trình bày tôi đã cung cấp cho ACCU '09 - "Adopting Model-View-Controller in Cocoa and Objective-C".
Bắt đầu từ đâu? Với bộ điều khiển ? Điều đó dường như làm cho số ý nghĩa nhất đối với tôi, nhưng làm cách nào để bắt đầu? ?
Tạo dự án ứng dụng Cocoa mới và bạn sẽ thấy rằng đã có lớp điều khiển do mẫu cung cấp - đó là lớp đại biểu ứng dụng. Bây giờ hãy xem MainMenu.xib
. Có một ví dụ về đại biểu ứng dụng và nó được kết nối với ổ cắm delegate
của đối tượng "Chủ sở hữu tệp". Trong trường hợp này, NSApplication
là Chủ sở hữu tệp; đó là thứ muốn MainMenu
được giải nén. Vì vậy, đây thực sự là đại biểu của ứng dụng.
Điều đó có nghĩa là chúng tôi có thứ gì đó là đối tượng điều khiển, có thể nói chuyện với cá thể NSApplication
và có thể có các cửa hàng cho tất cả các đối tượng khác trong XIB. Điều đó làm cho nó trở thành một nơi tuyệt vời để thiết lập trạng thái ban đầu của ứng dụng - tức là là "điểm vào" cho ứng dụng của bạn. Trong thực tế, điểm vào phải là phương thức -applicationDidFinishLaunching:
. Điều đó được gọi là khi ứng dụng đã hoàn thành tất cả những thứ cần thiết để ứng dụng của bạn trở thành trạng thái ổn định, chạy - nói cách khác Cocoa rất vui vì nó đã hoàn thành những gì cần thiết và mọi thứ khác tùy thuộc vào bạn.
-applicationDidFinishLaunching:
là nơi bạn muốn tạo hoặc khôi phục Mô hình ban đầu, là biểu diễn trạng thái của ứng dụng (bạn cũng có thể nghĩ nó là đại diện cho tài liệu của người dùng, nếu tương tự phù hợp với ứng dụng - tài liệu của bạn các ứng dụng dựa trên chỉ phức tạp hơn một chút so với các ứng dụng mặc định) và cho Chế độ xem biết cách thể hiện mọi thứ cho người dùng. Trong nhiều ứng dụng bạn không cần tải toàn bộ Mô hình khi ứng dụng đã khởi chạy; cho một sự khởi đầu nó có thể được làm chậm và sử dụng bộ nhớ nhiều hơn bạn cần, và thứ hai lần xem đầu tiên có lẽ không hiển thị tất cả các bit về mô hình. Vì vậy, bạn chỉ cần tải các bit bạn cần để hiển thị người dùng những gì đang lên; bạn đang Kiểm soát tương tác giữa Chế độ xem và Mô hình.
Nếu bạn cần hiển thị thông tin khác trong Chế độ xem khác - ví dụ: nếu Chế độ xem chính của bạn là chế độ xem chính và bạn cần hiển thị trình chỉnh sửa chi tiết - thì khi người dùng cho bạn biết họ muốn làm gì điều đó. Họ cho bạn biết bằng cách thực hiện một số hành động mà bạn có thể xử lý trong ủy nhiệm ứng dụng. Sau đó, bạn tạo một Bộ điều khiển mới để quay lại Chế độ xem mới và cho biết nơi cần lấy thông tin về Mô hình cần thiết. Bạn có thể giữ các đối tượng Xem khác trong một XIB riêng biệt, vì vậy chúng chỉ được tải khi cần.
Làm cách nào để thiết lập thế giới trò chơi? Tôi hiện đang sử dụng hai mảng, một cho thế giới (Tường, Sàn nhà, Cửa, Nước, Nham thạch, v.v.) và một cho các mục (Tôi sẽ thêm 1/3 cho ký tự). Bản đồ (a .plist) là được tải, và sau đó các đối tượng là được tạo và thêm vào mảng nó thuộc về. Các mảng này đi đâu? Trong nguyên mẫu, chúng cũng là một phần của chế độ xem, vì vậy tôi đoán bạn có thể nói tôi kết hợp cả hai (Xem và Điều khiển) với nhau. Sẽ có một đối tượng Bản đồ được tạo cho mỗi bản đồ không? Sẽ có một đối tượng Bản đồ có chứa tất cả các bản đồ không?
Chúng tôi có thể tìm ra những đối tượng mà chúng tôi đang lập mô hình bằng cách phân tích tuyên bố của bạn ở trên - bạn có thể không nhận ra, nhưng bạn đã phác thảo một đặc điểm :-). Có một thế giới chứa các bức tường, cửa ra vào, v.v., vì vậy chúng ta biết chúng ta cần các vật thể cho chúng, và rằng chúng nên thuộc về cho một vật thể thế giới. Nhưng chúng ta cũng có các vật phẩm và nhân vật - chúng tương tác với thế giới như thế nào? Một nơi có thể chứa nước và một nhân vật? Nếu vậy, có lẽ thế giới được tạo thành từ Địa điểm và mỗi Vị trí có thể có tường hoặc cửa hoặc bất kỳ thứ gì và nó cũng có thể có các vật phẩm và nhân vật. Lưu ý rằng nếu tôi viết nó như thế này, có vẻ như là mục thuộc về vị trí, không phải là vị trí cho mục đó. Tôi sẽ nói "mat có một con mèo trên đó" thay vì "con mèo có một tấm thảm bên dưới nó".
Vì vậy, chỉ cần nghĩ về những gì bạn muốn thế giới trò chơi của mình thể hiện và mối quan hệ giữa những thứ trong trò chơi. Điều này được gọi là mô hình miền, bởi vì bạn đang mô tả những thứ trong thế giới trò chơi thay vì cố mô tả mọi thứ trong thế giới phần mềm. Nếu nó giúp, hãy viết ra một vài câu mô tả thế giới game, và tìm kiếm động từ và danh từ giống như tôi đã làm trong đoạn cuối.
Bây giờ một số danh từ của bạn sẽ trở thành đối tượng trong phần mềm, một số sẽ trở thành thuộc tính của các đối tượng khác. Động từ sẽ là hành động (tức là phương pháp). Nhưng dù bằng cách nào, nó sẽ dễ dàng hơn để suy nghĩ về nếu bạn xem xét những gì bạn đang cố gắng để mô hình đầu tiên, thay vì nhảy thẳng xuống phần mềm.
Mọi thứ hoạt động cùng nhau như thế nào? Trình phát nhấn một phím, di chuyển ký tự trong trò chơi. Quan điểm sẽ được xử lý đầu vào, phải không? bạn gửi cho bộ điều khiển, nào sẽ kiểm tra mọi thứ (tường, quái vật, v.v.) trong bản đồ/các mảng khác và sau đó trả về kết quả? Hoặc bạn sẽ gửi cho người chơi, trong đó sẽ chuyển đến bộ điều khiển, trong đó sẽ thực hiện tất cả séc và sau đó trả lại kết quả?
Tôi thích làm theo chính sách "nói, đừng hỏi", cho biết bạn chỉ huy một đối tượng để làm điều gì đó thay vì yêu cầu nó cung cấp cho bạn thông tin để đưa ra quyết định. Bằng cách đó, nếu hành vi thay đổi, bạn chỉ cần sửa đổi đối tượng đang được nói. Điều này có nghĩa cho ví dụ của bạn là Chế độ xem xử lý sự kiện nhấn phím (nó do chúng được xử lý bởi NSControl
) và nó cho Bộ điều khiển biết rằng sự kiện này đã xảy ra. Giả sử Chế độ xem nhận được phím tắt "mũi tên trái" và Trình điều khiển quyết định điều này có nghĩa là người chơi phải di chuyển sang trái. Tôi chỉ bảo người chơi "di chuyển sang trái", và để người chơi phân loại những gì xảy ra khi di chuyển trái nghĩa là va vào tường hoặc quái vật.
Để giải thích lý do tại sao tôi muốn thực hiện theo cách đó, hãy tưởng tượng bạn thêm vào trò chơi 1.1 khả năng để người chơi bơi. Bây giờ người chơi có một số tài sản ableToSwim
, vì vậy bạn cần thay đổi trình phát. Nếu bạn yêu cầu người chơi di chuyển sang trái, thì bạn cập nhật trình phát để biết những gì di chuyển sang trái trên mặt nước có nghĩa là tùy thuộc vào việc họ có thể bơi hay không. Nếu thay vào đó, Bộ điều khiển yêu cầu người chơi di chuyển sang trái và đưa ra quyết định, thì Bộ điều khiển cần biết để hỏi về việc có thể bơi, và cần biết ý nghĩa của nó ở gần nước. Cũng như bất kỳ đối tượng điều khiển nào khác trong trò chơi có thể tương tác với người chơi, cũng như bộ điều khiển trong trò chơi dành cho iPhone ;-).
Tôi đang thêm 300 tiền thưởng. Tôi muốn một câu trả lời tốt chết tiệt. – Sneakyness
Nếu bạn cần tôi làm rõ điều gì đó hoặc bạn cần chi tiết hơn, hãy cho tôi biết ngay tại đây, tôi sẵn lòng hơn. – Sneakyness
Xin lỗi để trả lời một câu trả lời crappy lần đầu tiên, tôi không có nhiều thời gian nhưng nghĩ rằng bài thuyết trình có thể giúp :-) –