2009-03-07 7 views
8

Vì vậy, tôi đang xây dựng trò chơi pacman trong Java để tự học lập trình trò chơi.Mê cung Pacman trong Java

Tôi có cửa sổ trò chơi cơ bản với hình ảnh pacman sprite và hình nhân ảo vẽ, pacman di chuyển bằng các phím mũi tên, không di chuyển ra ngoài tường của cửa sổ, v.v. Bây giờ tôi đang cố gắng xây dựng mê cung , như trong bức tranh này:

Pacman maze

Nếu không đem lại cho tôi những giải pháp/hoàn chỉnh trực tiếp vào đó, ai đó có thể hướng dẫn cho tôi như thế nào điều này có thể được xây dựng? Tôi chỉ nói về ranh giới và các đường ống ('T') ở đây mà bạn không thể đi qua và bạn phải đi xung quanh. Không phải những dấu chấm mà pacman ăn.

Đây là câu hỏi của tôi:

1) Thuật toán/phương pháp hiệu quả nhất để tạo mê cung này là gì? Nó sẽ phải được rút ra mỗi khi phương thức paint() được gọi hoặc có cách nào để vẽ nó chỉ khi bắt đầu trò chơi và không bao giờ một lần nữa?

2) Điều này thực sự sẽ được vẽ như thế nào? Tôi giả sử fillRect() sẽ được sử dụng?

3) Bất kỳ gợi ý nào về phát hiện xung đột (vì vậy các pacman/ghost không thể đi qua các bức tường) sẽ hữu ích.

4) Bất kỳ gợi ý nào về khoảng trống giữa các đường ống sẽ được tính toán sao cho các dấu chấm có thể được lấp đầy giữa chúng cũng sẽ rất hữu ích.

Cảm ơn

Trả lời

9

Tôi sẽ không làm theo cách đó.

Tôi muốn vẽ bản đồ đồ họa và sau đó tạo một mảng dữ liệu 2D đại diện cho bản đồ. Bản đồ dữ liệu sẽ chịu trách nhiệm xác định va chạm, ăn chấm, nơi có kẹo và nơi có bóng ma. Một khi tất cả các logic cho tất cả mọi thứ được xử lý chỉ cần sử dụng mảng 2D để hiển thị tất cả mọi thứ trong tọa độ pixel thích hợp của họ trên bản đồ đồ họa.

Ví dụ: người dùng đang nhấn phím bên trái. Trước tiên, bạn xác định rằng pacman là ở phần tử 3, 3. Phần tử 3, 2 chứa thông tin biểu thị một bức tường để bạn có thể thực hiện mã để làm cho anh ta bỏ qua lệnh.

EDIT:

Mỗi phần tử sẽ đại diện cho vị trí của dấu chấm. Ví dụ:

Không, nhìn vào bảng tôi sẽ nói mảng sẽ trông giống như thế này.

d,d,d,d,d,d,d,d,d,d,d,d,w,w,d,d,d,d,d,d,d,d,d,d,d,d 
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d 
p,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,p  
d,w,w,w,w,d,w,w,w,w,w,d,w,w,d,w,w,w,w,w,d,w,w,w,w,d  
d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d,d 

Và cứ tiếp tục như vậy. Bạn có thể muốn chọn một cấu trúc dữ liệu linh hoạt hơn so với các ký tự chỉ vì một số khu vực cần chứa một loạt các thông tin khác nhau. IE mặc dù khu vực sinh sản ma là trống, pacman không được phép ở đó. Sự chuyển động của bóng ma và pacman là khác nhau đối với các bên thoát, điểm đẻ trứng kẹo là một điểm trống nhưng nếu bạn muốn vẫn linh hoạt, bạn sẽ muốn biểu thị nơi đây là trên một cơ sở cho mỗi bản đồ. Một điều khác bạn sẽ muốn nhớ là pacman và bóng ma thường ở giữa các điểm vì vậy có chứa thông tin đại diện cho một tỷ lệ phần trăm của một không gian họ đang chiếm giữa 1,2 và 1,3 là rất quan trọng để phát hiện va chạm cũng như xác định khi nào bạn muốn xóa dấu chấm, tăng sức mạnh và kẹo khỏi bảng.

+0

Mảng này đại diện cho bản đồ như thế nào? Như trong một điểm ảnh để đại diện pixel? –

+0

Đã chỉnh sửa. Xem ở trên. –

+0

Cảm ơn. Vì vậy, nếu tôi muốn di chuyển pacman đến vị trí 100 x, 50 y, làm thế nào tôi có thể thiết lập điều đó trong bản đồ để cho thấy rằng vị trí đó bị chiếm đóng? bất kỳ mã nào cho điều đó? –

2
  1. Bạn có thể vẽ bản đồ vào BufferedImage và chỉ drawImage trên mọi sơn(). Bạn sẽ nhận được hiệu suất khá hợp lý theo cách này.

  2. Nếu bạn hài lòng với những bức tường chắc chắn, bạn có thể vẽ từng khối tường vuông với fillRect. Nếu bạn muốn nhìn giống như trong hình, bạn cần tìm cách vẽ các đường thẳng và sử dụng các cung tròn cho các góc.

  3. Bản đồ trò chơi Pacman được tạo thành từ hình vuông và Pacman và các bóng ma luôn di chuyển từ một ô vuông sang quảng trường lân cận trong một bước hoạt hình (tức là bạn nhấn phải, pacman di chuyển một ô vuông sang bên phải). Điều đó có nghĩa là phát hiện va chạm rất dễ dàng: chỉ đơn giản là không cho phép di chuyển đến các ô vuông không trống.

  4. Tôi không hiểu bạn đang cố hỏi gì ở đây.

+0

Bởi một hình vuông, bạn có nghĩa là một pixel/x, y phối hợp hoặc một khối 10 pixel là một hình vuông? –

+0

Tôi có nghĩa là một khối pixel. Spencer Ruport đang nói về cùng một điều. – TrayMan

2

1) Chỉ cần đưa ra lời khuyên của tôi về vẽ lại. Một cái gì đó mà bạn có thể làm nếu bạn tìm thấy vẽ lại toàn bộ hình ảnh là chậm, là xác định chỉ các yếu tố đã thay đổi trên màn hình và vẽ lại những người. Một cách tiếp cận cho điều này sẽ là như sau: Xác định các sprites đã di chuyển. Xác định (gần đúng) một hình chữ nhật xung quanh các sprites. Vẽ lại các hình chữ nhật đó. Bằng cách này, bạn chỉ làm mới các phần của màn hình chứ không phải toàn bộ màn hình. Điều này sẽ dẫn đến tăng hiệu suất khi vẽ lại toàn bộ màn hình.

Các câu trả lời khác phù hợp cho các câu hỏi khác mà bạn đã hỏi.

7

Dưới đây là một gợi ý dành cho bạn:

alt text http://www.freeimagehosting.net/uploads/66e4131f59.jpg

gợi ý này, sử dụng đúng cách, sẽ cho phép bạn xử lý render và phát hiện va chạm, và cũng sẽ cho phép bạn để đại diện cho mê cung trong một thời trang nhỏ gọn.

+0

Vui lòng cung cấp một số chi tiết về việc thực hiện gợi ý này (ví dụ: bản đồ dựa trên bản đồ)! –

+0

Có nhiều cách khác nhau để thực hiện. Cách tiếp cận ban đầu của tôi sẽ dựa trên thực tế là mê cung Pac-Man không bao giờ thay đổi. Với giả định đó, bạn có thể chỉ đơn giản là đại diện cho mê cung như một lưới 28 x 31 của 0 và 1. Sau đó, chỉ cần sử dụng một bitmap cho mê cung thực tế thay vì tạo ra nó từ lưới điện. –

+0

... 0 và 1 đại diện cho sự hiện diện hoặc vắng mặt của bức tường.Điểm của đại diện đó là hỗ trợ phát hiện xung đột với các bức tường. Điểm của bitmap chỉ là hiển thị. Cách tiếp cận này yêu cầu giữ đồng bộ lưới và bitmap theo cách thủ công. –