如何用lncurses检测太空入侵者控制台游戏中的子弹击中

时间:2015-04-03 10:15:10

标签: c cygwin curses

如何完成此功能以使子弹摧毁一块石头(由#字符显示)?我正在考虑使用mvinch检查* bullet字符=="#",但是它不起作用。

void update_bullet(int key_code) {
    screen_position bullet_pos = get_sprite_screen_loc(bullet_id);
    if (bullet_pos.x < 0 && key_code == ' ') {
        screen_position ship_pos = get_sprite_screen_loc(ship_id);
        move_sprite_to(bullet_id, ship_pos.x + 7, ship_pos.y + 3);
    } else if (bullet_pos.x > 79) {
        move_sprite_to(bullet_id, -1, 0);
    } else if (bullet_pos.x > 0) {
        move_sprite(bullet_id, 1, 0);
    }
}

上面的代码是将子弹移动到屏幕上。

我试图做的是当它走到控制台屏幕的边缘时,它会移回(-1,0),当它与岩石#处于同一位置时,两者都是#和*字符移回(-1,0)。

1 个答案:

答案 0 :(得分:0)

您无法将光标移出窗口,因此您的move_sprite函数(问题中未提供)必须处理该方面。例如(缺少move_sprite的代码,它可能正在执行

int move_sprite(screen_position position, int dx, int dy)
{
    int y, x;
    getyx(stdscr, y, x);
    if (dx > 0) {
        ++x;
    }
    else if (dx < 0) {
        x = -1;             /* this is incorrect, but matches the information given in the question */
    }
    ...
    move(y, x);
}

根据move手册页,尝试将光标移出窗口将返回ERR并且无效。