2013-10-15 18 views
9

Tôi đang viết trò chơi bomberman bằng Java và tôi đã viết mã cho bản đồ trò chơi (có chứa ô xếp), người chơi (và chuyển động của họ trên bản đồ) và bây giờ tôi bị kẹt trong mã cho vụ nổ bom.Vụ nổ bom trên trò chơi Bomberman

Tôi có một lớp Map chứa một mảng 2ngày của , có thể chứa Player s, Block s và Bomb s. Đối tượng Player có phương thức dropBomb gọi phương thức receiveBomb từ đối tượng Map (mỗi Player có tham chiếu đối tượng Map) với vị trí của bom và bom. Khi gọi phương thức MapreceiveBomb, bản đồ đặt quả bom vào đúng Tile. Vấn đề của tôi là trong vụ nổ bom. Ai nên quan tâm đến nó? Bản thân quả bom? Nếu có, liệu quả bom có ​​tham chiếu cho Tile có chứa nó không? Cho đến bây giờ ngói của tôi không cần tham chiếu Map. Một trong những khả năng mà tôi nghĩ là có tham chiếu Tile bên trong đối tượng Bomb, vì vậy, khi quả bom phát nổ (và quả bom biết khi nào nên phát nổ), nó gọi phương thức trong đối tượng ngói cho vụ nổ và ô xếp gọi một phương thức trên bản đồ. Nhân tiện, tôi không biết đây là một ý hay. Tôi nên làm gì?

public class Tile { 

private boolean available; //if the tile is not occupied by a indestructible block or bomb 
private List<Entity> entities; //you can have more than one player at a tile 
public boolean receiveEntity(Entity entity) { 
    boolean received = false; 
    if (available) { 
     this.entities.add(entity); 
     received = true; 
     if (entity instanceof Block || entity instanceof Bomb) { 
      available = false; 
     } 
    } 
    return received;   
} 

public boolean removePlayer(Player player) { 
    return entities.remove(player); 
} 
} 

lớp Player:

public class Player implements Entity { 

private Map gameMap; 
private int posX; 
private int posY; 
private int explosionRange; //the explosion range for bombs 
public Player(int posX, int posY, Map gameMap) { 
    this.gameMap = gameMap; 
    this.posX = posX; 
    this.posY = posY; 
    this.explosionRange = 1; 
} 

public void dropBomb() { 
    gameMap.receiveBomb(new Bomb(explosionRange), posX, posY); 
} 
} 

Bản đồ lớp:

public class Map { 

private Grid<Tile> tileGrid; 
private int width; 
private int height; 

public Map(int width, int height, BuildingStrategy buildingStrategy) { 
    this.width = width; 
    this.height = height; 
    this.tileGrid = new Grid<Tile>(width, height); 
    buildingStrategy.buildMap(this); 
} 
public void receiveBomb(Bomb bomb, int posX, int posY) { 
    tileGrid.get(posX, posY).receiveEntity(bomb); 
} 
} 

tôi đã bỏ qua những phương pháp phong trào, bởi vì phong trào là đã tốt.

Trả lời

2

Tôi luôn học và sống theo quy tắc "bảng tự vẽ". Họa sĩ có thể chọn màu sắc và gọi phương thức, sàn có thể quyết định cách rò rỉ và splatter được hiển thị, nhưng bảng tự vẽ.

Quay lại vấn đề của bạn: quả bom tự phát nổ. Bằng cách này bạn có thể có những hiệu ứng khác nhau của những quả bom khác nhau. Quả bom có ​​tác dụng trên gạch, và gạch phản ứng với nó.

Ví dụ: Quả bom có ​​lực và loại vụ nổ. Quả bom, (chỉ chiếm một và một viên gạch mà tôi nghĩ?) Sẽ 'cho' nó có hiệu lực đối với một viên gạch.

Bây giờ, đó là ô xếp liên quan đến phân phối lực này. Cho phép nói rằng bạn có một số loại bom, một sức mạnh (cho phép nói một số từ 1 đến 10), và hai loại (cho phép nói bình thường, gây cháy, đóng băng).

Bây giờ quả bom của bạn phát nổ và vì hình đại diện của bạn là một pháp sư cấp 5, bom của bạn có sức mạnh 4 và loại gây cháy. Vì vậy, bạn nói với ngói của bạn: Tôi phát nổ với sức mạnh 4 và tôi đang đốt cháy bạn!

Bây giờ ô có sẵn để phát. Bất kỳ gạch nào bị 'chạm' bởi lực nổ cần phải gọi đó là chức năng "Phát nổ" để làm việc. Nếu nó cũng đang cháy, có nhiều việc phải làm trong chức năng "onFire"

Gạch nào được 'phát nổ' có hiệu lực. Những viên gạch bình thường với lực 4 sẽ tạo ra sự xúc động cho tất cả các ô vuông trong phạm vi 4, nhưng nếu nó là một gạch đặc biệt (nó biết rằng từ chính nó), giống như một viên gạch núi, nó có thể không thể tiến lên với lực đó.

Ngói 1 phát nổ với 4 và đưa nó vào các ô liền kề với lực 3. Một trong những ô đó có thể là một bức tường, do đó không làm gì thêm nữa. Khác là một gạch bình thường, và phát nổ, và tiếp tục cho nó về phía trước với lực lượng 2, vv Nếu nó là một 'nước' gạch, vụ nổ được đẩy ofrward, nhưng lửa không phải là, vv

như vậy:

  • bom phát nổ chính nó và cung cấp cho các cuộc gọi chức năng gạch nổ
  • ngói được phát nổ và đẩy nổ về phía trước theo ngói kiểu.
  • các ô tiếp theo phát nổ vì điều này.

Cuối cùng, có vẻ như hầu hết công việc được thực hiện bởi các ô và điều này thậm chí có thể xảy ra. nhưng các bước đầu tiên: việc tính toán lực, loại và các cuộc gọi đầu tiên là từ quả bom. Quả bom phát nổ. Và sau đó vụ nổ có ảnh hưởng đến gạch. Ngói xử lý và nếu cần thiết sẽ truyền nó.

+0

Nếu bom có ​​tham chiếu cho ô xếp? Ngoài ra, tôi nên xem xét để sử dụng tham chiếu của gạch liền kề cho mỗi ngói thay vì một mảng 2d? –

+0

Một quả bom được đặt trên một viên gạch và nên biết nó nằm trên gạch, vì vậy có, nó có một tham chiếu dạng gạch. Một gạch nên được biết bằng cách liên kết (không chắc chắn bạn cần nó) hoặc bằng cách 'tính toán' những gì gạch liền kề – Nanne

0

Bản đồ của bạn phải chịu trách nhiệm về vụ nổ, vì nó là đối với mọi ô xếp khác trên bản đồ. Xét cho cùng, vụ nổ là gì nếu không cho một loại gạch khác biến mất sau vài giây?

Khi vòng lặp trò chơi của bạn gọi phương thức cập nhật trên Bản đồ phản đối bản đồ của bạn nên tìm ra:

  • ngói gì là quả bom trên
  • Hỏi bom bao xa tầm với là
  • Hình ra những gì trong các ô liền kề mà quả bom có ​​thể đạt tới

Hãy nghĩ về thiết kế của bạn như một loạt sự kiện, được quan tâm từng người một trong vòng trò chơi trước khi được vẽ. Khi quả bom của bạn bị rơi, nó sẽ làm tăng sự kiện lên Bản đồ theo dạng recieveBomb() với Bản đồ là bộ điều khiển sự kiện.

Tôi tin câu hỏi này phù hợp hơn với định dạng thảo luận chứ không phải định dạng Q &. Thật khó để nói cho bạn biết "thiết kế chính xác" là gì nếu không hiểu kiến ​​trúc tổng thể.

+0

Tôi không đồng ý với bước thứ hai của bạn 'hỏi quả bom cách xa tầm với '. Quả bom sẽ quyết định phát nổ (mabye đó là một quả bom hẹn giờ? Chỉ có quả bom nên 'biết' điều đó. Khi quả bom quyết định nổ tung, nó tạo ra một số hiệu ứng cho gạch, và sau đó gạch có thể quyết định liệu nó có tiếp tục lực đó ở đâu đó không. – Nanne

+0

Đúng, nhưng trong bomberman, mỗi người chơi có powerups xác định tầm xa của quả bom của họ, do đó hoàn toàn phải được xác định bởi quả bom do người chơi tạo ra. Bản đồ cần phải biết về phạm vi tiếp cận để tìm ra số lượng các ô liền kề trên các dòng X, Y để đánh dấu là bùng nổ. – Mataniko

+0

bạn có thể vượt qua phạm vi tiếp cận với ô xếp, thay vì yêu cầu. một sự khác biệt nhỏ có thể, nhưng nó là loại thingy questoin này yêu cầu cho tôi nghĩ. – Nanne

0

Bản đồ phải là người chịu trách nhiệm xử lý vụ nổ bom.

Tôi sẽ đề xuất có một hàng đợi trong Bản đồ, chứa tất cả các quả bom hiện diện. Ngoài ra, bom của bạn nên có một bộ đếm thời gian (ví dụ, CreationTime) để khi các quả bom bị đẩy vào hàng đợi, bạn kiểm tra từng quả bom trong hàng đợi xem chúng đã ở trong bao lâu và nếu có "nổ tung" chúng.

Thêm một hàm ExplodeBomb trong Bản đồ kiểm tra tất cả 4 hướng và xử lý các ô tương ứng.

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