2009-08-26 37 views
5

Tôi vừa đọc một số câu hỏi liên quan xuất hiện khi tôi nhập chủ đề, vì vậy tôi sẽ cố gắng không lặp lại chúng.C++ trò chơi, thiết kế và trách nhiệm của lớp học

Gần đây tôi đã bắt đầu xem lại một dự án học tập mà tôi đã bắt đầu khoảng hai hoặc ba năm trước - một cổng C++ của một động cơ Mega Man. Có, tôi đã sử dụng sprites ripped. Tôi cũng đang sử dụng thư viện công cụ trò chơi để vẽ, nhạc và nhập liệu.

Mã ban đầu của tôi rất tệ. Trong khi nó có thể (nhưng hầu như không) được gọi là OO, nó bị mất điểm hoàn toàn. Tôi đã bắt đầu thêm những thứ như giao diện và cắt ra rất nhiều mã lặp đi lặp lại. Có một số điều tôi không chắc chắn, bởi vì thiết kế trò chơi trở nên rất phức tạp.

Đối tượng đại diện cho thư viện trò chơi của tôi hiện là toàn cầu (tôi biết hình cầu thường là xấu) vì nhiều đối tượng có thể dựa vào nó ở đây và ở đó cho những thứ như tải nghệ thuật hoặc âm nhạc của họ. Cách tốt nhất để đi về việc kéo đối tượng đó ra khỏi phạm vi toàn cầu là gì, mà không cần phải truyền năm mươi tham số cho mọi thứ có thể sử dụng trực tiếp?

Câu hỏi tiếp theo: Như chúng ta đã biết, Mega Man bắn rất nhiều đạn nhỏ màu trắng. Hiện tại, đối tượng Player chịu trách nhiệm cho các đối tượng Projectile mà anh ta bắn, cập nhật vị trí của chúng và như vậy (theo nghĩa đen, gọi phương thức Projectile :: Update() một lần cho mỗi lần chụp, bên trong phương thức Player :: Update()). Đây có phải là cách sai để làm điều đó? Cải tiến đầu tiên của tôi là có tất cả các đối tượng này thực hiện giao diện DrawnObject để trò chơi của tôi có thể vẽ mọi thứ. Làm điều tương tự cho Cập nhật sẽ có nghĩa là tôi kiểm soát các viên đạn ra khỏi Player và đưa nó cho một số đối tượng Game rộng hơn. Lý do tôi do dự về điều này là nó cảm thấy giống như các đối tượng Thiên Chúa antipattern. Hay tôi hiểu lầm nói antipattern? Vẫn có thêm sự phức tạp liên quan - các viên đạn chết nếu họ rời khỏi màn hình hiển thị, vì vậy bất kỳ cuộc gọi nào để cập nhật đạn sẽ yêu cầu người gọi có quyền truy cập vào đối tượng màn hình.

Đó là tất cả cho bây giờ, tôi sẽ quay trở lại với nhiều vấn đề hơn khi tôi tiếp cận họ. Kết thúc bài đăng đầu tiên!

Trả lời

7

Theo như làm cho một lớp học toàn cầu, tôi sẽ sử dụng một singleton, sau đó chỉ cần gọi Game :: GetInstance() mà sẽ trả về một con trỏ đến lớp toàn cầu.

Theo như các hạt, cách tôi luôn xử lý trò chơi là tạo một lớp quản lý tất cả các đối tượng. Trong vòng lặp chính của trò chơi của tôi, tôi sẽ gọi hàm lớp UpdateObjects đó sẽ đi qua một danh sách các mục mà nó đã lưu trữ và gọi từng hàm Cập nhật. Điều tương tự với Render và Collision.

2

Tôi đã sửa đổi với thiết kế trò chơi trong quá khứ, nhưng tôi không thể khẳng định là chuyên gia.

Đối với việc tiếp cận một đối tượng trên toàn cầu, tôi sẽ đề nghị sử dụng một singleton

cho các đối tượng di chuyển, tôi sẽ đề nghị làm tất cả mọi thứ một lớp cha mẹ mà hiểu được vị trí màn hình và có một phương pháp cập nhật. Bất cứ khi nào một đối tượng mới được tạo ra, thêm nó vào một vectơ chứa tất cả các đối tượng, một lần trên mỗi khung hình, bạn bước qua vectơ và chạy cập nhật trên tất cả các đối tượng.

2

Đối tượng đại diện cho thư viện trò chơi của tôi là hiện toàn cầu (Tôi biết globals thường xấu) vì nhiều đối tượng có thể dựa vào nó ở đây và ở đó cho những thứ như tải nghệ thuật của họ hoặc âm nhạc.Cách tốt nhất để đi về việc kéo đối tượng đó ra khỏi phạm vi toàn cầu là gì, mà không phải vượt qua năm mươi thông số cho mọi thứ có thể là nếu không thì hãy sử dụng nó trực tiếp?

Tôi đồng ý với giải pháp singleton nói trên.

Câu hỏi tiếp theo: Như chúng ta đã biết, Mega Man bắn rất nhiều ít màu trắng projectiles. Hiện nay, đối tượng Player chịu trách nhiệm về đối tượng Projectile anh bắn, cập nhật vị trí của họ và như vậy (theo nghĩa đen, gọi Projectile :: Cập nhật() phương pháp một lần cho mỗi cảnh quay, bên trong chơi :: Cập nhật() phương pháp).

Có nguyên tắc thiết kế nhanh để xây dựng mã được gọi là: "Nguyên tắc chịu trách nhiệm duy nhất". Theo nó "KHÔNG CÓ BAO GIỜ NÀO MỌI MỘT MỌI LẠI CHO MỘT SỐ LỚP ĐỂ THAY ĐỔI". Vì vậy, tôi đoán tôi sẽ bắt đầu với việc phân tách trách nhiệm của lớp Người chơi thành các lớp riêng biệt: ví dụ: một cho vị trí và một cho bắn.

Xem ví dụ và nhiều hơn nữa về chủ đề SRP

+0

Ai đã viết rằng bài viết SRP? Tôi đã cố gắng để tìm cuốn sách đó vì nó là một chủ đề mà tôi thực sự quan tâm, bạn có thể chỉ cho tôi về điều đó không? – Goles

+0

Lần đầu tiên tôi bắt gặp thuật ngữ này trong khi đọc cuốn sách "Phát triển phần mềm nhanh nhẹn: Nguyên tắc, mẫu và thực tiễn". Bởi Robert C. Martin (2002). Martin là người sáng lập và chủ tịch của Object Mentor (trang web nơi bài viết được đăng). – Harry

Các vấn đề liên quan