2012-06-04 29 views
2

我目前正在使用Javascript進行多人遊戲,並且我的PlayerList數據結構/對象似乎有一個非常奇怪的問題。JavaScript對象在創建時變得瘋狂嗎?

這裏是對象:

var PlayerList = function(){ 
    this.list = {}; 
} 

的對象有幾個方法,我加做...

PlayerList.prototype.method = function(){...} 

的方法是:addPlayer,removePlayer,playerInList,findPlayer,jsonify和unjsonify。 我有一個巨大的問題unjsonify。下面是代碼:

PlayerList.prototype.unjsonify = function(jsonList){ 
    var object = JSON.parse(jsonList); 
    var li = new PlayerList(); 
    console.log(li.list.x); 
    console.log(li.list.y); 
    console.log(li.list); 
    //insert the fake player objects from the fake list into the new list as real player objects 
    for(p in object.list){ 
     var pObj = object.list[p]; 
     //create real player object 
     var player = new Player(pObj.name, pObj.x, pObj.y, pObj.velX, pObj.velY); 
     li.addPlayer(player); 
    } 
    return li; 
} 

之所以這樣做這樣說是因爲,如果我只是解析服務器發送的jsonList對象,生成的對象具有正確的結構,但沒有一個方法PlayerList應該有。

這裏的問題:我後來發現,當我經過PlayerList.list並得出每個球員,我得到這個錯誤:

Uncaught TypeError: Object NaN has no method 'getX'

事實證明,由於某種原因,當我創建了一個新的PlayerList in unjsonify它有兩個額外的字段,x和y,都設置爲NaN。出現問題就在這裏:

PlayerList.prototype.unjsonify = function(jsonList){ 
    var object = JSON.parse(jsonList); 
    var li = new PlayerList(); 

一些非常奇怪的原因,李是喜歡它一個新的空PlayerList應該的。它包含兩個額外的變量,x和y,都設置爲NaN。即使是比較奇怪的,它不僅僅是一個新的空白列表,它包含了所有當前在服務器上的玩家 - 這對我來說似乎是不可能的,因爲第一次客戶端獲得包含json播放列表的包時,它甚至不會有一個過去的版本本身去掉。

最糟糕的是,如果你看的代碼塊unjsonify,執行console.log(li.list.x)和執行console.log(li.list.y)兩個輸出不確定,但然後console.log(li.list)輸出一個Object(除了服務器上的所有播放器)字段x和y設置爲NaN。

我完全失去了這種情況,甚至可能發生。看起來這些錯誤之一是沒人能解決的,因爲它們沒有任何意義。但如果有人對如何幫助我有絲毫的想法,將不勝感激!

我應該注意,在我有這個PlayerList對象之前,我只是使用了一個沒有任何方法的對象原語,並且手動完成了所有的事情(例如pList.username = player來添加播放器等等)可以看到其他玩家在我的屏幕上移動等等)但是由於這一點變得非常大,我想添加一些結構,因此我創建了這個PlayerList對象,它應該使我的代碼更加結構化和漂亮,但迄今爲止只引起了比其他事情更多的問題。

+0

你有沒有在PlayerList構造函數中放置一個斷點,以查明你的構造函數是否被多次調用? –

+0

好主意 - 奇怪的是,它只在另一個文件main.js中調用一次,以創建初始var plist = new PlayerList(),因此我可以通過執行plist.unjsonify(json)來調用unjsonify。但它只被調用一次?這怎麼可能? – tborenst

+0

從發佈的代碼中,我看不出爲什麼會發生這種情況;如果你的構造函數真的很短,它可以用其他東西填充的唯一方式是通過原型鏈... –

回答

0

您的PlayerList沒有.addPlay方法。

在使用代碼時,更容易將變量命名爲可讀的。

function PlayerList() { 
       this.list = []; 
     }; 
      // 
PlayerList.prototype.unjsonify = function (jsonList) { 
      var jsonLst = JSON.parse(jsonList), 
        myPlayerList = new PlayerList(), 
        player, 
        jsonItem; 
       // 
     for (var i = 0; i < jsonLst.list.length; i++) { 
        jsonItem = jsonLst.list[i]; 
        // 
        player = new Player(jsonItem.name, jsonItem.x, jsonItem.y, jsonItem.velX, jsonItem.velY); 

        myPlayerList.list.push(player); 

       }; 
       return myPlayerList; 
      }; 

我已經將您的Player.list從一個對象更改爲一個數組。

+0

我'有點困惑,你是什麼意思PlayerList沒有.addPlay方法?你的意思是寫.addPlayer?因爲它確實有一個.addPlayer方法。這不是你的意思嗎?否則,將列表轉換爲數組可能是一個好主意。唯一的問題是無法通過用戶名(我用來輸入密鑰)來查找玩家。我會盡力而爲。 – tborenst

+0

哇...即使我將它改爲數組後,x和y彈出並設置爲NaN。 – tborenst

+0

你能爲我發佈足夠的代碼來模擬發生了什麼嗎?一些播放列表數據也會很好。 –