0

我遇到了 craftyJS 的问题。我制造了一艘发射激光的船,但我希望激光在与实体发生碰撞时摧毁它。我已经尝试过这样做,但它不起作用。这是我的代码:

Crafty.init(1340,650, document.getElementById('game'));
Crafty.defineScene("gameStart", function() {
function newAlien(){
    var random = Math.floor(Math.random() * 4) + 1;
    switch(random){
        case 1:
            var alien = Crafty.e("2D, DOM, Image, Collision")
                .image("alien1.png");
            alien.x = ship.x;
            alien.y = 20
            break;
        case 2:
            var alien = Crafty.e("2D, DOM, Image, Collision")
                .image("alien2.png");
            alien.x = ship.x;
            alien.y = 20;
            break;
        case 3:
            var alien = Crafty.e("2D, DOM, Image, Collision")
                .image("alien3.png");
            alien.x = ship.x;
            alien.y = 20;
            break;
        case 4:
            var alien = Crafty.e("2D, DOM, Image, Collision")
                .image("alien4.png");
            alien.x = ship.x;
            alien.y = 20;
            break;
        }
}
function newLaser(){
    var laser = Crafty.e("2D, DOM, Image, Collision")
    .image("laser.png")
    .collision()
    .onHit("alien", function(){
        laser.destroy();
        alien.destroy();
    });
    laser.y = 510;
    laser.x = ship.x + 40;
    var moveLaser = setInterval(function(){
        if(laser.y < 1){
            clearInterval(moveLaser);
            laser.destroy();
        } else {
            laser.y = laser.y - 4;
        }
    }, 1);
}

function checkBorder(){
    if(ship.x < 0 || ship.x > 1250){
        Crafty.enterScene("gameStart");
    }
}
function goLeft(){
    var goLeftCount = 65;
    var goLeftInterval = setInterval(function(){
        if(goLeftCount === 0){
            clearInterval(goLeftInterval);
            checkBorder();
        } else {
        ship.x = ship.x - 1;
        goLeftCount -= 1;
        }
    }, 1);
}
function goRight(){
    var goRightCount = 65;
    var goRightInterval = setInterval(function(){
        if(goRightCount === 0){
            clearInterval(goRightInterval);
            checkBorder();
        } else {
            ship.x = ship.x + 1;
            goRightCount -= 1;
        }
    }, 1);
}
var ship = Crafty.e("2D, DOM, Image, Bind")
    .image("ship.png")
    .bind('KeyDown', function(e) {
            if(e.key == Crafty.keys['LEFT_ARROW']) {
              goLeft();
              } else if (e.key == Crafty.keys['RIGHT_ARROW']) {
              goRight();
              } else if(e.key == Crafty.keys['SPACE']) {
              newLaser();
              }
          });
ship.y = 520;
ship.x = 600;
newAlien();
});
Crafty.enterScene("gameStart");

谁能告诉我我的代码有什么问题?

4

1 回答 1

0

一个问题:当你试图摧毁外星人时,alien变量实际上不在范围内。(你已经在不同的函数中声明了它。)所以没有办法alien.destroy();奏效。

第二个问题:您传递给的函数.onHit("alien", callback)只会在激光击中具有“外星人”组件的实体时运行。它不知道您为实体分配的变量名称。但是,回调函数将传递有关它与哪些实体发生冲突的信息,您可以使用它来解决冲突。

于 2015-01-22T00:51:42.683 回答