2014-05-04 166 views
0

即时通讯相当新的JavaScript和easelJS/createJS但我想我理解他们足以做简单的任务。我开始尝试使用帆布,并且陷入了一个地方。这是什么奇怪的easelJS行为?

这个小小的项目使用canvas和easelJS渲染2个引擎的简单穿梭,以及简单的物理移动它。 (伪)物理工作正常:对于两个引擎,都采取单独的操作,但渲染失败。每当我打开发动机(钥匙'q'或'w')时,发动机的火都会熄灭。

我试图找到这个代码的最简单的子集来重现这个问题,但我失败了,所以我提供了这个简单的项目的整个代码。

<!DOCTYPE HTML> 
<html> 
<head> 
<title></title> 

<style> 
    /*#myCanvas{ 
     width: 1200px; 
     height: 600px; 
    }*/ 
</style> 

<script src="createjs-2013.12.12.min.js"></script> 
<script> 


/* Keyboard */ 
var Key = { 
    _pressed: {}, 

    /*LEFT: 37, 
    UP: 38, 
    RIGHT: 39, 
    DOWN: 40,*/ 
    Q: 81, W: 87, E: 69, R:82, T:84, Y: 89, 


    isDown: function(keyCode) { 
     return this._pressed[keyCode]; 
    }, 

    onKeydown: function(event) { 
     this._pressed[event.keyCode] = true; 
    }, 

    onKeyup: function(event) { 
     delete this._pressed[event.keyCode]; 
    }, 

    getThrottles: function() { 
     var resObj = {}; 
     for(var code in this._pressed){ 
      resObj[String.fromCharCode(code)] = 1; 
     } 
     return resObj; 
    } 
}; 

/* Vector2 */ 
function Vector2 (x, y, dx, dy){ 
    this.x = x ? x : 0; 
    this.y = y ? y : 0; 
    this.dx = dx ? dx : 0; 
    this.dy = dy ? dy : 0; 
} 

/* Physics */ 
var Physics = { 
    objects: [], 

    update: function(){ 
     for(ind in this.objects){ 
      var obj = this.objects[ind]; 

      for(ind2 in obj.forces){ 
       var f = obj.forces[ind2]; 


       // velocities calculations 
       if(f.x == obj.x && f.y == obj.y){ 
        obj.velocity.dx += f.dx/obj.mass; 
        obj.velocity.dy += f.dy/obj.mass; 
       } 
       else{ 
        var len = Math.sqrt((f.x-obj.x)*(f.x-obj.x) + (f.y-obj.y)*(f.y-obj.y)); 
        var fpar = new Vector2(0, 0, (obj.x-f.x)/len, (obj.y-f.y)/len); 
        var fper = new Vector2(0, 0, (obj.y-f.y)/len, -(obj.x-f.x)/len); 
        var factorpar = f.dx*fpar.dx + f.dy*fpar.dy; 
        var factorper = f.dx*fper.dx + f.dy*fper.dy; 

        obj.velocity.dx += f.dx/obj.mass; 
        obj.velocity.dy += f.dy/obj.mass; 

        // TODO: here radius should be considered in equation 
        obj.avelocity += factorper/obj.imoment; 

       } 


      } 

      obj.forces.length = 0; 

      // rotations and translations 
      obj.x += obj.velocity.dx; 
      obj.y += obj.velocity.dy; 
      obj.rotation += obj.avelocity; 

      // dumping 
      var dumping = 0.95; 
      var adumping = 0.95; 
      var minvel = 0.0001; 
      var minavel = 0.0001; 

      obj.velocity.dx = dumping * obj.velocity.dx; 
      obj.velocity.dy = dumping * obj.velocity.dy; 
      obj.avelocity = adumping * obj.avelocity; 

     } 

    } 

}; 



var myStage; 

createjs.DisplayObject.prototype.mass =0.5; 
createjs.DisplayObject.prototype.imoment = 0.1; 
createjs.DisplayObject.prototype.forces = []; 
createjs.DisplayObject.prototype.velocity = new Vector2(); 
createjs.DisplayObject.prototype.avelocity = 0; 

function Engine(width, height){ 
    var that = this; 
    this.width = width; 
    this.height = height; 
    this.innerThrottle = 0; 

    this.throttle = function(value){ 
     if(value!==null) 
      that.innerThrottle = value; 

     that.flame.graphics.clear(); 
     that.flame.graphics.beginFill("#ff0000").drawRoundRect(
         -that.width*that.innerThrottle/2, 
         that.height+that.margin, 
         that.width*that.innerThrottle, 
         that.width*that.innerThrottle, 
       that.margin); 

     return that.innerThrottle; 
    }; 



    //drawing 
    this.margin = 0.1 * this.width; 
    this.body = new createjs.Shape(); 
    this.body.graphics.beginFill("#999999").drawRect(-this.width/2, 0, this.width, this.height); 
    this.addChild(this.body); 

    this.flame = new createjs.Shape(); 
    this.flame.graphics.beginFill("#ff0000").drawRoundRect(
        -this.width*this.throttle()/2, 
        this.height+this.margin, 
        this.width*this.throttle(), 
        this.width*this.throttle(), 
      this.margin); 
    this.addChild(this.flame); 
} 
Engine.prototype = new createjs.Container(); 

function Shuttle(radius){ 
    var that = this; 
    this.engineNames = ['Q','W','E','R','T','Y']; 
    this.engines = {}; 
    this.addEngine = function (x,y,rotation){ 
     var tmpEn = new Engine(radius/2, radius/1); 
     tmpEn.x = x; 
     tmpEn.y = y; 
     tmpEn.rotation = rotation; 
     that.addChild(tmpEn); 

     that.engines[that.engineNames[Object.keys(that.engines).length]] = tmpEn; 
    }; 

    this.steering = null; 

    this.shuttleTick = function(){ 
     var throttles = that.steering.getThrottles(); 
     var engines = that.engines; 

     for(var key in engines) 
      engines[key].throttle(0); 

     for(var key2 in throttles){ 
      if(engines[key2]){ 
       engines[key2].throttle(throttles[key2]); 

       var end = engines[key2].localToGlobal(0,-0.1); 
       var start = engines[key2].localToGlobal(0,0); 

       that.forces.push(new Vector2(start.x, start.y, (end.x-start.x)*throttles[key2], (end.y-start.y)*throttles[key2])); 
      } 
     } 


    }; 



    // drawing 
    var core = new createjs.Shape(); 
    core.graphics.beginFill("#000000").drawCircle(0,0,radius); 
    this.addChild(core); 
} 
Shuttle.prototype = new createjs.Container(); 

var shuttle; 
function init(){ 

    // Key object initialization 
    window.addEventListener('keyup', function(event) { Key.onKeyup(event); }, false); 
    window.addEventListener('keydown', function(event) { Key.onKeydown(event); }, false); 


    myStage = new createjs.Stage("myCanvas"); 

    //var engine = new Engine(200,300); 
    var r = 10; 
    shuttle = new Shuttle(r); 
    shuttle.steering = Key; 
    shuttle.addEngine(-r,0,0); 
    shuttle.addEngine(r,0,0); 
    shuttle.x = 500; 
    shuttle.y = 200; 
    //shuttle.velocity.dx = 1; 
    //shuttle.avelocity = 1; 

    myStage.addChild(shuttle); 

    Physics.objects = [shuttle]; 

    createjs.Ticker.setFPS(60); 
    createjs.Ticker.addEventListener('tick', tick); 

} 

function tick(){ 
    shuttle.shuttleTick(); 
    Physics.update(); 
    myStage.update(); 
} 
</script> 


</head> 
<body onload="init()"> 
<canvas id="myCanvas" width="1200" height="600"> 

</canvas> 
</body> 
</html> 

回答

0

你的具体问题是,你正在扩展Container类,但创建Engine实例时不进行初始化。如果将这个在Engine(width, height)函数的顶部,它应该工作:

this.initialize(); 

更普遍,虽然,你应该看看JavaScript的原型继承是如何工作的 - 你的代码是非常难以阅读和不必要的复杂。

在JS中实现“经典”OOP继承模式有许多不同的方法,但由于您使用的是CreateJS,因此您的案例中最有用的方法可能是首先学习它们的方法,调整您的类以遵循相同的模式,并从那里工作 - 见例如this question

相关问题