2014-12-10 16 views
5

Şu an ve geçen gece bir süredir Screeps ile uğraştım ve bazı sınıflarımın bir sınıf hiyerarşisinde, bir Creep ana sınıfından iki sınıf, Miner ve Transporter türeterek çalıştım. Ancak, her ne zaman ben Screeps nesnelerinde miras nasıl uygulanır?

console.log(_.functions(minerInstance)); 

Ben ne zaman tam olarak aynı işlevi listesini almak do

console.log(_.functions(transporterInstance)); 

Yanlış VEYA aslında bir içine çalıştırdığını şey yapıyorsam birisi bana söyleyebilir misiniz Ortamın sınırlaması kodun içinde çalışıyor mu? Bu benim kodudur: Bu hat sayesinde

//////////////////////////// 
// Creep.js 
var Creep = function(creep, room) { 
    this.creep = creep; 
    this.room = room; 
    this.name = creep.name; 
    this.id = creep.id; 
}; 

module.exports = Creep; 

Creep.prototype = { 
    tick: function() { 
     console.log("Base class implementation of tick(), should never happen."); 
    }, 

    getRole: function() { 
     return this.creep.memory.role; 
    } 
}; 

//////////////////////////// 
// Miner.js 
var Creep = require("Creep"); 

var Miner = function(creep, room) { 
    this.base = Creep; 
    this.base(creep, room); 
    //Creep.call(this, creep, room); 
}; 

module.exports = Miner; 

Miner.prototype = Creep.prototype; 

Miner.prototype.tick = function() { 
    var creep = this.creep; 

    if (creep.memory.activity === undefined || creep.memory.activity === "") { 
     var target = creep.pos.findNearest(Game.SOURCES_ACTIVE); 
     this.mine(creep, target); 
    } 

    var act = creep.memory.activity; 
    if (act == "mine") { 
     var target = this.getTarget(creep); 
     if (target !== undefined) { 
      if (creep.energy < creep.energyCapacity) { 
       creep.moveTo(target); 
       creep.harvest(target); 
      } else { 
       console.log("Write dump to truck code"); 
       /*var trucks = find.transporterInRange(creep, 1); 
       if (trucks.length) { 
        creep.moveTo(trucks[0]); 
        var amount = trucks[0].energyCapacity - trucks[0].energy; 
        creep.transferEnergy(trucks[0], amount); 
       }*/ 
      } 
     } 
    } 
}; 

Miner.prototype.mine = function(creep, target) { 
    creep.memory.target = target.id; 
    creep.memory.activity = "mine";   
}; 

Miner.prototype.getTarget = function(creep) { 
    return Game.getObjectById(creep.memory.target); 
}; 

//////////////////////////// 
// Transporter.js 
var Creep = require("Creep"); 

var Transporter = function(creep, room) { 
    Creep.call(this, creep, room); 
}; 

module.exports = Transporter; 

Transporter.prototype = Creep.prototype; 

Transporter.prototype.tick = function() { 
    var creep = this.creep; 
    if (creep.energy < creep.energyCapacity) { 
     var miner = this.room.findByRole(creep, "miner"); 
     console.log(miner); 
     if (miner !== null) { 
      //console.log(miner[0].name); 
      //creep.moveTo(miner); 

     } else 
      console.log("no miners found"); 
    } else { 
     console.log("moving to drop"); 
     //var drop = find.nearestEnergyDropOff(creep); 
     //creep.moveTo(drop); 
     //creep.transferEnergy(drop); 
    } 
}; 

cevap

6

...

Miner.prototype = Creep.prototype; 

... Her iki prototipler aslında aynı nesne olduklarını JS söyle. Bu nedenle Miner.prototype için herhangi bir güncelleme Creep.prototype'u da etkileyecektir.

Bir olası yaklaşım, prototipler arasındaki bağlantı kurulurken Object.create kullanıyor. İşte basitleştirilmiş bir örnek:

function Foo(a) { 
    this.a = a; 
} 

Foo.prototype.tick = function() { console.log('Foo ticks'); }; 
Foo.prototype.tock = function() { console.log('Foo tocks'); }; 

function Bar(a, b) { 
    this.base = Foo; 
    this.base(a); 
    this.b = b; 
} 

Bar.prototype = Object.create(Foo.prototype); 
// as you inherit all the properties, you'll have to reassign a constructor 
Bar.prototype.constructor = Bar; 
Bar.prototype.tick = function() { console.log('Bar ticks'); }; 

var f = new Foo(1); 
f.tick(); // Foo ticks 
f.tock(); // Foo tocks 
console.log(f); // Foo { a=1, ... } 

var b = new Bar(1, 2); 
b.tick(); // Bar ticks 
b.tock(); // Foo tocks 
console.log(b); // Bar { a=1, b=2, ... } 
+0

Kodunuzu Creeps kod paneline kopyalayın/yapıştırın ve bir çekim yapın, tam olarak tahmin ettiğiniz gibi çalışır. Tam ve eksiksiz cevap için teşekkür ederiz! – Toolmaker