2009-07-17 43 views
6

Tôi đang lập trình một trò chơi đơn giản trong Java nhưng tôi đang cố gắng làm điều đó 'đúng' với thiết kế sạch đẹp và không có hack.Câu hỏi thiết kế trò chơi OO

Tôi có hai lớp GamePanel nhận các nhấp chuột và nhấn phím và Model chứa tất cả các thực thể và chịu trách nhiệm về các cập nhật của chúng. Mô hình cần phải biết con chuột của người dùng ở đâu nhưng tôi không thể quyết định cách 'đúng' để thực hiện điều đó.

Nếu Model và mọi Entity trong vòng giữ tham chiếu đến GamePanel hoặc chỉ lưu vào bộ nhớ cache vị trí cuối cùng đã biết và nhận cập nhật từ GamePanel thường xuyên. Với tùy chọn đầu tiên khi mô hình được tạo, nó sẽ cần phải được tham chiếu đến GamePanel và với vị trí thứ hai, vị trí chuột cuối cùng sẽ được gửi dưới dạng tham số cho phương thức World.update().

Không có giải pháp nào trong số này có vẻ thanh lịch vì vậy tôi đã tự hỏi liệu có cách 'đúng' để làm điều này mà tôi đã bỏ lỡ hay không.

Xin cảm ơn, Ben.

+0

Câu hỏi hay, +1. –

+0

Vì vậy, tôi cho rằng sự đồng thuận là nếu thỉnh thoảng vị trí chuột chỉ cần sử dụng Người quan sát hoặc Người nghe sự kiện và nếu vị trí chuột là cần thiết trong phần lớn các bản cập nhật, hãy cho mô hình tham chiếu đến bảng điều khiển để nó có thể thăm dò ý kiến ​​đó? –

Trả lời

3

Theo ý kiến ​​của tôi, điều đó phụ thuộc vào cách các lớp học của bạn tương tác. Sự thay đổi ở vị trí chuột có kích hoạt các thực thể trong lớp Model không? hoặc là lớp Mô hình độc lập với GamePanel và chỉ hoạt động trên các giá trị hiện tại của vị trí Chuột?

Nếu sau đó và trong trường hợp đó, tôi đồng ý với những gì jeff đã nói trước tôi. Vượt qua một xử lý trên GamePanel đến lớp Model khi tạo nó và cho phép mọi thực thể sử dụng handle để truy cập vị trí chuột bất cứ khi nào cần thiết. Bằng cách đó, vị trí chuột được cập nhật luôn được sử dụng.

Nếu trước đây tôi khuyên bạn nên sử dụng Người quan sát để cho lớp Mô hình biết khi nào giá trị vị trí chuột đã thay đổi. Sau đó, lớp Model có thể sử dụng cùng một thiết kế (ví dụ để cho lớp Model có một handle trên lớp GamePanel luôn) và truy cập các giá trị hiện tại trong GamePanel. Để tổng hợp câu trả lời cho câu hỏi của bạn, tôi nghĩ nó chỉ hợp lý và phù hợp với các khái niệm OO để cho GamePanel giữ các giá trị của vị trí chuột và cho phép các lớp khác truy cập thông tin đó bằng cách sử dụng cá thể GamePanel.

Cảm ơn, Rohan.

2

Bạn luôn có thể có tọa độ hiện tại là tài sản công cộng của GamePanel, để các Đối tượng/Mô hình có thể truy cập đơn giản từ đó.

1

Nếu bạn muốn thăm dò ý kiến ​​các vị trí chuột hiện tại, bạn có thể chạy snipplet mã này trong các sự kiện văn Chủ đề bất cứ lúc nào bạn muốn:

Point pt = MouseInfo.getPointerInfo().getLocation(); 
Point cpt = GamePanel.getLocationOnScreen(); 
Point rel = new Point(pt.x - cpt.x, pt.y - cpt.y); 

rel chứa các vị trí tương đối của chuột.

Hoặc, bạn có thể xem JInput vì thiết bị được thiết kế để đối phó với bàn phím/chuột/bất kỳ đầu vào nào.

+0

MouseInfo từ 1.5 – akarnokd

3

Một giải pháp phổ biến là kích hoạt sự kiện. Trong trường hợp này GamePanel sẽ kích hoạt một sự kiện thông báo tất cả các đối tượng quan tâm (được đăng ký với sự kiện) (Entity) trong Model của mouseposition mới.

Bằng cách này, GamePanel không cần phải biết rõ ràng các thực thể nào cần thông báo, và các thực thể không cần giữ một thể hiện của GamePanel xung quanh.

Lời khuyên của tôi: đọc trên trình xử lý sự kiện. (Java.util)

+0

Bạn có ý nghĩa gì với Java.util? Các sự kiện và trình nghe của chuột nằm trong gói java.awt.event. – akarnokd

+1

Cả hai đều chính xác. Java.awt.event.MouseListener mở rộng java.util.EventListener (http://java.sun.com/javase/6/docs/api/java/util/EventListener.html). – Nelson

+0

Tôi tưởng tượng rằng OP không sử dụng awt hoặc swing, vì vậy tôi đã chỉ cho anh ta sử dụng. – NomeN

1

Mô hình có luôn luôn cần phải biết con chuột ở đâu. IE: Bạn có cần vị trí chuột ở mọi bản cập nhật hay chỉ tại một điểm cụ thể.

Nếu bạn cần nó ở mọi thời điểm hoặc trong mỗi lần cập nhật thì giải pháp mà bạn đã lập tài liệu hoặc bất kỳ giải pháp nào ở đây phải chắc chắn.

Nếu bạn chỉ cần nó tại các điểm cụ thể thì chỉ lấy nó sau đó. (IE: nếu trò chơi của bạn phản ứng với các cú click chuột thì hãy làm một cái gì đó khi nhấp chuột.) Ý nghĩa Đọc về Trình nghe sự kiện.

Chúc may mắn! Hy vọng rằng sẽ giúp.

+0

Có một trường hợp bạn có thể sử dụng cách tiếp cận dựa trên cuộc thăm dò ý kiến ​​- nếu bạn không muốn chống lại sự kiện kéo chuột khi 'kéo' chuột xung quanh (ví dụ: quay và xoay) – akarnokd

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