LuckieLordie Posted December 13, 2013 Share Posted December 13, 2013 Hi guys! I've got more of a javascript question for you! If mods aren't happy about it being here then just let me know! I have in my game some collectables. Every collectable in my game does a few things. Creates itself when asked by the manager, Removes itself when asked by the manager and has the properties for doing that. However, when I collide with a different object they need different behaviours. In OO I would use an abstract class and inherit all my different collectables from it. Here is my take at that idea in Javascript. Base ClassCollectable = function(imageRef, game, posX, posY){ this.posX = posX; this.posY = posY; this.imageRef = imageRef; this.spriteRef = null; this.physicsShape = null; this.alive = false; this.collided = false; this.game = game; this.bounceSpeed = 2; this.bounceOffset = 10; };Collectable.prototype.constructor = Collectable;Collectable.prototype.AddCollectable = function(){ this.alive = true; this.spriteRef = this.game.add.sprite(this.posX, this.game.world.height - this.posY, this.imageRef); this.game.gameGroup.add(this.spriteRef); this.AddShape(); this.spriteRef.anchor.setTo(0.5, 0.5);};Collectable.prototype.AddShape = function(){ var staticBody = this.game.game.space.staticBody; this.boundingBox = new cp.BB(this.posX, this.posY, this.posX + this.spriteRef.width, this.posY + this.spriteRef.height); //shape definition this.physicsShape = this.game.game.space.addShape(new cp.BoxShape2(staticBody, this.boundingBox)); this.physicsShape.setSensor(true); this.physicsShape.setCollisionType(2); this.physicsShape.parentObject = this; this.game.game.space.addCollisionHandler(2, 0, this.PlayerCollisionCallback, null, null, null);};Collectable.prototype.PlayerCollisionCallback = function(arb){ console.log("A Collectable hasn't implemented a collision function!"); };Collectable.prototype.RemoveCollectable = function(){ this.game.game.space.removeShape(this.physicsShape); this.spriteRef.destroy(); this.spriteRef = null; this.alive = false;};Collectable.prototype.Update = function(){ };(I think I need to switch from adding and removing sprites to killing and reviving). Here is one of my "Inherited" objectsCoinCollectable = function(imageRef, game, posX, posY){ Collectable.call(this, imageRef, game, posX, posY);};CoinCollectable.prototype.constructor = CoinCollectable;CoinCollectable.prototype = Object.create(Collectable.prototype);CoinCollectable.prototype.PlayerCollisionCallback = function(arb){ var shapes = arb.getShapes(); var collectable = shapes[0].parentObject; var player = shapes[1].parentObject; console.log("COIN COLLIDE"); player.coinsCollected++; collectable.collided = true;};Riight, that was a lot of setup. My problem is that in my game I have two types of collectable at the moment. Fuel and Coin. Fuel is identical to Coin except the content of the "PlayerCollisionCallback" function. However they don't use the correct behaviour in game. I'm wondering if it's because of the way I've set up the "inherited classes". Any help would be great! Link to comment Share on other sites More sharing options...
jcs Posted December 13, 2013 Share Posted December 13, 2013 firstly, I think you've simply got the two lines CoinCollectable.prototype.constructor = CoinCollectable; CoinCollectable.prototype = Object.create(Collectable.prototype); reversed. the second line undoes what the first line accomplishes and you end up with a Collectable, not a CoinCollectable secondly, trying to emulate "OOP" features in javascript is not always fruitful. abstract base classes (interfaces) in particular don't really lend themselves well. javascript, being a dynamic language is much better suited to "duck typing" such as one might use in python or similar. your example seems to be more one of an actual, non-abstract base-class however, so it seems you may not be looking for abstract classes at all... HTH anyway Link to comment Share on other sites More sharing options...
Recommended Posts