文本游戏角色碰撞检测问题

时间:2011-05-22 22:22:35

标签: c++ console

我正在制作一个游戏,当你向下移动屏幕时,你可以避开由'X'组成的墙壁,如果你击中X,你将失去一个盾牌并继续掠过X而不会再失去任何盾牌,直到你弹出一个没有X的字符空间。

然而,当运行下面的代码以及其他一些不必要的代码时,如果我在Visual Studio中停止了它,那么它就会完美地运行,但是当我在代码运行时开始撞到'X'墙并且墙壁移动得非常快时不能正常工作,你最终会进行耕作,但你失去了过程中的所有盾牌,当你“犁过”它们时,X不会消失。

以下是代码:

char coll;  // the buffer for the collided char

if (theScreen.check_collision(player, xMove, yMove, coll) != true) {
    // no collision
    // get rid of old player placing
    theScreen.Insert(' ', player.get_location()[0], player.get_location()[1]);
    // put in new charater placing
    player.move(xMove, yMove);
    theScreen.Insert(player);
    numb_coll = 0;
} else {
    // collision
    if (coll == 'X' && player.get_shield() > 0) {
        for (int I = 0; I < numb_coll && numb_coll < player.get_location()[1]; I++) {
            theScreen.Insert(' ', player.get_location()[0],
                     player.get_location()[1] - (I + 1));
        }
        if (numb_coll == 0)
            player.set_shield(player.get_shield() - 1);
        numb_coll++;
        theScreen.Insert(player);
    }
    if (coll == 'X' && player.get_shield() <= 0)
        dead = true;
};

1 个答案:

答案 0 :(得分:6)

我建议对代码进行彻底的重新组织。此例程似乎与绘制屏幕上的播放器以及更改播放器的盾牌评级有关。我相信如果您将播放器的显示与播放器的修改分开,您的代码将更易于阅读和维护。

考虑一下:

theScreen.check_collision(player, xMove, yMove, coll) {
    /* your current check_collision code, which I hope is correct */
    if (collision)
        player.destroy_a_shield();
    return collision;
}

player对象中:

player.destroy_a_shield() {
    self.shield--;
    if (self.shield == 0)
        player.dead = true;
}

然后这段代码看起来更像是:

if (theScreen.check_collision(player, xMove, yMove, coll) {
    if (player.dead) 
        theScreen.insert("Ooops. Game over. Better luck next life.");
    else {
        for (int I = 0; I < numb_coll && numb_coll < player.get_location()[1]; I++) {
            theScreen.Insert(' ', player.get_location()[0],
                    player.get_location()[1] - (I + 1));
            }
        numb_coll++;
        theScreen.Insert(player);
    }
} else {
    theScreen.Insert(' ', player.get_location()[0], player.get_location()[1]);
    player.move(xMove, yMove);
    theScreen.Insert(player);
}

这些修改的想法(以伪代码呈现,因为我很懒,因为我不知道你的代码的其余部分是什么样子)是将屏幕分开 display 来自游戏 mechanics 。 (您之前可能已经听过“模型 - 视图 - 控制器”一词 - 此模式准确地描述了我的建议。将业务规则移出视图。 )