admin管理员组

文章数量:1026989

I've been toying around with Screeps for a while now and last night I decided to work out some of my behaviors into a class hierarchy by deriving two classes, Miner and Transporter from a Creep main class. However, whenever I do

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

I get the exact same function list as when I do

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

Could someone tell me if I'm doing something wrong OR if I'm actually running into a limitation of the environment my code runs in? This is my code:

////////////////////////////
// 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);
    }
};

I've been toying around with Screeps for a while now and last night I decided to work out some of my behaviors into a class hierarchy by deriving two classes, Miner and Transporter from a Creep main class. However, whenever I do

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

I get the exact same function list as when I do

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

Could someone tell me if I'm doing something wrong OR if I'm actually running into a limitation of the environment my code runs in? This is my code:

////////////////////////////
// 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);
    }
};
Share Improve this question asked Dec 10, 2014 at 12:18 ToolmakerToolmaker 5646 silver badges22 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 6

With this line...

Miner.prototype = Creep.prototype;

... you tell JS that both prototypes are actually the same object. Hence any update for Miner.prototype will affect Creep.prototype too.

One possible approach is using Object.create when establishing the link between prototypes. Here goes a simplified example:

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, ... }

I've been toying around with Screeps for a while now and last night I decided to work out some of my behaviors into a class hierarchy by deriving two classes, Miner and Transporter from a Creep main class. However, whenever I do

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

I get the exact same function list as when I do

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

Could someone tell me if I'm doing something wrong OR if I'm actually running into a limitation of the environment my code runs in? This is my code:

////////////////////////////
// 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);
    }
};

I've been toying around with Screeps for a while now and last night I decided to work out some of my behaviors into a class hierarchy by deriving two classes, Miner and Transporter from a Creep main class. However, whenever I do

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

I get the exact same function list as when I do

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

Could someone tell me if I'm doing something wrong OR if I'm actually running into a limitation of the environment my code runs in? This is my code:

////////////////////////////
// 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);
    }
};
Share Improve this question asked Dec 10, 2014 at 12:18 ToolmakerToolmaker 5646 silver badges22 bronze badges
Add a ment  | 

1 Answer 1

Reset to default 6

With this line...

Miner.prototype = Creep.prototype;

... you tell JS that both prototypes are actually the same object. Hence any update for Miner.prototype will affect Creep.prototype too.

One possible approach is using Object.create when establishing the link between prototypes. Here goes a simplified example:

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, ... }

本文标签: javascriptHow to implement inheritance in Screeps objectsStack Overflow