使用按钮将本地 javascript 变量传递给 Phaser 游戏中的全局变量

Passing a local javascript variable to global on a Phaser game using a button

在我正在开发的一个简单的 Phaser 游戏中,我需要一个 "submit score" 按钮将本地 javascript 得分变量传递给全局变量,这样我就可以将它传递给它的 PHP 页面最后,在里面放一个 MySQL table。问题是我找不到正确的方法。

这是按钮创建(位于加载状态):

this.add.button(50, 200, 'grass:1x1', score(PlayState.coinPickupCount), this);

这是按钮调用的函数'score'(在州外):

function score(points) {

var gscore = points;

return points;

}

这是 coinPickupCount 所在的位置:

PlayState.init = function (data) {
this.keys = this.game.input.keyboard.addKeys({
    left: Phaser.KeyCode.LEFT,
    right: Phaser.KeyCode.RIGHT,
    up: Phaser.KeyCode.UP
});

this.coinPickupCount = 0; //the game score
this.hasKey = false;
this.level = (data.level || 0) % LEVEL_COUNT;
};

coinPickupCount 已经在每次拾取硬币时增加 1,这是我每次按下 "submit score" 按钮时要传递给全局的变量。

我几乎所有的代码都是从 link:

下载的

https://mozdevs.github.io/html5-games-workshop/platformer/js/main.js

感谢您抽出宝贵时间!我接受任何其他方式将该变量获取到游戏出现的 PHP 页面,我被迫使用 MySQL 因为这是一个学校项目。

您可以简单地在程序的顶部声明变量'coinPickUpCount'。在 Phaser 中有一个已经存在的函数 create() ,它在一开始就被 Phaser 调用。在那里初始化'coinPickupCount'。

var coinPickupCount;
function create(){
 coinPickupCount = 0;
}

在函数'score'中自增并存入数据库

如果您想在不刷新页面的情况下更新数据库,您必须使用 ajax 请求。

将 ajax 请求添加到您的评分函数中:

function score( points ) {

  var gscore = points;

  var xhttp = new XMLHttpRequest();
  xhttp.onreadystatechange = function() {
    if (this.readyState == 4 && this.status == 200) {
     // If you want do something after update complate
    }
  };

  xhttp.open( "POST", "updateScore.php", true );
  xhttp.send( "points=" + points);

  return points;
}

并且您需要创建 updateScore.php 文件, 它需要是这样的:

<?php
    if( isset( $_POST['points'] ) ){
        $points = $_POST['points'];

        // Do here SQL query or whatever you want
    }
?>

希望对你有所帮助。

如果我理解正确的话,你想在一个 Phaser.State 中引用另一个 Phaser.State 中的 variable/member。 所以你有 PlayState 和一个变量 coinPickupCount,还有一个 LoadState 和函数 score。 我不明白为什么在加载状态下会有用户交互,因为通常它只是用于加载levels/assets等。 所以对我来说,将该按钮放在 PlayState.

中更合乎逻辑。

但是无论如何,你不能引用声明中的变量,因为它还没有被实例化。因此,我认为您必须通过 game 对象引用它,而不是将其作为变量传递,如下所示:

LoadState.create = function () {
    this.add.button(50, 200, 'grass:1x1', score(), this);
}

score = function () {
    var sc = game.state.states['PlayState'].coinPickupCount;
    sc = sc + 1;
    return sc;
}