无法读取未定义Phaser.js的属性add()

时间:2018-04-08 15:53:12

标签: javascript phaser-framework

game.state.add()功能存在问题。出于某种原因,game未定义:

  

未捕获的TypeError:无法在main.js的Object.init(main.js:51)读取未定义的属性'add':58

这是我的代码:

var socket; // global bir socket değişkeni.
    socket = io.connect(); // server a bağlantı isteği gönderir.
                           //Server bağlantı isteğini dinler ve clientlara başarılı olursa geri "connect" mesajını emitler.

    //Oyunun ekrana oturması için boyutları ayarlıyoruz.Browserla ilgili.
    var canvas_width = window.innerWidth * window.devicePixelRatio;
    var canvas_height = window.innerHeight * window.devicePixelRatio;   
    //Oyunumuzu belirlediğimiz divin içinde yaratıyoruz.
    var game = new Phaser.Game(canvas_width,canvas_height,Phaser.CANVAS,'gameDiv');

    var gameProperties = {
      //oyunun gerçek boyutları.oyun dünyasının genişliği ve uzunluğu.
      gameWidth:4000,
      gameHeight:4000,
    }

    //Oyunun ana state i.
    var main = function(game){

    };
    main.prototype ={
    preload:function(){

    },
    create:function(){ // oyun yaratıldığında çağrılır.
    console.log("Client yaratıldı.")
    //serverdan connect mesajı gelince onSocketConnected fonksiyonunu çalıştır.
    socket.on("connect",onSocketConnected); //serverdan gelecek connect mesajı için dinler.Socket.io bir client
                                            // servera bağlandığında otomatik olarak connect mesajını client a gönderir.
                                            //serverın clientlara mesaj göndermesine "emit"  denir.

    },    
    }
    function onSocketConnected(){
      console.log("Sunucuya bağlanıldı.")    
    };

    var gameBootStrapper = {
         init:function(gameContainerId){
             game.state.add('main',main);   //error here
             game.state.start('main');
         }
    };    
    gameBootStrapper.init('gameDiv');

我的index.html:

<body>
    <div id="gameDiv">
    </div>    
</body>
<script src="client/lib/phaser.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script src ="client/main.js"></script>

这里有index.html的图片: .................................................. ......

Image of console

2 个答案:

答案 0 :(得分:1)

我认为这与范围和背景有关。

您正在init的上下文中调用gameBootStrapper,并且该上下文中不存在变量game。换句话说,我认为您还需要将game变量传递给init函数,以便gameBootStrapper对象能够到达该变量。所以像这样:

var gameBootStrapper = {
     init:function(gameContainerId, game){
         game.state.add('main', main);
         game.state.start('main');
     }
};    
gameBootStrapper.init('gameDiv', game);

你也可以以某种方式将init绑定到不同的上下文,尽管我忘记了如何做到这一点。我必须说我发现JavaScript中的作用域和上下文是棘手且不直观的恕我直言。

答案 1 :(得分:0)

我遇到了同样的问题,这就是我解决的方法。碰巧我正在使用“相位器3”,该相位器现在使用game.scene而不是game.start。所以我只是将场景更改为开始,就可以了。