2015-01-17 3 views
1

Я знаю, как получить расстояние от А до В, но со всеми факторами ландшафта, очень трудно подсчитать, сколько времени понадобится ползать, чтобы проехать по этому пути. Есть ли встроенный способ сделать это, что мне не хватает? Вот что я желаю для:Есть ли способ рассчитать количество тиков, которые потребуется для ползучести, чтобы добраться от А до Б?

path = creep.pos.findPathTo(target); 
creep.ticksForPath(path, {energy: 150); 

где {energy: 150} позволяет принудительно расчету использовать эту сумму переносимой энергии.

Возможно ли это?

ответ

2

В game docs такой вещи нет. Но вы можете использовать аргумент avoid функции findPath, чтобы попытаться избежать болотных плит. По умолчанию он предпочитает наименьшие шаги, самый быстрый маршрут, как я полагаю.

Существует способ расчета стоимости путем поиска пути, а затем сравнения координат с вызовом lookAtArea().

var path = creep.room.findPath(creep, target); 

path возвращается:

[ 
    { x: 10, y: 5, dx: 1, dy: 0, direction: Game.RIGHT }, 
    { x: 10, y: 6, dx: 0, dy: 1, direction: Game.BOTTOM }, 
    { x: 9, y: 7, dx: -1, dy: 1, direction: Game.BOTTOM_LEFT }, 
    ... 
] 

Вы можете запрашивают сверху/слева и снизу/справа область с lookAtArea():

var look = creep.room.lookAtArea(10,5,11,7); 

look возвращается:

// 10,5,11,7 
{ 
    10: { 
     5: [{ type: ‘creep’, creep: {...} }, 
      { type: ‘terrain’, terrain: ‘swamp’ }], 
     6: [{ type: ‘terrain’, terrain: ‘swamp’ }], 
     7: [{ type: ‘terrain’, terrain: ‘swamp’ }] 
    }, 
    11: { 
     5: [{ type: ‘terrain’, terrain: ‘normal’ }], 
     6: [{ type: ‘spawn’, spawn: {...} }, 
      { type: ‘terrain’, terrain: ‘swamp’ }], 
     7: [{ type: ‘terrain’, terrain: ‘wall’ }] 
    } 
} 

И затем пройдите через каждый шаг шага, который у вас есть, и проверьте тип местности.

3 типа мы должны:

  1. Обычной земля - ​​просто земля с ценой движения 2
  2. Болот увеличивают стоимость передвижения до 10.
  3. дорог уменьшают стоимость движения 1.

Что-то вроде (непроверенной, неполный код):

function terrainSpeed(terrainType) { 
    var speed = 0; 
    switch(terrainType) { 
    case 'swamp': 
     speed = 10; 
     break; 
    case 'normal': 
     speed = 2; 
     break; 
    case 'road': 
     speed = 1; 
     break; 
    } 
    return speed; 
} 

// Traverse through path and check how many thicks it would take 
// based on carried energy and body 
function calculateTicksRequired(path,look,energy,body) { 
    var ticksRequired = 0; 
    for (var i = 0; i < path.length; i++) { 
    var terrainForStep = look[path[i].y][path[i].x].terrain]; 
    var defaultTicks = terrainSpeed(terrainForStep); 
    var moveCost = 1; 
    // Perform calculation by looking at bodymove cost (based on body) 
    // and carry cost (based on energy) 

    // LOGIC TO CALCULATE MOVECOST 
    // ... 

    // Multiply that by defaultTicks 
    ticksRequired += defaultTicks * moveCost; 
    } 
    return ticksRequired; 
}