MapApi.hasBridgeOnTile(tile)、hasHighBridgeOnTile(tile)

| Chrono Divide | 2 Reads

以下兩個方法都屬於 MapApi,其宣告可在套件的 index.d.ts 找到:

688      getTile(rx: number, ry: number): Tile | undefined;
689      getTilesInRect(rectangle: Rectangle): Tile[];
690      getTilesInRect(baseTile: Tile, size: Size): Tile[];
691      getObjectsOnTile(tile: Tile): number[];
692      hasBridgeOnTile(tile: Tile): boolean;
693      hasHighBridgeOnTile(tile: Tile): boolean;

在壓縮後的實作中,兩個函式緊接著出現,邏輯十分簡單:

...getObjectsOnTile(e){return Op(this,Cp,"f").getObjectsOnTile(e).map(e=>e.id)}
hasBridgeOnTile(e){return!!e.onBridgeLandType}
hasHighBridgeOnTile(e){return!!Op(this,Cp,"f").tileOccupation.getBridgeOnTile(e)?.isHighBridge()}
isPassableTile(e,t,i,s){...

hasBridgeOnTile(tile)

只要該 Tile 的 onBridgeLandType 屬性存在(代表此格上有橋面),就會回傳 true

hasHighBridgeOnTile(tile)

透過內部 tileOccupation.getBridgeOnTile(tile) 取得橋梁物件,再判斷 isHighBridge(),用來分辨普通橋或高架橋。


簡易範例

import { cdapi, Bot, GameApi, Vector2 } from "@chronodivide/game-api";

class BridgeCheckerBot extends Bot {
    onGameStart(game: GameApi) {
        const tile = game.mapApi.getTile(40, 30);
        if (!tile) return;

        if (game.mapApi.hasBridgeOnTile(tile)) {
            if (game.mapApi.hasHighBridgeOnTile(tile)) {
                console.log("該格有高架橋");
            } else {
                console.log("該格有普通橋");
            }
        } else {
            console.log("此處沒有橋");
        }
    }
}

async function main() {
    await cdapi.init(process.env.MIX_DIR!);
    await cdapi.createGame({
        agents: [new BridgeCheckerBot("Scout", "Americans")],
        mapName: "mp03t4.map",
        shortGame: true,
        online: false,
    });
}
main().catch(console.error);

以上程式在遊戲開始時先取得指定座標的 Tile,再依序呼叫 hasBridgeOnTilehasHighBridgeOnTile 判斷是否存在橋梁以及橋的種類。

在自動尋路或放置建築時,可利用這兩個方法快速了解某格是否被橋佔據,並視需要區分高架橋或普通橋。這對於避免在橋梁上誤放建築或規劃通行路徑時尤為重要。

 

→返回《@chronodivide/game-api 使用教學與完整 API 對照表》

This article was last edited at