Bomberman nhân bản, làm thế nào để làm bom?


8

Tôi đang chơi xung quanh với một kẻ đánh bom nhân bản để học phát triển trò chơi.

Cho đến nay tôi đã thực hiện gạch, di chuyển, phát hiện va chạm và nhận vật phẩm. Tôi cũng có chế độ ném bom giả (chỉ là đồ họa và va chạm, không có chức năng thực sự).

Tôi đã tạo một jsFiddle của trò chơi với chức năng tôi hiện có. Các mã trong fiddle là rất xấu mặc dù. Cuộn qua bản đồ và bạn tìm thấy cách tôi đặt bom.

Dù sao, những gì tôi muốn làm là một đối tượng, có thông tin chung về bom như:

function Bomb(){
  this.radius = player.bombRadius;
  this.placeBomb = function (){
    if(player.bombs != 0){
      // place bomb
    }
  }
  this.explosion = function (){
  // Explosion
  }
}

Tôi thực sự không biết làm thế nào để phù hợp với nó vào mã. Mỗi khi tôi đặt bom, tôi làm var bomb = new Bomb();hay tôi cần liên tục có nó trong kịch bản để có thể truy cập nó.

Làm thế nào để quả bom gây thiệt hại? Có đơn giản như làm X, Y theo mọi hướng cho đến khi bán kính hết hoặc đối tượng dừng nó không? Tôi có thể sử dụng cái gì đó như setTimeout (bomb.explumping, 3000) làm bộ đếm thời gian không?

Bất kỳ trợ giúp đều được đánh giá cao, có thể là một lời giải thích đơn giản về lý thuyết hoặc ví dụ mã dựa trên câu đố. Khi tôi thử cách đối tượng, nó phá mã.

Cập nhật: Bây giờ tôi đặt bom, và sau một khoảng thời gian nhất định xóa nó tùy thuộc vào vị trí tôi đặt nó. Nhưng nếu tôi đặt một quả bom trước khi quả bom đầu tiên phát nổ thì nó chỉ xóa một trong số chúng (rõ ràng vì bomX và bom đã thay đổi kể từ khi quả bom đầu tiên được đặt).

Bây giờ tôi cần biết làm thế nào để khắc phục vấn đề này, có thể tạo ra một mảng mới với tất cả các vị trí bom? Cách tốt nhất để làm điều này là gì?

Mã hiện tại:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        bombX = player.X; bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
}
function explode(){
    alert('BOOM!');
    delete map[bombY][bombX].object;
    player.bombs++;
}

1
jsFiddle + Fireorms -> công cụ tạo mẫu trò chơi? Chưa bao giờ nghĩ về điều đó. +1 cho thổi tâm trí của tôi rất dễ chịu! :)
Anko

Câu trả lời:


6

Trông nó không tệ lắm, nhưng bạn cần kiểm soát thời gian và đầu vào tốt hơn. Vì tốc độ di chuyển phụ thuộc vào cài đặt lặp lại phím trên máy người dùng, điều đó không chính xác tối ưu.

Thay vào đó, bạn nên theo dõi những phím nào hiện đang được giữ, bạn có thể làm điều này như (trong mã giả):

keyisdown=false
keydown event{
    if(!keyisdown){
        //This is the 'real' keydown event, the one that only happens the moment the
        //key is pressed down. You may not need it, but this is how you construct it.
    }
    keyisdown=true
}

keyup event{
    keyisdown=false
}

Và sau đó, trong chức năng cập nhật của bạn, bạn di chuyển trình phát nếu keyisdownvà có thể bạn áp dụng một số điều kiện khác, như trình phát không thể di chuyển nếu anh ta di chuyển ít hơn một số cập nhật trước đây.

Giữ một bộ đếm cập nhật hoặc một số cách khác để theo dõi thời gian để mã của bạn luôn biết chính xác mức độ tiến bộ của nó.

Đà bom
Cá nhân tôi muốn giữ nó đơn giản, bạn không thực sự cần phải sử dụng this, newvà tất cả những thứ lạ mắt khác trong JavaScript để làm cho đối tượng hữu ích.

Bạn có thể làm một cái gì đó như:

bombobject = {} //That is all it takes to make an object.
bombobject.blowtime = currenttime + delay
bombobject.position = mapobject
mapobject.bomb = bombobject

Sau đó, bạn có thể quay vòng qua bản đồ trên mỗi bản cập nhật, kiểm tra xem có bom không và nếu đến lúc phải thổi, nếu vậy hãy thổi và loại bỏ vật thể bom.

Bugtracking
Mã của bạn bị rò rỉ lỗi, chúng khá đơn giản, nhưng nếu bạn không tìm hiểu về chúng và xử lý chúng, bạn sẽ gặp vấn đề sau này. Mỗi trình duyệt hiện đại đều có bảng điều khiển dành cho nhà phát triển bản sao Fireorms. Mở nó, nhìn vào tab bảng điều khiển kịch bản, xem tất cả các văn bản màu đỏ khó chịu và sửa nó.

Chỉnh sửa: Mối quan tâm về chấm công
Chỉ dành cho bản ghi, bạn có thể muốn một cái gì đó nâng cao hơn một chút so setIntervalvới thời gian, nếu bạn nghiêm túc, bạn thực sự cần phải điều chỉnh mã của mình theo thời gian. Xem câu trả lời Stack Overflow đầu tiên của tôi để biết mô tả gần đúng về vấn đề: https://stackoverflow.com/a/2549426/305545

Chỉnh sửa: đã sửa lỗi phiên bản setTimeOut
Vì bạn đang sử dụng cùng một biến cho các loại bom khác nhau, bạn sẽ ghi đè lên chúng bất cứ khi nào đặt bom mới. Bạn có thể sử dụng một bao đóng để tạo các biến riêng lẻ cho mỗi quả bom, như vậy:

function placeBomb(){
    if(placebomb && player.bombs != 0){
        map[player.Y][player.X].object = 2;
        var bombX = player.X;
        var bombY = player.Y;
        placebomb = false;
        player.bombs--;
        setTimeout(explode, 3000);
    }
    function explode(){
        alert('BOOM!');
        delete map[bombY][bombX].object;
        player.bombs++;
    }
}

Bây giờ bombX, bombYcác biến và explodehàm là cục bộ của bao đóng được tạo bởi placeBombs, do đó, nó là thể hiện cục bộ của explodenó được gắn vào thời gian chờ và nó đọc các biến cục bộ. Mỗi khi bạn gọi placeBombmột đóng cửa mới được tạo ra.

Tôi sẽ không sử dụng setTimeout cho việc này, tôi sẽ đếm các bản cập nhật, do đó đảm bảo số lần cập nhật cố định trước khi bom nổ, nhưng tôi đoán điều này sẽ hoạt động tốt.


Vâng, fiddle không phải là mã giống như game.js của tôi, một số bản sao dán và chỉ nhồi vào ngẫu nhiên. Mã thực không đưa ra bất kỳ lỗi nào trong các công cụ phát triển firebird hoặc chromes. Tôi sẽ cố gắng để quả bom của bạn hoạt động. Cảm ơn. :)
justanotherhulkist 22/03 '

Thực sự, không có lỗi? Nếu bạn cố gắng di chuyển khỏi bản đồ?
aaaaaaaaaaaa

Bây giờ bạn đề cập đến nó tôi đã có được cái đó, nhưng đó không phải là vấn đề vì những viên gạch đầu tiên là một khung bê tông. :) Chỉ cần bản đồ fiddle đã được đơn giản hóa.
justanotherhulkist 22/03 '

Vâng, tôi nhận thấy vấn đề với setTimeout, bây giờ tôi có một loạt bom, hoạt động tốt với 2 quả bom, với nhiều hơn nó không xóa được một quả ở giữa, tôi đoán tôi phải thực hiện một số thời gian nếu (bộ đếm thời gian> = hẹn giờ) hoặc một cái gì đó tương tự. Tôi học được rất nhiều bằng cách mắc lỗi và phải sắp xếp chúng khi tôi đi: D, vài ngày trước tôi thậm chí không thể làm pong.
justanotherhulkist 22/03 '

Không có gì. Và thật tuyệt khi biết rằng bạn đang học, đôi khi thật khó tin rằng việc giải quyết vấn đề tức thời của mọi người thực sự sẽ dẫn đến bất cứ đâu.
aaaaaaaaaaaa

0

Có vẻ như bạn có một awnser khá đẹp, chỉ muốn thêm một số mã tiện dụng cho vụ nổ.

            for (int i = 0; i < actor.blasradius; ++i)
        {
            tiles[actor.tileX - i][actor.tileY].explode(); //left
            tiles[actor.tileX + i][actor.tileY].explode(); //right
            tiles[actor.tileX][actor.tileY -i].explode(); //up
            tiles[actor.tileX][actor.tileY + i].explode(); //down
        }

Vâng tôi có một cái gì đó tương tự nhưng với các điều kiện như thùng, bê tông vv và phá hủy, hoặc dừng lại tùy thuộc vào nó. Mã này có thể được đọc ở đây: gamedev.stackexchange.com/questions/26065/iêu
justanotherhulkist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.