2010-10-20 80 views
5

Giáo sư của tôi đã giao bài tập của tôi hôm nay dựa trên lập trình hướng đối tượng trong Pygame. Về cơ bản, anh ấy đã nói rằng trò chơi mà chúng ta sẽ tạo ra sẽ bị vô hiệu trong vòng lặp trò chơi chính. Trong khi tôi tin rằng nó có thể làm điều này (và this question đã nói rằng nó là có thể) Tôi không tin rằng điều này là cần thiết để tuân thủ các mô hình hướng đối tượng.Lập trình trò chơi mà không có vòng lặp chính

Trong sơ đồ mà giáo sư đưa ra, ông đã cho thấy trò chơi khởi tạo và khi các đối tượng được khởi tạo, luồng điều khiển của chương trình sẽ được phân phối giữa các đối tượng.

Về cơ bản tôi tin rằng nó sẽ có thể thực hiện một trò chơi theo cách này, nhưng nó sẽ không phải là một cách lý tưởng cũng không phải là cần thiết cho sự tuân thủ hướng đối tượng. Có suy nghĩ gì không?

EDIT: Chúng tôi đang tạo một bản sao tiểu hành tinh, điều mà tôi tin rằng sẽ làm phức tạp thêm nhiều thứ do thực tế là trò chơi hành động theo thời gian thực.

+0

Hm, trong khi tôi thấy cách này có thể hoạt động, tôi chỉ không thể thấy nó sẽ hoạt động tốt như thế nào khi có rất nhiều và rất nhiều tiểu hành tinh. Cái nào sẽ kiểm tra va chạm? Mỗi người một mình? Sau đó, cái nào sẽ cập nhật quadtree để tránh kiểm tra va chạm không cần thiết? Và việc các thực thể thao túng một số loại trạng thái toàn cầu không phải là lựa chọn thiết kế tốt nhất hoặc là IMO. –

Trả lời

7

Bật trò chơi dựa trên hoặc bất kỳ sự kiện nào được điều khiển sẽ là tuyến đường để đi. Nói cách khác, hãy sử dụng các ứng dụng GUI trên máy tính để bàn. Họ sẽ chỉ đánh dấu (chờ) cho đến khi một sự kiện được kích hoạt. Điều tương tự cũng có thể được thực hiện cho một trò chơi đơn giản. Lấy Checkers chẳng hạn. Vòng lặp mỗi chu kỳ trò chơi sẽ là quá mức cần thiết. 90% thời gian trò chơi sẽ tĩnh. Sử dụng một số dạng sự kiện (mẫu observer design sẽ tốt đẹp ở đây) sẽ cung cấp một giải pháp tốt hơn nhiều. Bạn đang sử dụng Pygame, vì vậy có thể có hỗ trợ cho điều này được xây dựng trong, thông qua do sử dụng hạn chế của tôi tôi không thể bình luận đầy đủ. Dù bằng cách nào, các nguyên tắc chung đều giống nhau.

Tất cả trong tất cả, đó là một bài tập khá hay nếu bạn hỏi tôi. Nếu nó dạy bạn lập trình hướng sự kiện, một ứng dụng GUI đơn giản sẽ tốt hơn. Ngay cả những trò chơi đơn giản nhất chúng tôi là một vòng lặp trò chơi cơ bản, có thể tuân thủ các nguyên tắc OO.

+0

Cảm ơn, đó là những gì tôi đã suy nghĩ cơ bản. Cảm ơn ý tưởng thiết kế quan sát, hãy sử dụng nó. – emberv3

+0

@ emberv3 bạn được chào đón. – Finglas

0

Tôi nghĩ rằng nó có thể đủ điều kiện làm lập trình hướng sự kiện? Mà vẫn có thể được hướng đối tượng. Bạn thấy điều này trong Flash rất nhiều.

Có sự khác biệt giữa vòng lặp chính trong lớp chính. Bạn vẫn có thể có một lớp trò chơi khởi tạo tất cả các đối tượng của bạn, và sau đó dựa vào đầu vào để di chuyển trò chơi trở đi.

Rất khó để nói chính xác mà không biết các thông số chính xác của bài tập của bạn, ma quỷ có trong các chi tiết.

2

Hmm. Trong trường hợp chung, tôi nghĩ ý tưởng này có lẽ là hokum. SDL (khi PyGame được triển khai), cung cấp thông tin cho chương trình thông qua hàng đợi sự kiện và tiêu thụ hàng đợi đó đòi hỏi phải kiểm tra hàng đợi cho các sự kiện, xử lý chúng và đợi cho đến khi sự kiện tiếp theo đến.

Tuy nhiên, có một số ngoại lệ cụ thể. Bạn có thể thăm dò ý kiến ​​của chuột và bàn phím cho trạng thái của chúng mà không cần truy cập hàng đợi sự kiện. Vấn đề với nó là nó vẫn đòi hỏi một cái gì đó giống như một vòng lặp, do đó nó sẽ xảy ra hơn và hơn nữa cho đến khi trò chơi thoát. Bạn có thể sử dụng pygame.time để chờ trên bộ đếm thời gian thay vì đợi trên hàng đợi sự kiện và sau đó chuyển quyền kiểm soát đối tượng trò chơi thăm dò ý kiến ​​của chuột và bàn phím như trên, nhưng bạn vẫn đang 'lặp' nhưng bị ràng buộc bởi một bộ đếm thời gian thay vì hàng đợi sự kiện.

Thay vì tập trung vào việc loại bỏ vòng lặp chính, thay vào đó hãy nghĩ về việc sử dụng nó theo cách hướng đối tượng.Ví dụ, bạn có thể yêu cầu đối tượng 'root', thực tế có vòng lặp sự kiện riêng, nhưng thay vì thực hiện bất kỳ hành động nào dựa trên các sự kiện đến, nó gọi một trình xử lý trên một số đối tượng con. Ví dụ khi đối tượng gốc nhận được sự kiện pygame.event.MOUSEBUTTONDOWN, nó có thể tìm kiếm thông qua đó là trẻ em cho thuộc tính 'rect' và xác định xem thuộc tính event.pos có nằm trong rect đó hay không. nếu nó là nó có thể gọi một phương pháp onClick giả định trên đối tượng con đó.

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