2012-07-25 61 views
0

因此,我正在寫一個愚蠢的小帆布遊戲,主要是小行星的副本。無論如何,我有我的按鈕,監聽器設置,以便當用戶按下空格鍵,玩家對象的fire()函數被調用:對象原型不起作用在畫布遊戲

eGi.prototype.keyDownListener = function(event) { 
    switch(event.keyCode) { 
     case 32: 
      player.fire(); 
      break; 

在火功能,我的腳本檢查,如果該進程已經運行,如果不是,那麼它會創建一個新的「子彈」對象,將其存儲在一個臨時變量中,並將其添加到繪製堆棧中。

fire:(function() { 
    if (this.notFiring) { 
     var blankObject = new bullet(this.x,this.y,this.rot,"bullet"); 
     objects.push(blankObject); 
     timer2 = setTimeout((function() { 
      objects.pop(); 
     }),1000); 
     this.notFiring = false; 
    }}), 

(順便說一下,當用戶釋放空格鍵,this.notFiring設置回真。)

這是子彈對象構造和其所需的和原型方法,draw(context)

var bullet = function(x,y,rot,name) { 
    this.x = x; 
    this.y = y; 
    this.sx = 0; 
    this.sy = 0; 
    this.speed = 1; 
    this.maxSpeed = 10; 
    this.rot = rot; 
    this.life = 1; 
    this.sprite = b_sprite; 
    this.name = name; 
} 
bullet.prototype.draw = function(context) { 
    this.sx += this.speed * Math.sin(toRadians(this.rot)); 
    this.sy += this.speed * Math.cos(toRadians(this.rot)); 
    this.x += this.sx; 
    this.y -= this.sy; 
    var cSpeed = Math.sqrt((this.sx*this.sx) + (this.sy * this.sy)); 
    if (cSpeed > this.maxSpeed) { 
     this.sx *= this.maxSpeed/cSpeed; 
     this.sy *= this.maxSpeed/cSpeed;  
    } 
    context.drawImage(this.sprite,this.x,this.y); 
} 

無論如何,當我跑我的遊戲,按空格鍵,Chrome開發者控制檯給了我一個錯誤,指出:

Uncaught TypeError: Object function (x,y,rot,name) { 
    this.x = x; 
    this.y = y; 
    this.sx = 0; 
    this.sy = 0; 
    this.speed = 1; 
    this.maxSpeed = 10; 
    this.rot = rot; 
    this.life = 1; 
    this.sprite = b_sprite; 
    this.name = name; 
} has no method 'draw' 

即使我原型。我究竟做錯了什麼?

編輯:

改變var bullet = function到​​,改變bullet.prototype.drawbullet.draw後,我仍然得到一個錯誤。這一次,它更神祕,說

Uncaught TypeError: type error 
    bullet.draw 
    (anonymous function) 
    eGi.drawObjs 
    eGi.cycle 

完整的代碼是在我的網站上,here

ANOTHER編輯:

的鉻控制檯說,上線122發生這種類型的錯誤,這恰好是代碼片段:

context.drawImage(this.sprite,this.x,this.y); 

不過,我不知道如何有可能是一個類型的錯誤,精靈是一個圖像,X和Y值不是未定義的,它們是數字。

+0

你肯定'this.sprite'在你把它傳遞給'context.drawImage'時間定義之間的區別?嘗試添加'console.log(this.sprite)'來首先檢查。是否正確定義了「b_sprite」? – apsillers 2012-07-25 05:52:56

+0

是的,它正在通過。我已經定義了所有我的精靈,格式爲 'var b_sprite = new Image(); b_sprite.src =「bullet.png」;' – Polyov 2012-07-25 12:47:44

回答

1

你在哪裏打電話給你的繪圖功能?我打賭你打電話bullet.draw();,而不是在實際的子彈實例上調用它。

有點像

Cat.meow(); 

var mittens = new Cat(); 
mittens.meow(); 
+0

這基本上是正確的,我的「引擎」(eGi)執行繪圖函數的糟糕方式是使用我傳給它的「名稱」實例碰巧是子彈,與類名相同。我一直在使用Objective-C,子彈必須是全球性的,才能讓我的「引擎」識別它。 – Polyov 2012-07-27 04:29:50